Mercurial > cpython-lru_cache-weakref
annotate Modules/_csv.c @ 66978:aed2bbafa550 3.1
Blocked revisions 87324 via svnmerge
........
r87324 | r.david.murray | 2010-12-16 14:08:51 -0500 (Thu, 16 Dec 2010) | 9 lines
#10719: restore messages generated on invalid compileall args
Before the introduction of filename arguments to compileall it gave semi useful
messages about not being able to 'list' names that weren't valid directories.
This fix restores that behavior. In addition to the test for this case, the
patch also adds a test for the default behavior of compileall when no arguments
are provided, and fixes a bug in one of the previously added tests.
........
| author | R. David Murray <rdmurray@bitdance.com> |
|---|---|
| date | Thu, 16 Dec 2010 19:10:16 +0000 |
| parents | d158808dbd5a |
| children | 94d0ccb63b46 |
| rev | line source |
|---|---|
|
28393
16aa72a8c281
add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents:
28349
diff
changeset
|
1 /* csv module */ |
|
16aa72a8c281
add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents:
28349
diff
changeset
|
2 |
|
16aa72a8c281
add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents:
28349
diff
changeset
|
3 /* |
|
16aa72a8c281
add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents:
28349
diff
changeset
|
4 |
|
16aa72a8c281
add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents:
28349
diff
changeset
|
5 This module provides the low-level underpinnings of a CSV reading/writing |
|
16aa72a8c281
add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents:
28349
diff
changeset
|
6 module. Users should not use this module directly, but import the csv.py |
|
16aa72a8c281
add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents:
28349
diff
changeset
|
7 module instead. |
|
16aa72a8c281
add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents:
28349
diff
changeset
|
8 |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
9 */ |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
10 |
|
28592
ef05f981bc4b
use PyModule_Add{Int,String}Constant() where appropriate
Skip Montanaro <skip@pobox.com>
parents:
28591
diff
changeset
|
11 #define MODULE_VERSION "1.0" |
|
ef05f981bc4b
use PyModule_Add{Int,String}Constant() where appropriate
Skip Montanaro <skip@pobox.com>
parents:
28591
diff
changeset
|
12 |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
13 #include "Python.h" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
14 #include "structmember.h" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
15 |
|
34385
3533e3cb7b97
Where a string is desired, test for PyBaseString_Type derived type,
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34381
diff
changeset
|
16 #define IS_BASESTRING(o) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
17 PyUnicode_Check(o) |
|
34385
3533e3cb7b97
Where a string is desired, test for PyBaseString_Type derived type,
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34381
diff
changeset
|
18 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
19 static PyObject *error_obj; /* CSV exception */ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
20 static PyObject *dialects; /* Dialect registry */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
21 static long field_limit = 128 * 1024; /* max parsed field size */ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
22 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
23 typedef enum { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
24 START_RECORD, START_FIELD, ESCAPED_CHAR, IN_FIELD, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
25 IN_QUOTED_FIELD, ESCAPE_IN_QUOTED_FIELD, QUOTE_IN_QUOTED_FIELD, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
26 EAT_CRNL |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
27 } ParserState; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
28 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
29 typedef enum { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
30 QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
31 } QuoteStyle; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
32 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
33 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
34 QuoteStyle style; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
35 char *name; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
36 } StyleDesc; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
37 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
38 static StyleDesc quote_styles[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
39 { QUOTE_MINIMAL, "QUOTE_MINIMAL" }, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
40 { QUOTE_ALL, "QUOTE_ALL" }, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
41 { QUOTE_NONNUMERIC, "QUOTE_NONNUMERIC" }, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
42 { QUOTE_NONE, "QUOTE_NONE" }, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
43 { 0 } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
44 }; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
45 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
46 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
47 PyObject_HEAD |
|
42462
8b45f2297dbd
SF patch# 1767398 by Adam Hupp.
Guido van Rossum <guido@python.org>
parents:
42455
diff
changeset
|
48 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
49 int doublequote; /* is " represented by ""? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
50 Py_UNICODE delimiter; /* field separator */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
51 Py_UNICODE quotechar; /* quote character */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
52 Py_UNICODE escapechar; /* escape character */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
53 int skipinitialspace; /* ignore spaces following delimiter? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
54 PyObject *lineterminator; /* string to write between records */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
55 int quoting; /* style of quoting to write */ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
56 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
57 int strict; /* raise exception on bad CSV */ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
58 } DialectObj; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
59 |
|
37144
91dd4d44d3bc
Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents:
36684
diff
changeset
|
60 static PyTypeObject Dialect_Type; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
61 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
62 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
63 PyObject_HEAD |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
64 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
65 PyObject *input_iter; /* iterate over this for input lines */ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
66 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
67 DialectObj *dialect; /* parsing dialect */ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
68 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
69 PyObject *fields; /* field list for current record */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
70 ParserState state; /* current CSV parse state */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
71 Py_UNICODE *field; /* build current field in here */ |
|
64049
d158808dbd5a
Merged revisions 84078 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
72 Py_ssize_t field_size; /* size of allocated buffer */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
73 Py_ssize_t field_len; /* length of current field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
74 int numeric_field; /* treat field as numeric */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
75 unsigned long line_num; /* Source-file line number */ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
76 } ReaderObj; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
77 |
|
37144
91dd4d44d3bc
Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents:
36684
diff
changeset
|
78 static PyTypeObject Reader_Type; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
79 |
|
44351
86a2679dca46
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents:
44158
diff
changeset
|
80 #define ReaderObject_Check(v) (Py_TYPE(v) == &Reader_Type) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
81 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
82 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
83 PyObject_HEAD |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
84 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
85 PyObject *writeline; /* write output lines to this file */ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
86 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
87 DialectObj *dialect; /* parsing dialect */ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
88 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
89 Py_UNICODE *rec; /* buffer for parser.join */ |
|
64049
d158808dbd5a
Merged revisions 84078 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
90 Py_ssize_t rec_size; /* size of allocated record */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
91 Py_ssize_t rec_len; /* length of record */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
92 int num_fields; /* number of fields in record */ |
|
42462
8b45f2297dbd
SF patch# 1767398 by Adam Hupp.
Guido van Rossum <guido@python.org>
parents:
42455
diff
changeset
|
93 } WriterObj; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
94 |
|
37144
91dd4d44d3bc
Finish getting rid of statichere/staticforward
Neal Norwitz <nnorwitz@gmail.com>
parents:
36684
diff
changeset
|
95 static PyTypeObject Writer_Type; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
96 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
97 /* |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
98 * DIALECT class |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
99 */ |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
100 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
101 static PyObject * |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
102 get_dialect_from_registry(PyObject * name_obj) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
103 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
104 PyObject *dialect_obj; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
105 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
106 dialect_obj = PyDict_GetItem(dialects, name_obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
107 if (dialect_obj == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
108 if (!PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
109 PyErr_Format(error_obj, "unknown dialect"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
110 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
111 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
112 Py_INCREF(dialect_obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
113 return dialect_obj; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
114 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
115 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
116 static PyObject * |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
117 get_string(PyObject *str) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
118 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
119 Py_XINCREF(str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
120 return str; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
121 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
122 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
123 static PyObject * |
|
42463
b10ba38e6b80
One char->Py_UNICODE change missed in r56777 - according to Adam Hupp this is the change to make...
Skip Montanaro <skip@pobox.com>
parents:
42462
diff
changeset
|
124 get_nullchar_as_None(Py_UNICODE c) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
125 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
126 if (c == '\0') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
127 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
128 return Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
129 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
130 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
131 return PyUnicode_FromUnicode((Py_UNICODE *)&c, 1); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
132 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
133 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
134 static PyObject * |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
135 Dialect_get_lineterminator(DialectObj *self) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
136 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
137 return get_string(self->lineterminator); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
138 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
139 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
140 static PyObject * |
|
42486
3f1fcd080ec4
Fix the last remaining test_csv failure.
Guido van Rossum <guido@python.org>
parents:
42463
diff
changeset
|
141 Dialect_get_delimiter(DialectObj *self) |
|
3f1fcd080ec4
Fix the last remaining test_csv failure.
Guido van Rossum <guido@python.org>
parents:
42463
diff
changeset
|
142 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
143 return get_nullchar_as_None(self->delimiter); |
|
42486
3f1fcd080ec4
Fix the last remaining test_csv failure.
Guido van Rossum <guido@python.org>
parents:
42463
diff
changeset
|
144 } |
|
3f1fcd080ec4
Fix the last remaining test_csv failure.
Guido van Rossum <guido@python.org>
parents:
42463
diff
changeset
|
145 |
|
3f1fcd080ec4
Fix the last remaining test_csv failure.
Guido van Rossum <guido@python.org>
parents:
42463
diff
changeset
|
146 static PyObject * |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
147 Dialect_get_escapechar(DialectObj *self) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
148 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
149 return get_nullchar_as_None(self->escapechar); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
150 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
151 |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
152 static PyObject * |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
153 Dialect_get_quotechar(DialectObj *self) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
154 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
155 return get_nullchar_as_None(self->quotechar); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
156 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
157 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
158 static PyObject * |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
159 Dialect_get_quoting(DialectObj *self) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
160 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
161 return PyLong_FromLong(self->quoting); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
162 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
163 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
164 static int |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
165 _set_bool(const char *name, int *target, PyObject *src, int dflt) |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
166 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
167 if (src == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
168 *target = dflt; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
169 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
170 *target = PyObject_IsTrue(src); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
171 return 0; |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
172 } |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
173 |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
174 static int |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
175 _set_int(const char *name, int *target, PyObject *src, int dflt) |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
176 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
177 if (src == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
178 *target = dflt; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
179 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
180 long value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
181 if (!PyLong_CheckExact(src)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
182 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
183 "\"%s\" must be an integer", name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
184 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
185 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
186 value = PyLong_AsLong(src); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
187 if (value == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
188 return -1; |
|
44158
81e0c0e2a8c1
Remove PyInt_CheckExact. Add PyLong_AsLongAndOverflow.
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
189 #if SIZEOF_LONG > SIZEOF_INT |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
190 if (value > INT_MAX || value < INT_MIN) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
191 PyErr_Format(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
192 "integer out of range for \"%s\"", name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
193 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
194 } |
|
44158
81e0c0e2a8c1
Remove PyInt_CheckExact. Add PyLong_AsLongAndOverflow.
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
195 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
196 *target = (int)value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
197 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
198 return 0; |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
199 } |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
200 |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
201 static int |
|
42462
8b45f2297dbd
SF patch# 1767398 by Adam Hupp.
Guido van Rossum <guido@python.org>
parents:
42455
diff
changeset
|
202 _set_char(const char *name, Py_UNICODE *target, PyObject *src, Py_UNICODE dflt) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
203 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
204 if (src == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
205 *target = dflt; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
206 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
207 *target = '\0'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
208 if (src != Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
209 Py_UNICODE *buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
210 Py_ssize_t len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
211 buf = PyUnicode_AsUnicode(src); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
212 len = PyUnicode_GetSize(src); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
213 if (buf == NULL || len > 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
214 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
215 "\"%s\" must be an 1-character string", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
216 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
217 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
218 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
219 if (len > 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
220 *target = buf[0]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
221 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
222 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
223 return 0; |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
224 } |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
225 |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
226 static int |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
227 _set_str(const char *name, PyObject **target, PyObject *src, const char *dflt) |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
228 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
229 if (src == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
230 *target = PyUnicode_DecodeASCII(dflt, strlen(dflt), NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
231 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
232 if (src == Py_None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
233 *target = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
234 else if (!IS_BASESTRING(src)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
235 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
236 "\"%s\" must be a string", name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
237 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
238 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
239 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
240 Py_XDECREF(*target); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
241 Py_INCREF(src); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
242 *target = src; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
243 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
244 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
245 return 0; |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
246 } |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
247 |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
248 static int |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
249 dialect_check_quoting(int quoting) |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
250 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
251 StyleDesc *qs = quote_styles; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
252 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
253 for (qs = quote_styles; qs->name; qs++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
254 if (qs->style == quoting) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
255 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
256 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
257 PyErr_Format(PyExc_TypeError, "bad \"quoting\" value"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
258 return -1; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
259 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
260 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
261 #define D_OFF(x) offsetof(DialectObj, x) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
262 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
263 static struct PyMemberDef Dialect_memberlist[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
264 { "skipinitialspace", T_INT, D_OFF(skipinitialspace), READONLY }, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
265 { "doublequote", T_INT, D_OFF(doublequote), READONLY }, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
266 { "strict", T_INT, D_OFF(strict), READONLY }, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
267 { NULL } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
268 }; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
269 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
270 static PyGetSetDef Dialect_getsetlist[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
271 { "delimiter", (getter)Dialect_get_delimiter}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
272 { "escapechar", (getter)Dialect_get_escapechar}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
273 { "lineterminator", (getter)Dialect_get_lineterminator}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
274 { "quotechar", (getter)Dialect_get_quotechar}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
275 { "quoting", (getter)Dialect_get_quoting}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
276 {NULL}, |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
277 }; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
278 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
279 static void |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
280 Dialect_dealloc(DialectObj *self) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
281 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
282 Py_XDECREF(self->lineterminator); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
283 Py_TYPE(self)->tp_free((PyObject *)self); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
284 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
285 |
| 36684 | 286 static char *dialect_kws[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
287 "dialect", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
288 "delimiter", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
289 "doublequote", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
290 "escapechar", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
291 "lineterminator", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
292 "quotechar", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
293 "quoting", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
294 "skipinitialspace", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
295 "strict", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
296 NULL |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
297 }; |
|
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
298 |
|
34395
6c02bb3fcca6
Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34392
diff
changeset
|
299 static PyObject * |
|
6c02bb3fcca6
Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34392
diff
changeset
|
300 dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
301 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
302 DialectObj *self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
303 PyObject *ret = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
304 PyObject *dialect = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
305 PyObject *delimiter = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
306 PyObject *doublequote = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
307 PyObject *escapechar = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
308 PyObject *lineterminator = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
309 PyObject *quotechar = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
310 PyObject *quoting = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
311 PyObject *skipinitialspace = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
312 PyObject *strict = NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
313 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
314 if (!PyArg_ParseTupleAndKeywords(args, kwargs, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
315 "|OOOOOOOOO", dialect_kws, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
316 &dialect, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
317 &delimiter, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
318 &doublequote, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
319 &escapechar, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
320 &lineterminator, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
321 "echar, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
322 "ing, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
323 &skipinitialspace, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
324 &strict)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
325 return NULL; |
|
34395
6c02bb3fcca6
Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34392
diff
changeset
|
326 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
327 if (dialect != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
328 if (IS_BASESTRING(dialect)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
329 dialect = get_dialect_from_registry(dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
330 if (dialect == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
331 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
332 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
333 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
334 Py_INCREF(dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
335 /* Can we reuse this instance? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
336 if (PyObject_TypeCheck(dialect, &Dialect_Type) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
337 delimiter == 0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
338 doublequote == 0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
339 escapechar == 0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
340 lineterminator == 0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
341 quotechar == 0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
342 quoting == 0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
343 skipinitialspace == 0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
344 strict == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
345 return dialect; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
346 } |
|
34395
6c02bb3fcca6
Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34392
diff
changeset
|
347 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
348 self = (DialectObj *)type->tp_alloc(type, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
349 if (self == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
350 Py_XDECREF(dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
351 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
352 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
353 self->lineterminator = NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
354 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
355 Py_XINCREF(delimiter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
356 Py_XINCREF(doublequote); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
357 Py_XINCREF(escapechar); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
358 Py_XINCREF(lineterminator); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
359 Py_XINCREF(quotechar); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
360 Py_XINCREF(quoting); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
361 Py_XINCREF(skipinitialspace); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
362 Py_XINCREF(strict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
363 if (dialect != NULL) { |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
364 #define DIALECT_GETATTR(v, n) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
365 if (v == NULL) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
366 v = PyObject_GetAttrString(dialect, n) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
367 DIALECT_GETATTR(delimiter, "delimiter"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
368 DIALECT_GETATTR(doublequote, "doublequote"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
369 DIALECT_GETATTR(escapechar, "escapechar"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
370 DIALECT_GETATTR(lineterminator, "lineterminator"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
371 DIALECT_GETATTR(quotechar, "quotechar"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
372 DIALECT_GETATTR(quoting, "quoting"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
373 DIALECT_GETATTR(skipinitialspace, "skipinitialspace"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
374 DIALECT_GETATTR(strict, "strict"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
375 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
376 } |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
377 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
378 /* check types and convert to C values */ |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
379 #define DIASET(meth, name, target, src, dflt) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
380 if (meth(name, target, src, dflt)) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
381 goto err |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
382 DIASET(_set_char, "delimiter", &self->delimiter, delimiter, ','); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
383 DIASET(_set_bool, "doublequote", &self->doublequote, doublequote, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
384 DIASET(_set_char, "escapechar", &self->escapechar, escapechar, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
385 DIASET(_set_str, "lineterminator", &self->lineterminator, lineterminator, "\r\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
386 DIASET(_set_char, "quotechar", &self->quotechar, quotechar, '"'); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
387 DIASET(_set_int, "quoting", &self->quoting, quoting, QUOTE_MINIMAL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
388 DIASET(_set_bool, "skipinitialspace", &self->skipinitialspace, skipinitialspace, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
389 DIASET(_set_bool, "strict", &self->strict, strict, 0); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
390 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
391 /* validate options */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
392 if (dialect_check_quoting(self->quoting)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
393 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
394 if (self->delimiter == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
395 PyErr_SetString(PyExc_TypeError, "delimiter must be set"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
396 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
397 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
398 if (quotechar == Py_None && quoting == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
399 self->quoting = QUOTE_NONE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
400 if (self->quoting != QUOTE_NONE && self->quotechar == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
401 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
402 "quotechar must be set if quoting enabled"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
403 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
404 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
405 if (self->lineterminator == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
406 PyErr_SetString(PyExc_TypeError, "lineterminator must be set"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
407 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
408 } |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
409 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
410 ret = (PyObject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
411 Py_INCREF(self); |
|
34340
be4929e5179b
Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34331
diff
changeset
|
412 err: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
413 Py_XDECREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
414 Py_XDECREF(dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
415 Py_XDECREF(delimiter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
416 Py_XDECREF(doublequote); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
417 Py_XDECREF(escapechar); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
418 Py_XDECREF(lineterminator); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
419 Py_XDECREF(quotechar); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
420 Py_XDECREF(quoting); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
421 Py_XDECREF(skipinitialspace); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
422 Py_XDECREF(strict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
423 return ret; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
424 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
425 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
426 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
427 PyDoc_STRVAR(Dialect_Type_doc, |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
428 "CSV dialect\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
429 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
430 "The Dialect type records CSV parsing and generation options.\n"); |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
431 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
432 static PyTypeObject Dialect_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
433 PyVarObject_HEAD_INIT(NULL, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
434 "_csv.Dialect", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
435 sizeof(DialectObj), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
436 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
437 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
438 (destructor)Dialect_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
439 (printfunc)0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
440 (getattrfunc)0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
441 (setattrfunc)0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
442 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
443 (reprfunc)0, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
444 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
445 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
446 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
447 (hashfunc)0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
448 (ternaryfunc)0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
449 (reprfunc)0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
450 0, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
451 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
452 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
453 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
454 Dialect_Type_doc, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
455 0, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
456 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
457 0, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
458 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
459 0, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
460 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
461 0, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
462 Dialect_memberlist, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
463 Dialect_getsetlist, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
464 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
465 0, /* tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
466 0, /* tp_descr_get */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
467 0, /* tp_descr_set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
468 0, /* tp_dictoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
469 0, /* tp_init */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
470 0, /* tp_alloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
471 dialect_new, /* tp_new */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
472 0, /* tp_free */ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
473 }; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
474 |
|
34390
28f84938468d
Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34389
diff
changeset
|
475 /* |
|
28f84938468d
Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34389
diff
changeset
|
476 * Return an instance of the dialect type, given a Python instance or kwarg |
|
28f84938468d
Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34389
diff
changeset
|
477 * description of the dialect |
|
28f84938468d
Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34389
diff
changeset
|
478 */ |
|
28f84938468d
Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34389
diff
changeset
|
479 static PyObject * |
|
28f84938468d
Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34389
diff
changeset
|
480 _call_dialect(PyObject *dialect_inst, PyObject *kwargs) |
|
28f84938468d
Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34389
diff
changeset
|
481 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
482 PyObject *ctor_args; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
483 PyObject *dialect; |
|
34390
28f84938468d
Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34389
diff
changeset
|
484 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
485 ctor_args = Py_BuildValue(dialect_inst ? "(O)" : "()", dialect_inst); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
486 if (ctor_args == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
487 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
488 dialect = PyObject_Call((PyObject *)&Dialect_Type, ctor_args, kwargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
489 Py_DECREF(ctor_args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
490 return dialect; |
|
34390
28f84938468d
Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34389
diff
changeset
|
491 } |
|
28f84938468d
Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34389
diff
changeset
|
492 |
|
34418
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
493 /* |
|
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
494 * READER |
|
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
495 */ |
|
34409
1d866c02a8ca
When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34408
diff
changeset
|
496 static int |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
497 parse_save_field(ReaderObj *self) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
498 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
499 PyObject *field; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
500 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
501 field = PyUnicode_FromUnicode(self->field, self->field_len); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
502 if (field == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
503 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
504 self->field_len = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
505 if (self->numeric_field) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
506 PyObject *tmp; |
|
34409
1d866c02a8ca
When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34408
diff
changeset
|
507 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
508 self->numeric_field = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
509 tmp = PyNumber_Float(field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
510 if (tmp == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
511 Py_DECREF(field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
512 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
513 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
514 Py_DECREF(field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
515 field = tmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
516 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
517 PyList_Append(self->fields, field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
518 Py_DECREF(field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
519 return 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
520 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
521 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
522 static int |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
523 parse_grow_buff(ReaderObj *self) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
524 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
525 if (self->field_size == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
526 self->field_size = 4096; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
527 if (self->field != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
528 PyMem_Free(self->field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
529 self->field = PyMem_New(Py_UNICODE, self->field_size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
530 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
531 else { |
|
64049
d158808dbd5a
Merged revisions 84078 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
532 if (self->field_size > PY_SSIZE_T_MAX / 2) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
533 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
534 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
535 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
536 self->field_size *= 2; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
537 self->field = PyMem_Resize(self->field, Py_UNICODE, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
538 self->field_size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
539 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
540 if (self->field == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
541 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
542 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
543 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
544 return 1; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
545 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
546 |
|
34396
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
547 static int |
|
42462
8b45f2297dbd
SF patch# 1767398 by Adam Hupp.
Guido van Rossum <guido@python.org>
parents:
42455
diff
changeset
|
548 parse_add_char(ReaderObj *self, Py_UNICODE c) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
549 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
550 if (self->field_len >= field_limit) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
551 PyErr_Format(error_obj, "field larger than field limit (%ld)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
552 field_limit); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
553 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
554 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
555 if (self->field_len == self->field_size && !parse_grow_buff(self)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
556 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
557 self->field[self->field_len++] = c; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
558 return 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
559 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
560 |
|
34396
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
561 static int |
|
42462
8b45f2297dbd
SF patch# 1767398 by Adam Hupp.
Guido van Rossum <guido@python.org>
parents:
42455
diff
changeset
|
562 parse_process_char(ReaderObj *self, Py_UNICODE c) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
563 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
564 DialectObj *dialect = self->dialect; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
565 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
566 switch (self->state) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
567 case START_RECORD: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
568 /* start of record */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
569 if (c == '\0') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
570 /* empty line - return [] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
571 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
572 else if (c == '\n' || c == '\r') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
573 self->state = EAT_CRNL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
574 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
575 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
576 /* normal character - handle as START_FIELD */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
577 self->state = START_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
578 /* fallthru */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
579 case START_FIELD: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
580 /* expecting field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
581 if (c == '\n' || c == '\r' || c == '\0') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
582 /* save empty field - return [fields] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
583 if (parse_save_field(self) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
584 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
585 self->state = (c == '\0' ? START_RECORD : EAT_CRNL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
586 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
587 else if (c == dialect->quotechar && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
588 dialect->quoting != QUOTE_NONE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
589 /* start quoted field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
590 self->state = IN_QUOTED_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
591 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
592 else if (c == dialect->escapechar) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
593 /* possible escaped character */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
594 self->state = ESCAPED_CHAR; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
595 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
596 else if (c == ' ' && dialect->skipinitialspace) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
597 /* ignore space at start of field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
598 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
599 else if (c == dialect->delimiter) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
600 /* save empty field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
601 if (parse_save_field(self) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
602 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
603 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
604 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
605 /* begin new unquoted field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
606 if (dialect->quoting == QUOTE_NONNUMERIC) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
607 self->numeric_field = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
608 if (parse_add_char(self, c) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
609 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
610 self->state = IN_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
611 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
612 break; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
613 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
614 case ESCAPED_CHAR: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
615 if (c == '\0') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
616 c = '\n'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
617 if (parse_add_char(self, c) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
618 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
619 self->state = IN_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
620 break; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
621 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
622 case IN_FIELD: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
623 /* in unquoted field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
624 if (c == '\n' || c == '\r' || c == '\0') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
625 /* end of line - return [fields] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
626 if (parse_save_field(self) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
627 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
628 self->state = (c == '\0' ? START_RECORD : EAT_CRNL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
629 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
630 else if (c == dialect->escapechar) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
631 /* possible escaped character */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
632 self->state = ESCAPED_CHAR; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
633 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
634 else if (c == dialect->delimiter) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
635 /* save field - wait for new field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
636 if (parse_save_field(self) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
637 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
638 self->state = START_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
639 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
640 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
641 /* normal character - save in field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
642 if (parse_add_char(self, c) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
643 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
644 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
645 break; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
646 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
647 case IN_QUOTED_FIELD: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
648 /* in quoted field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
649 if (c == '\0') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
650 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
651 else if (c == dialect->escapechar) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
652 /* Possible escape character */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
653 self->state = ESCAPE_IN_QUOTED_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
654 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
655 else if (c == dialect->quotechar && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
656 dialect->quoting != QUOTE_NONE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
657 if (dialect->doublequote) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
658 /* doublequote; " represented by "" */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
659 self->state = QUOTE_IN_QUOTED_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
660 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
661 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
662 /* end of quote part of field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
663 self->state = IN_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
664 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
665 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
666 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
667 /* normal character - save in field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
668 if (parse_add_char(self, c) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
669 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
670 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
671 break; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
672 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
673 case ESCAPE_IN_QUOTED_FIELD: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
674 if (c == '\0') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
675 c = '\n'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
676 if (parse_add_char(self, c) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
677 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
678 self->state = IN_QUOTED_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
679 break; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
680 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
681 case QUOTE_IN_QUOTED_FIELD: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
682 /* doublequote - seen a quote in an quoted field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
683 if (dialect->quoting != QUOTE_NONE && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
684 c == dialect->quotechar) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
685 /* save "" as " */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
686 if (parse_add_char(self, c) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
687 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
688 self->state = IN_QUOTED_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
689 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
690 else if (c == dialect->delimiter) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
691 /* save field - wait for new field */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
692 if (parse_save_field(self) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
693 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
694 self->state = START_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
695 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
696 else if (c == '\n' || c == '\r' || c == '\0') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
697 /* end of line - return [fields] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
698 if (parse_save_field(self) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
699 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
700 self->state = (c == '\0' ? START_RECORD : EAT_CRNL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
701 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
702 else if (!dialect->strict) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
703 if (parse_add_char(self, c) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
704 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
705 self->state = IN_FIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
706 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
707 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
708 /* illegal */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
709 PyErr_Format(error_obj, "'%c' expected after '%c'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
710 dialect->delimiter, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
711 dialect->quotechar); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
712 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
713 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
714 break; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
715 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
716 case EAT_CRNL: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
717 if (c == '\n' || c == '\r') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
718 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
719 else if (c == '\0') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
720 self->state = START_RECORD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
721 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
722 PyErr_Format(error_obj, "new-line character seen in unquoted field - do you need to open the file in universal-newline mode?"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
723 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
724 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
725 break; |
|
34418
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
726 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
727 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
728 return 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
729 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
730 |
|
34418
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
731 static int |
|
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
732 parse_reset(ReaderObj *self) |
|
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
733 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
734 Py_XDECREF(self->fields); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
735 self->fields = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
736 if (self->fields == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
737 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
738 self->field_len = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
739 self->state = START_RECORD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
740 self->numeric_field = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
741 return 0; |
|
34418
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
742 } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
743 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
744 static PyObject * |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
745 Reader_iternext(ReaderObj *self) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
746 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
747 PyObject *lineobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
748 PyObject *fields = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
749 Py_UNICODE *line, c; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
750 Py_ssize_t linelen; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
751 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
752 if (parse_reset(self) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
753 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
754 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
755 lineobj = PyIter_Next(self->input_iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
756 if (lineobj == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
757 /* End of input OR exception */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
758 if (!PyErr_Occurred() && self->field_len != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
759 PyErr_Format(error_obj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
760 "newline inside string"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
761 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
762 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
763 if (!PyUnicode_Check(lineobj)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
764 PyErr_Format(error_obj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
765 "iterator should return strings, " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
766 "not %.200s " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
767 "(did you open the file in text mode?)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
768 lineobj->ob_type->tp_name |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
769 ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
770 Py_DECREF(lineobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
771 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
772 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
773 ++self->line_num; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
774 line = PyUnicode_AsUnicode(lineobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
775 linelen = PyUnicode_GetSize(lineobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
776 if (line == NULL || linelen < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
777 Py_DECREF(lineobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
778 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
779 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
780 while (linelen--) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
781 c = *line++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
782 if (c == '\0') { |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
783 Py_DECREF(lineobj); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
784 PyErr_Format(error_obj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
785 "line contains NULL byte"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
786 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
787 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
788 if (parse_process_char(self, c) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
789 Py_DECREF(lineobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
790 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
791 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
792 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
793 Py_DECREF(lineobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
794 if (parse_process_char(self, 0) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
795 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
796 } while (self->state != START_RECORD); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
797 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
798 fields = self->fields; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
799 self->fields = NULL; |
|
34418
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
800 err: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
801 return fields; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
802 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
803 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
804 static void |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
805 Reader_dealloc(ReaderObj *self) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
806 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
807 PyObject_GC_UnTrack(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
808 Py_XDECREF(self->dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
809 Py_XDECREF(self->input_iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
810 Py_XDECREF(self->fields); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
811 if (self->field != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
812 PyMem_Free(self->field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
813 PyObject_GC_Del(self); |
|
28599
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
814 } |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
815 |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
816 static int |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
817 Reader_traverse(ReaderObj *self, visitproc visit, void *arg) |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
818 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
819 Py_VISIT(self->dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
820 Py_VISIT(self->input_iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
821 Py_VISIT(self->fields); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
822 return 0; |
|
28599
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
823 } |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
824 |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
825 static int |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
826 Reader_clear(ReaderObj *self) |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
827 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
828 Py_CLEAR(self->dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
829 Py_CLEAR(self->input_iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
830 Py_CLEAR(self->fields); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
831 return 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
832 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
833 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
834 PyDoc_STRVAR(Reader_Type_doc, |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
835 "CSV reader\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
836 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
837 "Reader objects are responsible for reading and parsing tabular data\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
838 "in CSV format.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
839 ); |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
840 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
841 static struct PyMethodDef Reader_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
842 { NULL, NULL } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
843 }; |
|
34418
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
844 #define R_OFF(x) offsetof(ReaderObj, x) |
|
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
845 |
|
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
846 static struct PyMemberDef Reader_memberlist[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
847 { "dialect", T_OBJECT, R_OFF(dialect), READONLY }, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
848 { "line_num", T_ULONG, R_OFF(line_num), READONLY }, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
849 { NULL } |
|
34418
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
850 }; |
|
fa65e3425a4c
Moved reader \r and \n processing from the iterator to the state machine -
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34411
diff
changeset
|
851 |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
852 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
853 static PyTypeObject Reader_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
854 PyVarObject_HEAD_INIT(NULL, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
855 "_csv.reader", /*tp_name*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
856 sizeof(ReaderObj), /*tp_basicsize*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
857 0, /*tp_itemsize*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
858 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
859 (destructor)Reader_dealloc, /*tp_dealloc*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
860 (printfunc)0, /*tp_print*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
861 (getattrfunc)0, /*tp_getattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
862 (setattrfunc)0, /*tp_setattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
863 0, /*tp_reserved*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
864 (reprfunc)0, /*tp_repr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
865 0, /*tp_as_number*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
866 0, /*tp_as_sequence*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
867 0, /*tp_as_mapping*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
868 (hashfunc)0, /*tp_hash*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
869 (ternaryfunc)0, /*tp_call*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
870 (reprfunc)0, /*tp_str*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
871 0, /*tp_getattro*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
872 0, /*tp_setattro*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
873 0, /*tp_as_buffer*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
874 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
875 Py_TPFLAGS_HAVE_GC, /*tp_flags*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
876 Reader_Type_doc, /*tp_doc*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
877 (traverseproc)Reader_traverse, /*tp_traverse*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
878 (inquiry)Reader_clear, /*tp_clear*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
879 0, /*tp_richcompare*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
880 0, /*tp_weaklistoffset*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
881 PyObject_SelfIter, /*tp_iter*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
882 (getiterfunc)Reader_iternext, /*tp_iternext*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
883 Reader_methods, /*tp_methods*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
884 Reader_memberlist, /*tp_members*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
885 0, /*tp_getset*/ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
886 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
887 }; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
888 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
889 static PyObject * |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
890 csv_reader(PyObject *module, PyObject *args, PyObject *keyword_args) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
891 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
892 PyObject * iterator, * dialect = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
893 ReaderObj * self = PyObject_GC_New(ReaderObj, &Reader_Type); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
894 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
895 if (!self) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
896 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
897 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
898 self->dialect = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
899 self->fields = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
900 self->input_iter = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
901 self->field = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
902 self->field_size = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
903 self->line_num = 0; |
|
34409
1d866c02a8ca
When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34408
diff
changeset
|
904 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
905 if (parse_reset(self) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
906 Py_DECREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
907 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
908 } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
909 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
910 if (!PyArg_UnpackTuple(args, "", 1, 2, &iterator, &dialect)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
911 Py_DECREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
912 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
913 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
914 self->input_iter = PyObject_GetIter(iterator); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
915 if (self->input_iter == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
916 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
917 "argument 1 must be an iterator"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
918 Py_DECREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
919 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
920 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
921 self->dialect = (DialectObj *)_call_dialect(dialect, keyword_args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
922 if (self->dialect == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
923 Py_DECREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
924 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
925 } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
926 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
927 PyObject_GC_Track(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
928 return (PyObject *)self; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
929 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
930 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
931 /* |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
932 * WRITER |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
933 */ |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
934 /* ---------------------------------------------------------------- */ |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
935 static void |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
936 join_reset(WriterObj *self) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
937 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
938 self->rec_len = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
939 self->num_fields = 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
940 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
941 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
942 #define MEM_INCR 32768 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
943 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
944 /* Calculate new record length or append field to record. Return new |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
945 * record length. |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
946 */ |
|
64049
d158808dbd5a
Merged revisions 84078 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
947 static Py_ssize_t |
|
42462
8b45f2297dbd
SF patch# 1767398 by Adam Hupp.
Guido van Rossum <guido@python.org>
parents:
42455
diff
changeset
|
948 join_append_data(WriterObj *self, Py_UNICODE *field, int quote_empty, |
|
8b45f2297dbd
SF patch# 1767398 by Adam Hupp.
Guido van Rossum <guido@python.org>
parents:
42455
diff
changeset
|
949 int *quoted, int copy_phase) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
950 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
951 DialectObj *dialect = self->dialect; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
952 int i; |
|
64049
d158808dbd5a
Merged revisions 84078 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
953 Py_ssize_t rec_len; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
954 Py_UNICODE *lineterm; |
|
34407
c88ab292bf05
When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34406
diff
changeset
|
955 |
|
c88ab292bf05
When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34406
diff
changeset
|
956 #define ADDCH(c) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
957 do {\ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
958 if (copy_phase) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
959 self->rec[rec_len] = c;\ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
960 rec_len++;\ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
961 } while(0) |
|
34407
c88ab292bf05
When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34406
diff
changeset
|
962 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
963 lineterm = PyUnicode_AsUnicode(dialect->lineterminator); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
964 if (lineterm == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
965 return -1; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
966 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
967 rec_len = self->rec_len; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
968 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
969 /* If this is not the first field we need a field separator */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
970 if (self->num_fields > 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
971 ADDCH(dialect->delimiter); |
|
34407
c88ab292bf05
When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34406
diff
changeset
|
972 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
973 /* Handle preceding quote */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
974 if (copy_phase && *quoted) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
975 ADDCH(dialect->quotechar); |
|
34407
c88ab292bf05
When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34406
diff
changeset
|
976 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
977 /* Copy/count field data */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
978 /* If field is null just pass over */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
979 for (i = 0; field; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
980 Py_UNICODE c = field[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
981 int want_escape = 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
982 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
983 if (c == '\0') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
984 break; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
985 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
986 if (c == dialect->delimiter || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
987 c == dialect->escapechar || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
988 c == dialect->quotechar || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
989 Py_UNICODE_strchr(lineterm, c)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
990 if (dialect->quoting == QUOTE_NONE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
991 want_escape = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
992 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
993 if (c == dialect->quotechar) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
994 if (dialect->doublequote) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
995 ADDCH(dialect->quotechar); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
996 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
997 want_escape = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
998 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
999 if (!want_escape) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1000 *quoted = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1001 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1002 if (want_escape) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1003 if (!dialect->escapechar) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1004 PyErr_Format(error_obj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1005 "need to escape, but no escapechar set"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1006 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1007 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1008 ADDCH(dialect->escapechar); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1009 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1010 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1011 /* Copy field character into record buffer. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1012 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1013 ADDCH(c); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1014 } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1015 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1016 /* If field is empty check if it needs to be quoted. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1017 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1018 if (i == 0 && quote_empty) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1019 if (dialect->quoting == QUOTE_NONE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1020 PyErr_Format(error_obj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1021 "single empty field record must be quoted"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1022 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1023 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1024 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1025 *quoted = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1026 } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1027 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1028 if (*quoted) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1029 if (copy_phase) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1030 ADDCH(dialect->quotechar); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1031 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1032 rec_len += 2; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1033 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1034 return rec_len; |
|
34407
c88ab292bf05
When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34406
diff
changeset
|
1035 #undef ADDCH |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1036 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1037 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1038 static int |
|
64049
d158808dbd5a
Merged revisions 84078 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
1039 join_check_rec_size(WriterObj *self, Py_ssize_t rec_len) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1040 { |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47580
diff
changeset
|
1041 |
|
64049
d158808dbd5a
Merged revisions 84078 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
1042 if (rec_len < 0 || rec_len > PY_SSIZE_T_MAX - MEM_INCR) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1043 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1044 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1045 } |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47580
diff
changeset
|
1046 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1047 if (rec_len > self->rec_size) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1048 if (self->rec_size == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1049 self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1050 if (self->rec != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1051 PyMem_Free(self->rec); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1052 self->rec = PyMem_New(Py_UNICODE, self->rec_size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1053 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1054 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1055 Py_UNICODE* old_rec = self->rec; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1056 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1057 self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1058 self->rec = PyMem_Resize(self->rec, Py_UNICODE, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1059 self->rec_size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1060 if (self->rec == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1061 PyMem_Free(old_rec); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1062 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1063 if (self->rec == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1064 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1065 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1066 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1067 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1068 return 1; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1069 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1070 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1071 static int |
|
42462
8b45f2297dbd
SF patch# 1767398 by Adam Hupp.
Guido van Rossum <guido@python.org>
parents:
42455
diff
changeset
|
1072 join_append(WriterObj *self, Py_UNICODE *field, int *quoted, int quote_empty) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1073 { |
|
64049
d158808dbd5a
Merged revisions 84078 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
1074 Py_ssize_t rec_len; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1075 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1076 rec_len = join_append_data(self, field, quote_empty, quoted, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1077 if (rec_len < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1078 return 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1079 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1080 /* grow record buffer if necessary */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1081 if (!join_check_rec_size(self, rec_len)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1082 return 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1083 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1084 self->rec_len = join_append_data(self, field, quote_empty, quoted, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1085 self->num_fields++; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1086 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1087 return 1; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1088 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1089 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1090 static int |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1091 join_append_lineterminator(WriterObj *self) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1092 { |
|
64049
d158808dbd5a
Merged revisions 84078 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
1093 Py_ssize_t terminator_len; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1094 Py_UNICODE *terminator; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1095 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1096 terminator_len = PyUnicode_GetSize(self->dialect->lineterminator); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1097 if (terminator_len == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1098 return 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1099 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1100 /* grow record buffer if necessary */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1101 if (!join_check_rec_size(self, self->rec_len + terminator_len)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1102 return 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1103 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1104 terminator = PyUnicode_AsUnicode(self->dialect->lineterminator); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1105 if (terminator == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1106 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1107 memmove(self->rec + self->rec_len, terminator, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1108 sizeof(Py_UNICODE)*terminator_len); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1109 self->rec_len += terminator_len; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1110 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1111 return 1; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1112 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1113 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1114 PyDoc_STRVAR(csv_writerow_doc, |
| 28590 | 1115 "writerow(sequence)\n" |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1116 "\n" |
| 28590 | 1117 "Construct and write a CSV record from a sequence of fields. Non-string\n" |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1118 "elements will be converted to string."); |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1119 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1120 static PyObject * |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1121 csv_writerow(WriterObj *self, PyObject *seq) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1122 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1123 DialectObj *dialect = self->dialect; |
|
64049
d158808dbd5a
Merged revisions 84078 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
1124 Py_ssize_t len, i; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1125 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1126 if (!PySequence_Check(seq)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1127 return PyErr_Format(error_obj, "sequence expected"); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1128 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1129 len = PySequence_Length(seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1130 if (len < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1131 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1132 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1133 /* Join all fields in internal buffer. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1134 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1135 join_reset(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1136 for (i = 0; i < len; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1137 PyObject *field; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1138 int append_ok; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1139 int quoted; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1140 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1141 field = PySequence_GetItem(seq, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1142 if (field == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1143 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1144 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1145 switch (dialect->quoting) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1146 case QUOTE_NONNUMERIC: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1147 quoted = !PyNumber_Check(field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1148 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1149 case QUOTE_ALL: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1150 quoted = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1151 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1152 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1153 quoted = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1154 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1155 } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1156 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1157 if (PyUnicode_Check(field)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1158 append_ok = join_append(self, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1159 PyUnicode_AS_UNICODE(field), |
|
42462
8b45f2297dbd
SF patch# 1767398 by Adam Hupp.
Guido van Rossum <guido@python.org>
parents:
42455
diff
changeset
|
1160 "ed, len == 1); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1161 Py_DECREF(field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1162 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1163 else if (field == Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1164 append_ok = join_append(self, NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1165 "ed, len == 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1166 Py_DECREF(field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1167 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1168 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1169 PyObject *str; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1170 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1171 str = PyObject_Str(field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1172 Py_DECREF(field); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1173 if (str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1174 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1175 append_ok = join_append(self, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1176 PyUnicode_AS_UNICODE(str), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1177 "ed, len == 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1178 Py_DECREF(str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1179 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1180 if (!append_ok) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1181 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1182 } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1183 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1184 /* Add line terminator. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1185 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1186 if (!join_append_lineterminator(self)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1187 return 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1188 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1189 return PyObject_CallFunction(self->writeline, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1190 "(u#)", self->rec, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1191 self->rec_len); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1192 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1193 |
| 28590 | 1194 PyDoc_STRVAR(csv_writerows_doc, |
| 1195 "writerows(sequence of sequences)\n" | |
| 1196 "\n" | |
| 1197 "Construct and write a series of sequences to a csv file. Non-string\n" | |
| 1198 "elements will be converted to string."); | |
| 1199 | |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1200 static PyObject * |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1201 csv_writerows(WriterObj *self, PyObject *seqseq) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1202 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1203 PyObject *row_iter, *row_obj, *result; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1204 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1205 row_iter = PyObject_GetIter(seqseq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1206 if (row_iter == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1207 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1208 "writerows() argument must be iterable"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1209 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1210 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1211 while ((row_obj = PyIter_Next(row_iter))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1212 result = csv_writerow(self, row_obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1213 Py_DECREF(row_obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1214 if (!result) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1215 Py_DECREF(row_iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1216 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1217 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1218 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1219 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1220 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1221 Py_DECREF(row_iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1222 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1223 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1224 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1225 return Py_None; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1226 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1227 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1228 static struct PyMethodDef Writer_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1229 { "writerow", (PyCFunction)csv_writerow, METH_O, csv_writerow_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1230 { "writerows", (PyCFunction)csv_writerows, METH_O, csv_writerows_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1231 { NULL, NULL } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1232 }; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1233 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1234 #define W_OFF(x) offsetof(WriterObj, x) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1235 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1236 static struct PyMemberDef Writer_memberlist[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1237 { "dialect", T_OBJECT, W_OFF(dialect), READONLY }, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1238 { NULL } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1239 }; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1240 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1241 static void |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1242 Writer_dealloc(WriterObj *self) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1243 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1244 PyObject_GC_UnTrack(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1245 Py_XDECREF(self->dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1246 Py_XDECREF(self->writeline); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1247 if (self->rec != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1248 PyMem_Free(self->rec); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1249 PyObject_GC_Del(self); |
|
28599
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
1250 } |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
1251 |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
1252 static int |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
1253 Writer_traverse(WriterObj *self, visitproc visit, void *arg) |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
1254 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1255 Py_VISIT(self->dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1256 Py_VISIT(self->writeline); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1257 return 0; |
|
28599
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
1258 } |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
1259 |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
1260 static int |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
1261 Writer_clear(WriterObj *self) |
|
11660f4361f8
Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28594
diff
changeset
|
1262 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1263 Py_CLEAR(self->dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1264 Py_CLEAR(self->writeline); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1265 return 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1266 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1267 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1268 PyDoc_STRVAR(Writer_Type_doc, |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1269 "CSV writer\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1270 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1271 "Writer objects are responsible for generating tabular data\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1272 "in CSV format from sequence input.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1273 ); |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1274 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1275 static PyTypeObject Writer_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1276 PyVarObject_HEAD_INIT(NULL, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1277 "_csv.writer", /*tp_name*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1278 sizeof(WriterObj), /*tp_basicsize*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1279 0, /*tp_itemsize*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1280 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1281 (destructor)Writer_dealloc, /*tp_dealloc*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1282 (printfunc)0, /*tp_print*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1283 (getattrfunc)0, /*tp_getattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1284 (setattrfunc)0, /*tp_setattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1285 0, /*tp_reserved*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1286 (reprfunc)0, /*tp_repr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1287 0, /*tp_as_number*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1288 0, /*tp_as_sequence*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1289 0, /*tp_as_mapping*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1290 (hashfunc)0, /*tp_hash*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1291 (ternaryfunc)0, /*tp_call*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1292 (reprfunc)0, /*tp_str*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1293 0, /*tp_getattro*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1294 0, /*tp_setattro*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1295 0, /*tp_as_buffer*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1296 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1297 Py_TPFLAGS_HAVE_GC, /*tp_flags*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1298 Writer_Type_doc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1299 (traverseproc)Writer_traverse, /*tp_traverse*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1300 (inquiry)Writer_clear, /*tp_clear*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1301 0, /*tp_richcompare*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1302 0, /*tp_weaklistoffset*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1303 (getiterfunc)0, /*tp_iter*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1304 (getiterfunc)0, /*tp_iternext*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1305 Writer_methods, /*tp_methods*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1306 Writer_memberlist, /*tp_members*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1307 0, /*tp_getset*/ |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1308 }; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1309 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1310 static PyObject * |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1311 csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1312 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1313 PyObject * output_file, * dialect = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1314 WriterObj * self = PyObject_GC_New(WriterObj, &Writer_Type); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1315 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1316 if (!self) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1317 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1318 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1319 self->dialect = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1320 self->writeline = NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1321 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1322 self->rec = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1323 self->rec_size = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1324 self->rec_len = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1325 self->num_fields = 0; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1326 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1327 if (!PyArg_UnpackTuple(args, "", 1, 2, &output_file, &dialect)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1328 Py_DECREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1329 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1330 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1331 self->writeline = PyObject_GetAttrString(output_file, "write"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1332 if (self->writeline == NULL || !PyCallable_Check(self->writeline)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1333 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1334 "argument 1 must have a \"write\" method"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1335 Py_DECREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1336 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1337 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1338 self->dialect = (DialectObj *)_call_dialect(dialect, keyword_args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1339 if (self->dialect == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1340 Py_DECREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1341 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1342 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1343 PyObject_GC_Track(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1344 return (PyObject *)self; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1345 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1346 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1347 /* |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1348 * DIALECT REGISTRY |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1349 */ |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1350 static PyObject * |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1351 csv_list_dialects(PyObject *module, PyObject *args) |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1352 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1353 return PyDict_Keys(dialects); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1354 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1355 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1356 static PyObject * |
|
34391
0a1608a5eb05
Allow dialect-describing keywords to be supplied to register_dialect,
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34390
diff
changeset
|
1357 csv_register_dialect(PyObject *module, PyObject *args, PyObject *kwargs) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1358 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1359 PyObject *name_obj, *dialect_obj = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1360 PyObject *dialect; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1361 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1362 if (!PyArg_UnpackTuple(args, "", 1, 2, &name_obj, &dialect_obj)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1363 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1364 if (!IS_BASESTRING(name_obj)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1365 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1366 "dialect name must be a string or unicode"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1367 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1368 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1369 dialect = _call_dialect(dialect_obj, kwargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1370 if (dialect == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1371 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1372 if (PyDict_SetItem(dialects, name_obj, dialect) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1373 Py_DECREF(dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1374 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1375 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1376 Py_DECREF(dialect); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1377 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1378 return Py_None; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1379 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1380 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1381 static PyObject * |
| 28591 | 1382 csv_unregister_dialect(PyObject *module, PyObject *name_obj) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1383 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1384 if (PyDict_DelItem(dialects, name_obj) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1385 return PyErr_Format(error_obj, "unknown dialect"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1386 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1387 return Py_None; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1388 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1389 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1390 static PyObject * |
| 28591 | 1391 csv_get_dialect(PyObject *module, PyObject *name_obj) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1392 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1393 return get_dialect_from_registry(name_obj); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1394 } |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1395 |
|
34396
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
1396 static PyObject * |
|
34406
b93845ce4454
Rename csv.set_field_limit to csv.field_size_limit (since it both sets and
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34403
diff
changeset
|
1397 csv_field_size_limit(PyObject *module, PyObject *args) |
|
34396
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
1398 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1399 PyObject *new_limit = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1400 long old_limit = field_limit; |
|
34396
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
1401 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1402 if (!PyArg_UnpackTuple(args, "field_size_limit", 0, 1, &new_limit)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1403 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1404 if (new_limit != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1405 if (!PyLong_CheckExact(new_limit)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1406 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1407 "limit must be an integer"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1408 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1409 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1410 field_limit = PyLong_AsLong(new_limit); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1411 if (field_limit == -1 && PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1412 field_limit = old_limit; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1413 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1414 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1415 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1416 return PyLong_FromLong(old_limit); |
|
34396
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
1417 } |
|
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
1418 |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1419 /* |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1420 * MODULE |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1421 */ |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1422 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1423 PyDoc_STRVAR(csv_module_doc, |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1424 "CSV parsing and writing.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1425 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1426 "This module provides classes that assist in the reading and writing\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1427 "of Comma Separated Value (CSV) files, and implements the interface\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1428 "described by PEP 305. Although many CSV files are simple to parse,\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1429 "the format is not formally defined by a stable specification and\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1430 "is subtle enough that parsing lines of a CSV file with something\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1431 "like line.split(\",\") is bound to fail. The module supports three\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1432 "basic APIs: reading, writing, and registration of dialects.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1433 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1434 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1435 "DIALECT REGISTRATION:\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1436 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1437 "Readers and writers support a dialect argument, which is a convenient\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1438 "handle on a group of settings. When the dialect argument is a string,\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1439 "it identifies one of the dialects previously registered with the module.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1440 "If it is a class or instance, the attributes of the argument are used as\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1441 "the settings for the reader or writer:\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1442 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1443 " class excel:\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1444 " delimiter = ','\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1445 " quotechar = '\"'\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1446 " escapechar = None\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1447 " doublequote = True\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1448 " skipinitialspace = False\n" |
|
33134
fc1637fc4588
Quote \r\n correctly, remove random indentation (patch #1009384). Thanks
Johannes Gijsbers <jlg@dds.nl>
parents:
32389
diff
changeset
|
1449 " lineterminator = '\\r\\n'\n" |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1450 " quoting = QUOTE_MINIMAL\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1451 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1452 "SETTINGS:\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1453 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1454 " * quotechar - specifies a one-character string to use as the \n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1455 " quoting character. It defaults to '\"'.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1456 " * delimiter - specifies a one-character string to use as the \n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1457 " field separator. It defaults to ','.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1458 " * skipinitialspace - specifies how to interpret whitespace which\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1459 " immediately follows a delimiter. It defaults to False, which\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1460 " means that whitespace immediately following a delimiter is part\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1461 " of the following field.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1462 " * lineterminator - specifies the character sequence which should \n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1463 " terminate rows.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1464 " * quoting - controls when quotes should be generated by the writer.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1465 " It can take on any of the following module constants:\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1466 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1467 " csv.QUOTE_MINIMAL means only when required, for example, when a\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1468 " field contains either the quotechar or the delimiter\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1469 " csv.QUOTE_ALL means that quotes are always placed around fields.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1470 " csv.QUOTE_NONNUMERIC means that quotes are always placed around\n" |
| 31074 | 1471 " fields which do not parse as integers or floating point\n" |
| 1472 " numbers.\n" | |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1473 " csv.QUOTE_NONE means that quotes are never placed around fields.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1474 " * escapechar - specifies a one-character string used to escape \n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1475 " the delimiter when quoting is set to QUOTE_NONE.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1476 " * doublequote - controls the handling of quotes inside fields. When\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1477 " True, two consecutive quotes are interpreted as one during read,\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1478 " and when writing, each quote character embedded in the data is\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1479 " written as two quotes\n"); |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1480 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1481 PyDoc_STRVAR(csv_reader_doc, |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1482 " csv_reader = reader(iterable [, dialect='excel']\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1483 " [optional keyword args])\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1484 " for row in csv_reader:\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1485 " process(row)\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1486 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1487 "The \"iterable\" argument can be any object that returns a line\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1488 "of input for each iteration, such as a file object or a list. The\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1489 "optional \"dialect\" parameter is discussed below. The function\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1490 "also accepts optional keyword arguments which override settings\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1491 "provided by the dialect.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1492 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1493 "The returned object is an iterator. Each iteration returns a row\n" |
|
33134
fc1637fc4588
Quote \r\n correctly, remove random indentation (patch #1009384). Thanks
Johannes Gijsbers <jlg@dds.nl>
parents:
32389
diff
changeset
|
1494 "of the CSV file (which can span multiple input lines):\n"); |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1495 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1496 PyDoc_STRVAR(csv_writer_doc, |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1497 " csv_writer = csv.writer(fileobj [, dialect='excel']\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1498 " [optional keyword args])\n" |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37144
diff
changeset
|
1499 " for row in sequence:\n" |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1500 " csv_writer.writerow(row)\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1501 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1502 " [or]\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1503 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1504 " csv_writer = csv.writer(fileobj [, dialect='excel']\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1505 " [optional keyword args])\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1506 " csv_writer.writerows(rows)\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1507 "\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1508 "The \"fileobj\" argument can be any object that supports the file API.\n"); |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1509 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1510 PyDoc_STRVAR(csv_list_dialects_doc, |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1511 "Return a list of all know dialect names.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1512 " names = csv.list_dialects()"); |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1513 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1514 PyDoc_STRVAR(csv_get_dialect_doc, |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1515 "Return the dialect instance associated with name.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1516 " dialect = csv.get_dialect(name)"); |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1517 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1518 PyDoc_STRVAR(csv_register_dialect_doc, |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1519 "Create a mapping from a string name to a dialect class.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1520 " dialect = csv.register_dialect(name, dialect)"); |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1521 |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1522 PyDoc_STRVAR(csv_unregister_dialect_doc, |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1523 "Delete the name/dialect mapping associated with a string name.\n" |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1524 " csv.unregister_dialect(name)"); |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1525 |
|
34406
b93845ce4454
Rename csv.set_field_limit to csv.field_size_limit (since it both sets and
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34403
diff
changeset
|
1526 PyDoc_STRVAR(csv_field_size_limit_doc, |
|
34396
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
1527 "Sets an upper limit on parsed fields.\n" |
|
34406
b93845ce4454
Rename csv.set_field_limit to csv.field_size_limit (since it both sets and
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34403
diff
changeset
|
1528 " csv.field_size_limit([limit])\n" |
|
34396
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
1529 "\n" |
|
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
1530 "Returns old limit. If limit is not given, no new limit is set and\n" |
|
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
1531 "the old limit is returned"); |
|
7059fb8b9eb3
Set an upper limit on the size of the field buffer, raise an exception
Andrew McNamara <andrewm@object-craft.com.au>
parents:
34395
diff
changeset
|
1532 |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1533 static struct PyMethodDef csv_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1534 { "reader", (PyCFunction)csv_reader, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1535 METH_VARARGS | METH_KEYWORDS, csv_reader_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1536 { "writer", (PyCFunction)csv_writer, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1537 METH_VARARGS | METH_KEYWORDS, csv_writer_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1538 { "list_dialects", (PyCFunction)csv_list_dialects, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1539 METH_NOARGS, csv_list_dialects_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1540 { "register_dialect", (PyCFunction)csv_register_dialect, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1541 METH_VARARGS | METH_KEYWORDS, csv_register_dialect_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1542 { "unregister_dialect", (PyCFunction)csv_unregister_dialect, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1543 METH_O, csv_unregister_dialect_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1544 { "get_dialect", (PyCFunction)csv_get_dialect, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1545 METH_O, csv_get_dialect_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1546 { "field_size_limit", (PyCFunction)csv_field_size_limit, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1547 METH_VARARGS, csv_field_size_limit_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1548 { NULL, NULL } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1549 }; |
|
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1550 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
1551 |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
1552 static struct PyModuleDef _csvmodule = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1553 PyModuleDef_HEAD_INIT, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1554 "_csv", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1555 csv_module_doc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1556 -1, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1557 csv_methods, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1558 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1559 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1560 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1561 NULL |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
1562 }; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
1563 |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1564 PyMODINIT_FUNC |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
1565 PyInit__csv(void) |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1566 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1567 PyObject *module; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1568 StyleDesc *style; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1569 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1570 if (PyType_Ready(&Dialect_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1571 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1572 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1573 if (PyType_Ready(&Reader_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1574 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1575 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1576 if (PyType_Ready(&Writer_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1577 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1578 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1579 /* Create the module and add the functions */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1580 module = PyModule_Create(&_csvmodule); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1581 if (module == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1582 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1583 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1584 /* Add version to the module. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1585 if (PyModule_AddStringConstant(module, "__version__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1586 MODULE_VERSION) == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1587 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1588 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1589 /* Add _dialects dictionary */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1590 dialects = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1591 if (dialects == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1592 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1593 if (PyModule_AddObject(module, "_dialects", dialects)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1594 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1595 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1596 /* Add quote styles into dictionary */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1597 for (style = quote_styles; style->name; style++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1598 if (PyModule_AddIntConstant(module, style->name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1599 style->style) == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1600 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1601 } |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1602 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1603 /* Add the Dialect type */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1604 Py_INCREF(&Dialect_Type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1605 if (PyModule_AddObject(module, "Dialect", (PyObject *)&Dialect_Type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1606 return NULL; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1607 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1608 /* Add the CSV exception object to the module. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1609 error_obj = PyErr_NewException("_csv.Error", NULL, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1610 if (error_obj == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1611 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1612 PyModule_AddObject(module, "Error", error_obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
1613 return module; |
|
28339
cc35ed2b26a8
new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff
changeset
|
1614 } |
