annotate Modules/_csv.c @ 34845:cd2c044f699d legacy-trunk

Fix for rather inaccurately titled bug [ 1165306 ] Property access with decorator makes interpreter crash Don't allow the creation of unbound methods with NULL im_class, because attempting to call such crashes. Backport candidate.
author Michael W. Hudson <mwh@python.net>
date Wed, 30 Mar 2005 16:32:10 +0000
parents fa65e3425a4c
children 2b5186b595b1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
16aa72a8c281 add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents: 28349
diff changeset
9 **** For people modifying this code, please note that as of this writing
28588
Skip Montanaro <skip@pobox.com>
parents: 28585
diff changeset
10 **** (2003-03-23), it is intended that this code should work with Python
28393
16aa72a8c281 add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents: 28349
diff changeset
11 **** 2.2.
16aa72a8c281 add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents: 28349
diff changeset
12
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
13 */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
14
28592
ef05f981bc4b use PyModule_Add{Int,String}Constant() where appropriate
Skip Montanaro <skip@pobox.com>
parents: 28591
diff changeset
15 #define MODULE_VERSION "1.0"
ef05f981bc4b use PyModule_Add{Int,String}Constant() where appropriate
Skip Montanaro <skip@pobox.com>
parents: 28591
diff changeset
16
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
17 #include "Python.h"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
18 #include "structmember.h"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
19
28393
16aa72a8c281 add comment about 2.2 compatibility
Skip Montanaro <skip@pobox.com>
parents: 28349
diff changeset
20
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
21 /* begin 2.2 compatibility macros */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
22 #ifndef PyDoc_STRVAR
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
23 /* Define macros for inline documentation. */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
24 #define PyDoc_VAR(name) static char name[]
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
25 #define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
26 #ifdef WITH_DOC_STRINGS
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
27 #define PyDoc_STR(str) str
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
28 #else
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
29 #define PyDoc_STR(str) ""
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
30 #endif
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
31 #endif /* ifndef PyDoc_STRVAR */
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 #ifndef PyMODINIT_FUNC
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
34 # if defined(__cplusplus)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
35 # define PyMODINIT_FUNC extern "C" void
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
36 # else /* __cplusplus */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
37 # define PyMODINIT_FUNC void
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
38 # endif /* __cplusplus */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
39 #endif
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
40 /* end 2.2 compatibility macros */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
41
34385
3533e3cb7b97 Where a string is desired, test for PyBaseString_Type derived type,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34381
diff changeset
42 #define IS_BASESTRING(o) \
3533e3cb7b97 Where a string is desired, test for PyBaseString_Type derived type,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34381
diff changeset
43 PyObject_TypeCheck(o, &PyBaseString_Type)
3533e3cb7b97 Where a string is desired, test for PyBaseString_Type derived type,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34381
diff changeset
44
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
45 static PyObject *error_obj; /* CSV exception */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
46 static PyObject *dialects; /* Dialect registry */
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
47 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
48
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
49 typedef enum {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
50 START_RECORD, START_FIELD, ESCAPED_CHAR, IN_FIELD,
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
51 IN_QUOTED_FIELD, ESCAPE_IN_QUOTED_FIELD, QUOTE_IN_QUOTED_FIELD,
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
52 EAT_CRNL
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
53 } ParserState;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
54
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
55 typedef enum {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
56 QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
57 } QuoteStyle;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
58
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
59 typedef struct {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
60 QuoteStyle style;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
61 char *name;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
62 } StyleDesc;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
63
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
64 static StyleDesc quote_styles[] = {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
65 { QUOTE_MINIMAL, "QUOTE_MINIMAL" },
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
66 { QUOTE_ALL, "QUOTE_ALL" },
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
67 { QUOTE_NONNUMERIC, "QUOTE_NONNUMERIC" },
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
68 { QUOTE_NONE, "QUOTE_NONE" },
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
69 { 0 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
70 };
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
71
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
72 typedef struct {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
73 PyObject_HEAD
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
74
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
75 int doublequote; /* is " represented by ""? */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
76 char delimiter; /* field separator */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
77 char quotechar; /* quote character */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
78 char escapechar; /* escape character */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
79 int skipinitialspace; /* ignore spaces following delimiter? */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
80 PyObject *lineterminator; /* string to write between records */
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
81 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
82
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
83 int strict; /* raise exception on bad CSV */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
84 } DialectObj;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
85
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
86 staticforward PyTypeObject Dialect_Type;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
87
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
88 typedef struct {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
89 PyObject_HEAD
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
90
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
91 PyObject *input_iter; /* iterate over this for input lines */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
92
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
93 DialectObj *dialect; /* parsing dialect */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
94
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
95 PyObject *fields; /* field list for current record */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
96 ParserState state; /* current CSV parse state */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
97 char *field; /* build current field in here */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
98 int field_size; /* size of allocated buffer */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
99 int field_len; /* length of current field */
34409
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
100 int numeric_field; /* treat field as numeric */
34410
a70dd8767b07 Add counting of source iterator lines to the reader object - handy for
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34409
diff changeset
101 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
102 } ReaderObj;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
103
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
104 staticforward PyTypeObject Reader_Type;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
105
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
106 #define ReaderObject_Check(v) ((v)->ob_type == &Reader_Type)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
107
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
108 typedef struct {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
109 PyObject_HEAD
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
110
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
111 PyObject *writeline; /* write output lines to this file */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
112
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
113 DialectObj *dialect; /* parsing dialect */
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 char *rec; /* buffer for parser.join */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
116 int rec_size; /* size of allocated record */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
117 int rec_len; /* length of record */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
118 int num_fields; /* number of fields in record */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
119 } WriterObj;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
120
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
121 staticforward PyTypeObject Writer_Type;
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 /*
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
124 * DIALECT class
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
125 */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
126
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
127 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
128 get_dialect_from_registry(PyObject * name_obj)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
129 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
130 PyObject *dialect_obj;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
131
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
132 dialect_obj = PyDict_GetItem(dialects, name_obj);
34389
7391e18b0a7c Only set error string when dict lookup found no matching key (was setting
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34386
diff changeset
133 if (dialect_obj == NULL) {
7391e18b0a7c Only set error string when dict lookup found no matching key (was setting
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34386
diff changeset
134 if (!PyErr_Occurred())
7391e18b0a7c Only set error string when dict lookup found no matching key (was setting
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34386
diff changeset
135 PyErr_Format(error_obj, "unknown dialect");
7391e18b0a7c Only set error string when dict lookup found no matching key (was setting
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34386
diff changeset
136 }
7391e18b0a7c Only set error string when dict lookup found no matching key (was setting
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34386
diff changeset
137 else
7391e18b0a7c Only set error string when dict lookup found no matching key (was setting
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34386
diff changeset
138 Py_INCREF(dialect_obj);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
139 return dialect_obj;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
140 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
141
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
142 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
143 get_string(PyObject *str)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
144 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
145 Py_XINCREF(str);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
146 return str;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
147 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
148
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
149 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
150 get_nullchar_as_None(char c)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
151 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
152 if (c == '\0') {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
153 Py_INCREF(Py_None);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
154 return Py_None;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
155 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
156 else
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
157 return PyString_FromStringAndSize((char*)&c, 1);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
158 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
159
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
160 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
161 Dialect_get_lineterminator(DialectObj *self)
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 return get_string(self->lineterminator);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
164 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
165
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
166 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
167 Dialect_get_escapechar(DialectObj *self)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
168 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
169 return get_nullchar_as_None(self->escapechar);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
170 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
171
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
172 static PyObject *
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
173 Dialect_get_quotechar(DialectObj *self)
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
174 {
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
175 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
176 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
177
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
178 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
179 Dialect_get_quoting(DialectObj *self)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
180 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
181 return PyInt_FromLong(self->quoting);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
182 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
183
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
184 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
185 _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
186 {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
187 if (src == NULL)
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
188 *target = dflt;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
189 else
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
190 *target = PyObject_IsTrue(src);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
191 return 0;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
192 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
193
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
194 static int
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
195 _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
196 {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
197 if (src == NULL)
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
198 *target = dflt;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
199 else {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
200 if (!PyInt_Check(src)) {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
201 PyErr_Format(PyExc_TypeError,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
202 "\"%s\" must be an integer", name);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
203 return -1;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
204 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
205 *target = PyInt_AsLong(src);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
206 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
207 return 0;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
208 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
209
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
210 static int
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
211 _set_char(const char *name, char *target, PyObject *src, char dflt)
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
212 {
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
213 if (src == NULL)
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
214 *target = dflt;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
215 else {
34386
91d55a30382c When parsing args that return a single character, treat null string the
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34385
diff changeset
216 if (src == Py_None || PyString_Size(src) == 0)
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
217 *target = '\0';
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
218 else if (!PyString_Check(src) || PyString_Size(src) != 1) {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
219 PyErr_Format(PyExc_TypeError,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
220 "\"%s\" must be an 1-character string",
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
221 name);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
222 return -1;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
223 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
224 else {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
225 char *s = PyString_AsString(src);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
226 if (s == NULL)
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
227 return -1;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
228 *target = s[0];
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
229 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
230 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
231 return 0;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
232 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
233
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
234 static int
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
235 _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
236 {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
237 if (src == NULL)
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
238 *target = PyString_FromString(dflt);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
239 else {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
240 if (src == Py_None)
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
241 *target = NULL;
34385
3533e3cb7b97 Where a string is desired, test for PyBaseString_Type derived type,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34381
diff changeset
242 else if (!IS_BASESTRING(src)) {
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
243 PyErr_Format(PyExc_TypeError,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
244 "\"%s\" must be an string", name);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
245 return -1;
34341
f80bb8aff419 Fix to use PEP7 brace style.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34340
diff changeset
246 }
f80bb8aff419 Fix to use PEP7 brace style.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34340
diff changeset
247 else {
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
248 Py_XDECREF(*target);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
249 Py_INCREF(src);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
250 *target = src;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
251 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
252 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
253 return 0;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
254 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
255
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
256 static int
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
257 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
258 {
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
259 StyleDesc *qs = quote_styles;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
260
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
261 for (qs = quote_styles; qs->name; qs++) {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
262 if (qs->style == quoting)
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
263 return 0;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
264 }
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
265 PyErr_Format(PyExc_TypeError, "bad \"quoting\" value");
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
266 return -1;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
267 }
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 #define D_OFF(x) offsetof(DialectObj, x)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
270
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
271 static struct PyMemberDef Dialect_memberlist[] = {
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
272 { "delimiter", T_CHAR, D_OFF(delimiter), READONLY },
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
273 { "skipinitialspace", T_INT, D_OFF(skipinitialspace), READONLY },
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
274 { "doublequote", T_INT, D_OFF(doublequote), READONLY },
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
275 { "strict", T_INT, D_OFF(strict), READONLY },
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
276 { NULL }
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 PyGetSetDef Dialect_getsetlist[] = {
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
280 { "escapechar", (getter)Dialect_get_escapechar},
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
281 { "lineterminator", (getter)Dialect_get_lineterminator},
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
282 { "quotechar", (getter)Dialect_get_quotechar},
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
283 { "quoting", (getter)Dialect_get_quoting},
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
284 {NULL},
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
285 };
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
286
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
287 static void
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
288 Dialect_dealloc(DialectObj *self)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
289 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
290 Py_XDECREF(self->lineterminator);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
291 self->ob_type->tp_free((PyObject *)self);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
292 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
293
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
294 static char *dialect_kws[] = {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
295 "dialect",
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
296 "delimiter",
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
297 "doublequote",
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
298 "escapechar",
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
299 "lineterminator",
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
300 "quotechar",
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
301 "quoting",
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
302 "skipinitialspace",
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
303 "strict",
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
304 NULL
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
305 };
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
306
34395
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
307 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
308 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
309 {
34395
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
310 DialectObj *self;
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
311 PyObject *ret = NULL;
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
312 PyObject *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
313 PyObject *delimiter = NULL;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
314 PyObject *doublequote = NULL;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
315 PyObject *escapechar = NULL;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
316 PyObject *lineterminator = NULL;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
317 PyObject *quotechar = NULL;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
318 PyObject *quoting = NULL;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
319 PyObject *skipinitialspace = NULL;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
320 PyObject *strict = NULL;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
321
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
322 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
323 "|OOOOOOOOO", dialect_kws,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
324 &dialect,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
325 &delimiter,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
326 &doublequote,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
327 &escapechar,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
328 &lineterminator,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
329 &quotechar,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
330 &quoting,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
331 &skipinitialspace,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
332 &strict))
34395
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
333 return NULL;
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
334
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
335 if (dialect != NULL) {
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
336 if (IS_BASESTRING(dialect)) {
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
337 dialect = get_dialect_from_registry(dialect);
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
338 if (dialect == NULL)
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
339 return NULL;
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
340 }
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
341 else
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
342 Py_INCREF(dialect);
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
343 /* Can we reuse this instance? */
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
344 if (PyObject_TypeCheck(dialect, &Dialect_Type) &&
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
345 delimiter == 0 &&
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
346 doublequote == 0 &&
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
347 escapechar == 0 &&
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
348 lineterminator == 0 &&
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
349 quotechar == 0 &&
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
350 quoting == 0 &&
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
351 skipinitialspace == 0 &&
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
352 strict == 0)
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
353 return dialect;
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
354 }
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
355
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
356 self = (DialectObj *)type->tp_alloc(type, 0);
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
357 if (self == NULL) {
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
358 Py_XDECREF(dialect);
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
359 return NULL;
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
360 }
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
361 self->lineterminator = NULL;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
362
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
363 Py_XINCREF(delimiter);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
364 Py_XINCREF(doublequote);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
365 Py_XINCREF(escapechar);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
366 Py_XINCREF(lineterminator);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
367 Py_XINCREF(quotechar);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
368 Py_XINCREF(quoting);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
369 Py_XINCREF(skipinitialspace);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
370 Py_XINCREF(strict);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
371 if (dialect != NULL) {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
372 #define DIALECT_GETATTR(v, n) \
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
373 if (v == NULL) \
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
374 v = PyObject_GetAttrString(dialect, n)
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
375 DIALECT_GETATTR(delimiter, "delimiter");
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
376 DIALECT_GETATTR(doublequote, "doublequote");
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
377 DIALECT_GETATTR(escapechar, "escapechar");
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
378 DIALECT_GETATTR(lineterminator, "lineterminator");
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
379 DIALECT_GETATTR(quotechar, "quotechar");
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
380 DIALECT_GETATTR(quoting, "quoting");
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
381 DIALECT_GETATTR(skipinitialspace, "skipinitialspace");
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
382 DIALECT_GETATTR(strict, "strict");
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
383 PyErr_Clear();
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
384 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
385
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
386 /* check types and convert to C values */
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
387 #define DIASET(meth, name, target, src, dflt) \
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
388 if (meth(name, target, src, dflt)) \
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
389 goto err
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
390 DIASET(_set_char, "delimiter", &self->delimiter, delimiter, ',');
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
391 DIASET(_set_bool, "doublequote", &self->doublequote, doublequote, 1);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
392 DIASET(_set_char, "escapechar", &self->escapechar, escapechar, 0);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
393 DIASET(_set_str, "lineterminator", &self->lineterminator, lineterminator, "\r\n");
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
394 DIASET(_set_char, "quotechar", &self->quotechar, quotechar, '"');
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
395 DIASET(_set_int, "quoting", &self->quoting, quoting, QUOTE_MINIMAL);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
396 DIASET(_set_bool, "skipinitialspace", &self->skipinitialspace, skipinitialspace, 0);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
397 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
398
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
399 /* validate options */
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
400 if (dialect_check_quoting(self->quoting))
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
401 goto err;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
402 if (self->delimiter == 0) {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
403 PyErr_SetString(PyExc_TypeError, "delimiter must be set");
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
404 goto err;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
405 }
34408
72fd373cd0f9 Fix logic problem in quoting=csv.QUOTE_ALL, quotechar=None check, add test.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34407
diff changeset
406 if (quotechar == Py_None && quoting == NULL)
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
407 self->quoting = QUOTE_NONE;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
408 if (self->quoting != QUOTE_NONE && self->quotechar == 0) {
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
409 PyErr_SetString(PyExc_TypeError,
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
410 "quotechar must be set if quoting enabled");
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
411 goto err;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
412 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
413 if (self->lineterminator == 0) {
34395
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
414 PyErr_SetString(PyExc_TypeError, "lineterminator must be set");
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
415 goto err;
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
416 }
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
417
34395
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
418 ret = (PyObject *)self;
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
419 err:
34395
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
420 Py_XDECREF(dialect);
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
421 Py_XDECREF(delimiter);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
422 Py_XDECREF(doublequote);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
423 Py_XDECREF(escapechar);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
424 Py_XDECREF(lineterminator);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
425 Py_XDECREF(quotechar);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
426 Py_XDECREF(quoting);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
427 Py_XDECREF(skipinitialspace);
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
428 Py_XDECREF(strict);
34395
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
429 return ret;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
430 }
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
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
433 PyDoc_STRVAR(Dialect_Type_doc,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
434 "CSV dialect\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
435 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
436 "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
437
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
438 static PyTypeObject Dialect_Type = {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
439 PyObject_HEAD_INIT(NULL)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
440 0, /* ob_size */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
441 "_csv.Dialect", /* tp_name */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
442 sizeof(DialectObj), /* tp_basicsize */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
443 0, /* tp_itemsize */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
444 /* methods */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
445 (destructor)Dialect_dealloc, /* tp_dealloc */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
446 (printfunc)0, /* tp_print */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
447 (getattrfunc)0, /* tp_getattr */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
448 (setattrfunc)0, /* tp_setattr */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
449 (cmpfunc)0, /* tp_compare */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
450 (reprfunc)0, /* tp_repr */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
451 0, /* tp_as_number */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
452 0, /* tp_as_sequence */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
453 0, /* tp_as_mapping */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
454 (hashfunc)0, /* tp_hash */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
455 (ternaryfunc)0, /* tp_call */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
456 (reprfunc)0, /* tp_str */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
457 0, /* tp_getattro */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
458 0, /* tp_setattro */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
459 0, /* tp_as_buffer */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
460 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
461 Dialect_Type_doc, /* tp_doc */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
462 0, /* tp_traverse */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
463 0, /* tp_clear */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
464 0, /* tp_richcompare */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
465 0, /* tp_weaklistoffset */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
466 0, /* tp_iter */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
467 0, /* tp_iternext */
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
468 0, /* tp_methods */
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
469 Dialect_memberlist, /* tp_members */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
470 Dialect_getsetlist, /* tp_getset */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
471 0, /* tp_base */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
472 0, /* tp_dict */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
473 0, /* tp_descr_get */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
474 0, /* tp_descr_set */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
475 0, /* tp_dictoffset */
34395
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
476 0, /* tp_init */
6c02bb3fcca6 Now that internal dialect type is immutable, and the dialect registry
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34392
diff changeset
477 0, /* tp_alloc */
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
478 dialect_new, /* tp_new */
28599
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
479 0, /* tp_free */
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
480 };
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
481
34390
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
482 /*
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
483 * 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
484 * 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
485 */
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
486 static PyObject *
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
487 _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
488 {
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
489 PyObject *ctor_args;
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
490 PyObject *dialect;
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 ctor_args = Py_BuildValue(dialect_inst ? "(O)" : "()", dialect_inst);
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
493 if (ctor_args == NULL)
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
494 return NULL;
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
495 dialect = PyObject_Call((PyObject *)&Dialect_Type, ctor_args, kwargs);
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
496 Py_DECREF(ctor_args);
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
497 return dialect;
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
498 }
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
499
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
500 /*
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
501 * 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
502 */
34409
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
503 static int
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
504 parse_save_field(ReaderObj *self)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
505 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
506 PyObject *field;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
507
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
508 field = PyString_FromStringAndSize(self->field, self->field_len);
34409
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
509 if (field == NULL)
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
510 return -1;
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
511 self->field_len = 0;
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
512 if (self->numeric_field) {
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
513 PyObject *tmp;
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
514
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
515 self->numeric_field = 0;
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
516 tmp = PyNumber_Float(field);
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
517 if (tmp == NULL) {
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
518 Py_DECREF(field);
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
519 return -1;
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
520 }
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
521 Py_DECREF(field);
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
522 field = tmp;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
523 }
34409
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
524 PyList_Append(self->fields, field);
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
525 Py_DECREF(field);
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
526 return 0;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
527 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
528
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
529 static int
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
530 parse_grow_buff(ReaderObj *self)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
531 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
532 if (self->field_size == 0) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
533 self->field_size = 4096;
29389
857428cb418c Fix potential leaks identified by Neal Norwitz.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 28599
diff changeset
534 if (self->field != NULL)
857428cb418c Fix potential leaks identified by Neal Norwitz.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 28599
diff changeset
535 PyMem_Free(self->field);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
536 self->field = PyMem_Malloc(self->field_size);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
537 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
538 else {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
539 self->field_size *= 2;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
540 self->field = PyMem_Realloc(self->field, self->field_size);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
541 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
542 if (self->field == NULL) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
543 PyErr_NoMemory();
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
544 return 0;
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 return 1;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
547 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
548
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
549 static int
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
550 parse_add_char(ReaderObj *self, char c)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
551 {
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
552 if (self->field_len >= field_limit) {
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
553 PyErr_Format(error_obj, "field larger than field limit (%ld)",
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
554 field_limit);
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
555 return -1;
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
556 }
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
557 if (self->field_len == self->field_size && !parse_grow_buff(self))
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
558 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
559 self->field[self->field_len++] = c;
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
560 return 0;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
561 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
562
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
563 static int
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
564 parse_process_char(ReaderObj *self, char c)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
565 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
566 DialectObj *dialect = self->dialect;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
567
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
568 switch (self->state) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
569 case START_RECORD:
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
570 /* start of record */
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
571 if (c == '\0')
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
572 /* empty line - return [] */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
573 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
574 else if (c == '\n' || c == '\r') {
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
575 self->state = EAT_CRNL;
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
576 break;
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
577 }
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
578 /* normal character - handle as START_FIELD */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
579 self->state = START_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
580 /* fallthru */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
581 case START_FIELD:
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
582 /* expecting field */
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
583 if (c == '\n' || c == '\r' || c == '\0') {
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
584 /* save empty field - return [fields] */
34409
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
585 if (parse_save_field(self) < 0)
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
586 return -1;
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
587 self->state = (c == '\0' ? START_RECORD : EAT_CRNL);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
588 }
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
589 else if (c == dialect->quotechar &&
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
590 dialect->quoting != QUOTE_NONE) {
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
591 /* start quoted field */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
592 self->state = IN_QUOTED_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
593 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
594 else if (c == dialect->escapechar) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
595 /* possible escaped character */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
596 self->state = ESCAPED_CHAR;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
597 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
598 else if (c == ' ' && dialect->skipinitialspace)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
599 /* ignore space at start of field */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
600 ;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
601 else if (c == dialect->delimiter) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
602 /* save empty field */
34409
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
603 if (parse_save_field(self) < 0)
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
604 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
605 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
606 else {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
607 /* begin new unquoted field */
34409
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
608 if (dialect->quoting == QUOTE_NONNUMERIC)
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
609 self->numeric_field = 1;
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
610 if (parse_add_char(self, c) < 0)
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
611 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
612 self->state = IN_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
613 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
614 break;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
615
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
616 case ESCAPED_CHAR:
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
617 if (c == '\0')
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
618 c = '\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
619 if (parse_add_char(self, c) < 0)
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
620 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
621 self->state = IN_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
622 break;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
623
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
624 case IN_FIELD:
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
625 /* in unquoted field */
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
626 if (c == '\n' || c == '\r' || c == '\0') {
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
627 /* end of line - return [fields] */
34409
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
628 if (parse_save_field(self) < 0)
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
629 return -1;
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
630 self->state = (c == '\0' ? START_RECORD : EAT_CRNL);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
631 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
632 else if (c == dialect->escapechar) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
633 /* possible escaped character */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
634 self->state = ESCAPED_CHAR;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
635 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
636 else if (c == dialect->delimiter) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
637 /* save field - wait for new field */
34409
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
638 if (parse_save_field(self) < 0)
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
639 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
640 self->state = START_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
641 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
642 else {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
643 /* normal character - save in field */
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
644 if (parse_add_char(self, c) < 0)
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
645 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
646 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
647 break;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
648
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
649 case IN_QUOTED_FIELD:
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
650 /* in quoted field */
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
651 if (c == '\0')
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
652 ;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
653 else if (c == dialect->escapechar) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
654 /* Possible escape character */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
655 self->state = ESCAPE_IN_QUOTED_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
656 }
34340
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
657 else if (c == dialect->quotechar &&
be4929e5179b Improved the implementation of the internal "dialect" type. The new
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34331
diff changeset
658 dialect->quoting != QUOTE_NONE) {
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
659 if (dialect->doublequote) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
660 /* doublequote; " represented by "" */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
661 self->state = QUOTE_IN_QUOTED_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
662 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
663 else {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
664 /* end of quote part of field */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
665 self->state = IN_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
666 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
667 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
668 else {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
669 /* normal character - save in field */
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
670 if (parse_add_char(self, c) < 0)
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
671 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
672 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
673 break;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
674
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
675 case ESCAPE_IN_QUOTED_FIELD:
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
676 if (c == '\0')
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
677 c = '\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
678 if (parse_add_char(self, c) < 0)
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
679 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
680 self->state = IN_QUOTED_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
681 break;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
682
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
683 case QUOTE_IN_QUOTED_FIELD:
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
684 /* doublequote - seen a quote in an quoted field */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
685 if (dialect->quoting != QUOTE_NONE &&
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
686 c == dialect->quotechar) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
687 /* save "" as " */
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
688 if (parse_add_char(self, c) < 0)
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
689 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
690 self->state = IN_QUOTED_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
691 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
692 else if (c == dialect->delimiter) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
693 /* save field - wait for new field */
34409
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
694 if (parse_save_field(self) < 0)
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
695 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
696 self->state = START_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
697 }
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
698 else if (c == '\n' || c == '\r' || c == '\0') {
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
699 /* end of line - return [fields] */
34409
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
700 if (parse_save_field(self) < 0)
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
701 return -1;
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
702 self->state = (c == '\0' ? START_RECORD : EAT_CRNL);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
703 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
704 else if (!dialect->strict) {
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
705 if (parse_add_char(self, c) < 0)
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
706 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
707 self->state = IN_FIELD;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
708 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
709 else {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
710 /* illegal */
34411
02f398fbb0f0 Improve wording of parser error message.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34410
diff changeset
711 PyErr_Format(error_obj, "'%c' expected after '%c'",
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
712 dialect->delimiter,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
713 dialect->quotechar);
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
714 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
715 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
716 break;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
717
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
718 case EAT_CRNL:
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
719 if (c == '\n' || c == '\r')
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
720 ;
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
721 else if (c == '\0')
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
722 self->state = START_RECORD;
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
723 else {
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
724 PyErr_Format(error_obj, "new-line character seen in unquoted field - do you need to open the file in universal-newline mode?");
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
725 return -1;
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 }
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
727 break;
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
728
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
729 }
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
730 return 0;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
731 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
732
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
733 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
734 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
735 {
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
736 Py_XDECREF(self->fields);
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
737 self->fields = PyList_New(0);
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
738 if (self->fields == NULL)
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
739 return -1;
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
740 self->field_len = 0;
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
741 self->state = START_RECORD;
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 self->numeric_field = 0;
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
743 return 0;
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
744 }
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
745
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
746 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
747 Reader_iternext(ReaderObj *self)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
748 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
749 PyObject *lineobj;
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
750 PyObject *fields = NULL;
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
751 char *line, c;
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
752 int linelen;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
753
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
754 if (parse_reset(self) < 0)
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
755 return NULL;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
756 do {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
757 lineobj = PyIter_Next(self->input_iter);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
758 if (lineobj == NULL) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
759 /* End of input OR exception */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
760 if (!PyErr_Occurred() && self->field_len != 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
761 PyErr_Format(error_obj,
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
762 "newline inside string");
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
763 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
764 }
34410
a70dd8767b07 Add counting of source iterator lines to the reader object - handy for
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34409
diff changeset
765 ++self->line_num;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
766
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
767 line = PyString_AsString(lineobj);
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
768 linelen = PyString_Size(lineobj);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
769
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
770 if (line == NULL || linelen < 0) {
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
771 Py_DECREF(lineobj);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
772 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
773 }
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
774 while (linelen--) {
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
775 c = *line++;
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
776 if (c == '\0') {
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
777 Py_DECREF(lineobj);
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
778 PyErr_Format(error_obj,
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
779 "line contains NULL byte");
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
780 goto err;
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
781 }
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
782 if (parse_process_char(self, c) < 0) {
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
783 Py_DECREF(lineobj);
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
784 goto err;
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
785 }
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
786 }
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
787 Py_DECREF(lineobj);
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
788 if (parse_process_char(self, 0) < 0)
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
789 goto err;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
790 } while (self->state != START_RECORD);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
791
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
792 fields = self->fields;
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
793 self->fields = NULL;
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
794 err:
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
795 return fields;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
796 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
797
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
798 static void
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
799 Reader_dealloc(ReaderObj *self)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
800 {
34381
4bd180d171cc Add missing PyObject_GC_Track and PyObject_GC_UnTrack calls to csv reader and
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34380
diff changeset
801 PyObject_GC_UnTrack(self);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
802 Py_XDECREF(self->dialect);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
803 Py_XDECREF(self->input_iter);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
804 Py_XDECREF(self->fields);
29389
857428cb418c Fix potential leaks identified by Neal Norwitz.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 28599
diff changeset
805 if (self->field != NULL)
857428cb418c Fix potential leaks identified by Neal Norwitz.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 28599
diff changeset
806 PyMem_Free(self->field);
28599
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
807 PyObject_GC_Del(self);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
808 }
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
809
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
810 static int
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
811 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
812 {
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
813 int err;
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
814 #define VISIT(SLOT) \
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
815 if (SLOT) { \
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
816 err = visit((PyObject *)(SLOT), arg); \
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
817 if (err) \
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
818 return err; \
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
819 }
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
820 VISIT(self->dialect);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
821 VISIT(self->input_iter);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
822 VISIT(self->fields);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
823 return 0;
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
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
826 static int
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
827 Reader_clear(ReaderObj *self)
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
828 {
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
829 Py_XDECREF(self->dialect);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
830 Py_XDECREF(self->input_iter);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
831 Py_XDECREF(self->fields);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
832 self->dialect = NULL;
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
833 self->input_iter = NULL;
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
834 self->fields = NULL;
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
835 return 0;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
836 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
837
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
838 PyDoc_STRVAR(Reader_Type_doc,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
839 "CSV reader\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
840 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
841 "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
842 "in CSV format.\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
843 );
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
844
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
845 static struct PyMethodDef Reader_methods[] = {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
846 { NULL, NULL }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
847 };
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
848 #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
849
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 static struct PyMemberDef Reader_memberlist[] = {
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 { "dialect", T_OBJECT, R_OFF(dialect), RO },
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
852 { "line_num", T_ULONG, R_OFF(line_num), RO },
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
853 { NULL }
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
854 };
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
855
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
856
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
857 static PyTypeObject Reader_Type = {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
858 PyObject_HEAD_INIT(NULL)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
859 0, /*ob_size*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
860 "_csv.reader", /*tp_name*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
861 sizeof(ReaderObj), /*tp_basicsize*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
862 0, /*tp_itemsize*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
863 /* methods */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
864 (destructor)Reader_dealloc, /*tp_dealloc*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
865 (printfunc)0, /*tp_print*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
866 (getattrfunc)0, /*tp_getattr*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
867 (setattrfunc)0, /*tp_setattr*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
868 (cmpfunc)0, /*tp_compare*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
869 (reprfunc)0, /*tp_repr*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
870 0, /*tp_as_number*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
871 0, /*tp_as_sequence*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
872 0, /*tp_as_mapping*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
873 (hashfunc)0, /*tp_hash*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
874 (ternaryfunc)0, /*tp_call*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
875 (reprfunc)0, /*tp_str*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
876 0, /*tp_getattro*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
877 0, /*tp_setattro*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
878 0, /*tp_as_buffer*/
28599
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
879 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
880 Py_TPFLAGS_HAVE_GC, /*tp_flags*/
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
881 Reader_Type_doc, /*tp_doc*/
28599
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
882 (traverseproc)Reader_traverse, /*tp_traverse*/
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
883 (inquiry)Reader_clear, /*tp_clear*/
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
884 0, /*tp_richcompare*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
885 0, /*tp_weaklistoffset*/
34331
3fc8ece9d2b8 Delete Reader_getiter and replace with PyObject_SelfIter.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 33134
diff changeset
886 PyObject_SelfIter, /*tp_iter*/
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
887 (getiterfunc)Reader_iternext, /*tp_iternext*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
888 Reader_methods, /*tp_methods*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
889 Reader_memberlist, /*tp_members*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
890 0, /*tp_getset*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
891
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
892 };
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
893
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
894 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
895 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
896 {
34390
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
897 PyObject * iterator, * dialect = NULL;
28599
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
898 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
899
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
900 if (!self)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
901 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
902
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
903 self->dialect = NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
904 self->fields = NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
905 self->input_iter = NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
906 self->field = NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
907 self->field_size = 0;
34410
a70dd8767b07 Add counting of source iterator lines to the reader object - handy for
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34409
diff changeset
908 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
909
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
910 if (parse_reset(self) < 0) {
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
911 Py_DECREF(self);
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
912 return NULL;
1d866c02a8ca When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34408
diff changeset
913 }
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
914
32389
f9569526e8d4 Use PyArg_UnpackTuple() where possible.
Raymond Hettinger <python@rcn.com>
parents: 31074
diff changeset
915 if (!PyArg_UnpackTuple(args, "", 1, 2, &iterator, &dialect)) {
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
916 Py_DECREF(self);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
917 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
918 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
919 self->input_iter = PyObject_GetIter(iterator);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
920 if (self->input_iter == NULL) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
921 PyErr_SetString(PyExc_TypeError,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
922 "argument 1 must be an iterator");
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
923 Py_DECREF(self);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
924 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
925 }
34390
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
926 self->dialect = (DialectObj *)_call_dialect(dialect, keyword_args);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
927 if (self->dialect == NULL) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
928 Py_DECREF(self);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
929 return NULL;
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
34381
4bd180d171cc Add missing PyObject_GC_Track and PyObject_GC_UnTrack calls to csv reader and
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34380
diff changeset
932 PyObject_GC_Track(self);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
933 return (PyObject *)self;
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
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
936 /*
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
937 * WRITER
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
938 */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
939 /* ---------------------------------------------------------------- */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
940 static void
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
941 join_reset(WriterObj *self)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
942 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
943 self->rec_len = 0;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
944 self->num_fields = 0;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
945 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
946
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
947 #define MEM_INCR 32768
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
948
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
949 /* 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
950 * record length.
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
951 */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
952 static int
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
953 join_append_data(WriterObj *self, char *field, int quote_empty,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
954 int *quoted, int copy_phase)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
955 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
956 DialectObj *dialect = self->dialect;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
957 int i, 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
958 char *lineterm;
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
959
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
960 #define ADDCH(c) \
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
961 do {\
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
962 if (copy_phase) \
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
963 self->rec[rec_len] = c;\
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
964 rec_len++;\
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
965 } while(0)
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
966
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
967 lineterm = PyString_AsString(dialect->lineterminator);
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
968 if (lineterm == NULL)
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
969 return -1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
970
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
971 rec_len = self->rec_len;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
972
34407
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
973 /* If this is not the first field we need a field separator */
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
974 if (self->num_fields > 0)
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
975 ADDCH(dialect->delimiter);
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
976
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
977 /* Handle preceding quote */
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
978 if (copy_phase && *quoted)
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
979 ADDCH(dialect->quotechar);
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
980
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
981 /* Copy/count field data */
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
982 for (i = 0;; i++) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
983 char c = field[i];
34407
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
984 int want_escape = 0;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
985
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
986 if (c == '\0')
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
987 break;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
988
34407
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
989 if (c == dialect->delimiter ||
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
990 c == dialect->escapechar ||
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
991 c == dialect->quotechar ||
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
992 strchr(lineterm, c)) {
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
993 if (dialect->quoting == QUOTE_NONE)
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
994 want_escape = 1;
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
995 else {
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
996 if (c == dialect->quotechar) {
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
997 if (dialect->doublequote)
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
998 ADDCH(dialect->quotechar);
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
999 else
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1000 want_escape = 1;
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1001 }
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1002 if (!want_escape)
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1003 *quoted = 1;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1004 }
34407
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1005 if (want_escape) {
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1006 if (!dialect->escapechar) {
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1007 PyErr_Format(error_obj,
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1008 "need to escape, but no escapechar set");
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1009 return -1;
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1010 }
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1011 ADDCH(dialect->escapechar);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1012 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1013 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1014 /* Copy field character into record buffer.
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1015 */
34407
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1016 ADDCH(c);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1017 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1018
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1019 /* If field is empty check if it needs to be quoted.
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1020 */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1021 if (i == 0 && quote_empty) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1022 if (dialect->quoting == QUOTE_NONE) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1023 PyErr_Format(error_obj,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1024 "single empty field record must be quoted");
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1025 return -1;
34341
f80bb8aff419 Fix to use PEP7 brace style.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34340
diff changeset
1026 }
f80bb8aff419 Fix to use PEP7 brace style.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34340
diff changeset
1027 else
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1028 *quoted = 1;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1029 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1030
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1031 if (*quoted) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1032 if (copy_phase)
34407
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1033 ADDCH(dialect->quotechar);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1034 else
34407
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1035 rec_len += 2;
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 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
1038 #undef ADDCH
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1039 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1040
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1041 static int
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1042 join_check_rec_size(WriterObj *self, int rec_len)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1043 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1044 if (rec_len > self->rec_size) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1045 if (self->rec_size == 0) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1046 self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR;
29389
857428cb418c Fix potential leaks identified by Neal Norwitz.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 28599
diff changeset
1047 if (self->rec != NULL)
857428cb418c Fix potential leaks identified by Neal Norwitz.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 28599
diff changeset
1048 PyMem_Free(self->rec);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1049 self->rec = PyMem_Malloc(self->rec_size);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1050 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1051 else {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1052 char *old_rec = self->rec;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1053
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1054 self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1055 self->rec = PyMem_Realloc(self->rec, self->rec_size);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1056 if (self->rec == NULL)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1057 PyMem_Free(old_rec);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1058 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1059 if (self->rec == NULL) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1060 PyErr_NoMemory();
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1061 return 0;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1062 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1063 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1064 return 1;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1065 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1066
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1067 static int
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1068 join_append(WriterObj *self, char *field, int *quoted, int quote_empty)
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 int rec_len;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1071
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1072 rec_len = join_append_data(self, field, quote_empty, quoted, 0);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1073 if (rec_len < 0)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1074 return 0;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1075
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1076 /* grow record buffer if necessary */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1077 if (!join_check_rec_size(self, rec_len))
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1078 return 0;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1079
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1080 self->rec_len = join_append_data(self, field, quote_empty, quoted, 1);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1081 self->num_fields++;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1082
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1083 return 1;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1084 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1085
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1086 static int
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1087 join_append_lineterminator(WriterObj *self)
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 int terminator_len;
34403
13a85806ba48 Add belt and braces check of PyString_AsString return.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34396
diff changeset
1090 char *terminator;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1091
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1092 terminator_len = PyString_Size(self->dialect->lineterminator);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1093
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1094 /* grow record buffer if necessary */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1095 if (!join_check_rec_size(self, self->rec_len + terminator_len))
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1096 return 0;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1097
34403
13a85806ba48 Add belt and braces check of PyString_AsString return.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34396
diff changeset
1098 terminator = PyString_AsString(self->dialect->lineterminator);
13a85806ba48 Add belt and braces check of PyString_AsString return.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34396
diff changeset
1099 if (terminator == NULL)
13a85806ba48 Add belt and braces check of PyString_AsString return.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34396
diff changeset
1100 return 0;
13a85806ba48 Add belt and braces check of PyString_AsString return.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34396
diff changeset
1101 memmove(self->rec + self->rec_len, terminator, terminator_len);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1102 self->rec_len += terminator_len;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1103
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1104 return 1;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1105 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1106
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1107 PyDoc_STRVAR(csv_writerow_doc,
28590
95b6dd04da8f add writerows docstring
Skip Montanaro <skip@pobox.com>
parents: 28589
diff changeset
1108 "writerow(sequence)\n"
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1109 "\n"
28590
95b6dd04da8f add writerows docstring
Skip Montanaro <skip@pobox.com>
parents: 28589
diff changeset
1110 "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
1111 "elements will be converted to string.");
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 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1114 csv_writerow(WriterObj *self, PyObject *seq)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1115 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1116 DialectObj *dialect = self->dialect;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1117 int len, i;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1118
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1119 if (!PySequence_Check(seq))
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1120 return PyErr_Format(error_obj, "sequence expected");
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1121
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1122 len = PySequence_Length(seq);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1123 if (len < 0)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1124 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1125
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1126 /* Join all fields in internal buffer.
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1127 */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1128 join_reset(self);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1129 for (i = 0; i < len; i++) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1130 PyObject *field;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1131 int append_ok;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1132 int quoted;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1133
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1134 field = PySequence_GetItem(seq, i);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1135 if (field == NULL)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1136 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1137
34407
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1138 switch (dialect->quoting) {
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1139 case QUOTE_NONNUMERIC:
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1140 quoted = !PyNumber_Check(field);
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1141 break;
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1142 case QUOTE_ALL:
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1143 quoted = 1;
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1144 break;
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1145 default:
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1146 quoted = 0;
c88ab292bf05 When using QUOTE_NONNUMERIC, we now test for "numericness" with
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34406
diff changeset
1147 break;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1148 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1149
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1150 if (PyString_Check(field)) {
28591
883a694795f5 tighten up string checks
Skip Montanaro <skip@pobox.com>
parents: 28590
diff changeset
1151 append_ok = join_append(self,
883a694795f5 tighten up string checks
Skip Montanaro <skip@pobox.com>
parents: 28590
diff changeset
1152 PyString_AS_STRING(field),
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1153 &quoted, len == 1);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1154 Py_DECREF(field);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1155 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1156 else if (field == Py_None) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1157 append_ok = join_append(self, "", &quoted, len == 1);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1158 Py_DECREF(field);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1159 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1160 else {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1161 PyObject *str;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1162
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1163 str = PyObject_Str(field);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1164 Py_DECREF(field);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1165 if (str == NULL)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1166 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1167
28591
883a694795f5 tighten up string checks
Skip Montanaro <skip@pobox.com>
parents: 28590
diff changeset
1168 append_ok = join_append(self, PyString_AS_STRING(str),
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1169 &quoted, len == 1);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1170 Py_DECREF(str);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1171 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1172 if (!append_ok)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1173 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1174 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1175
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1176 /* Add line terminator.
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1177 */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1178 if (!join_append_lineterminator(self))
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1179 return 0;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1180
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1181 return PyObject_CallFunction(self->writeline,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1182 "(s#)", self->rec, self->rec_len);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1183 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1184
28590
95b6dd04da8f add writerows docstring
Skip Montanaro <skip@pobox.com>
parents: 28589
diff changeset
1185 PyDoc_STRVAR(csv_writerows_doc,
95b6dd04da8f add writerows docstring
Skip Montanaro <skip@pobox.com>
parents: 28589
diff changeset
1186 "writerows(sequence of sequences)\n"
95b6dd04da8f add writerows docstring
Skip Montanaro <skip@pobox.com>
parents: 28589
diff changeset
1187 "\n"
95b6dd04da8f add writerows docstring
Skip Montanaro <skip@pobox.com>
parents: 28589
diff changeset
1188 "Construct and write a series of sequences to a csv file. Non-string\n"
95b6dd04da8f add writerows docstring
Skip Montanaro <skip@pobox.com>
parents: 28589
diff changeset
1189 "elements will be converted to string.");
95b6dd04da8f add writerows docstring
Skip Montanaro <skip@pobox.com>
parents: 28589
diff changeset
1190
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1191 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1192 csv_writerows(WriterObj *self, PyObject *seqseq)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1193 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1194 PyObject *row_iter, *row_obj, *result;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1195
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1196 row_iter = PyObject_GetIter(seqseq);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1197 if (row_iter == NULL) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1198 PyErr_SetString(PyExc_TypeError,
28589
Skip Montanaro <skip@pobox.com>
parents: 28588
diff changeset
1199 "writerows() argument must be iterable");
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1200 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1201 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1202 while ((row_obj = PyIter_Next(row_iter))) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1203 result = csv_writerow(self, row_obj);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1204 Py_DECREF(row_obj);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1205 if (!result) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1206 Py_DECREF(row_iter);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1207 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1208 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1209 else
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1210 Py_DECREF(result);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1211 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1212 Py_DECREF(row_iter);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1213 if (PyErr_Occurred())
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1214 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1215 Py_INCREF(Py_None);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1216 return Py_None;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1217 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1218
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1219 static struct PyMethodDef Writer_methods[] = {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1220 { "writerow", (PyCFunction)csv_writerow, METH_O, csv_writerow_doc},
28590
95b6dd04da8f add writerows docstring
Skip Montanaro <skip@pobox.com>
parents: 28589
diff changeset
1221 { "writerows", (PyCFunction)csv_writerows, METH_O, csv_writerows_doc},
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1222 { NULL, NULL }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1223 };
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1224
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1225 #define W_OFF(x) offsetof(WriterObj, x)
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 static struct PyMemberDef Writer_memberlist[] = {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1228 { "dialect", T_OBJECT, W_OFF(dialect), RO },
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1229 { NULL }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1230 };
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1231
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1232 static void
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1233 Writer_dealloc(WriterObj *self)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1234 {
34381
4bd180d171cc Add missing PyObject_GC_Track and PyObject_GC_UnTrack calls to csv reader and
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34380
diff changeset
1235 PyObject_GC_UnTrack(self);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1236 Py_XDECREF(self->dialect);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1237 Py_XDECREF(self->writeline);
29389
857428cb418c Fix potential leaks identified by Neal Norwitz.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 28599
diff changeset
1238 if (self->rec != NULL)
857428cb418c Fix potential leaks identified by Neal Norwitz.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 28599
diff changeset
1239 PyMem_Free(self->rec);
28599
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1240 PyObject_GC_Del(self);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1241 }
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1242
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1243 static int
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1244 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
1245 {
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1246 int err;
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1247 #define VISIT(SLOT) \
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1248 if (SLOT) { \
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1249 err = visit((PyObject *)(SLOT), arg); \
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1250 if (err) \
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1251 return err; \
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1252 }
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1253 VISIT(self->dialect);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1254 VISIT(self->writeline);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1255 return 0;
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1256 }
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1257
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1258 static int
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1259 Writer_clear(WriterObj *self)
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1260 {
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1261 Py_XDECREF(self->dialect);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1262 Py_XDECREF(self->writeline);
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1263 self->dialect = NULL;
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1264 self->writeline = NULL;
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
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
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1268 PyDoc_STRVAR(Writer_Type_doc,
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 = {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1276 PyObject_HEAD_INIT(NULL)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1277 0, /*ob_size*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1278 "_csv.writer", /*tp_name*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1279 sizeof(WriterObj), /*tp_basicsize*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1280 0, /*tp_itemsize*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1281 /* methods */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1282 (destructor)Writer_dealloc, /*tp_dealloc*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1283 (printfunc)0, /*tp_print*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1284 (getattrfunc)0, /*tp_getattr*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1285 (setattrfunc)0, /*tp_setattr*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1286 (cmpfunc)0, /*tp_compare*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1287 (reprfunc)0, /*tp_repr*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1288 0, /*tp_as_number*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1289 0, /*tp_as_sequence*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1290 0, /*tp_as_mapping*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1291 (hashfunc)0, /*tp_hash*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1292 (ternaryfunc)0, /*tp_call*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1293 (reprfunc)0, /*tp_str*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1294 0, /*tp_getattro*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1295 0, /*tp_setattro*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1296 0, /*tp_as_buffer*/
28599
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1297 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1298 Py_TPFLAGS_HAVE_GC, /*tp_flags*/
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1299 Writer_Type_doc,
28599
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1300 (traverseproc)Writer_traverse, /*tp_traverse*/
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1301 (inquiry)Writer_clear, /*tp_clear*/
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1302 0, /*tp_richcompare*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1303 0, /*tp_weaklistoffset*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1304 (getiterfunc)0, /*tp_iter*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1305 (getiterfunc)0, /*tp_iternext*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1306 Writer_methods, /*tp_methods*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1307 Writer_memberlist, /*tp_members*/
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1308 0, /*tp_getset*/
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
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1311 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1312 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
1313 {
34390
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
1314 PyObject * output_file, * dialect = NULL;
28599
11660f4361f8 Make readers and writers participate in garbage collection.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28594
diff changeset
1315 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
1316
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1317 if (!self)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1318 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1319
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1320 self->dialect = NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1321 self->writeline = NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1322
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1323 self->rec = NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1324 self->rec_size = 0;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1325 self->rec_len = 0;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1326 self->num_fields = 0;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1327
32389
f9569526e8d4 Use PyArg_UnpackTuple() where possible.
Raymond Hettinger <python@rcn.com>
parents: 31074
diff changeset
1328 if (!PyArg_UnpackTuple(args, "", 1, 2, &output_file, &dialect)) {
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1329 Py_DECREF(self);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1330 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1331 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1332 self->writeline = PyObject_GetAttrString(output_file, "write");
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1333 if (self->writeline == NULL || !PyCallable_Check(self->writeline)) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1334 PyErr_SetString(PyExc_TypeError,
34411
02f398fbb0f0 Improve wording of parser error message.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34410
diff changeset
1335 "argument 1 must have a \"write\" method");
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1336 Py_DECREF(self);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1337 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1338 }
34390
28f84938468d Factor out the code for making a dialect instance.
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34389
diff changeset
1339 self->dialect = (DialectObj *)_call_dialect(dialect, keyword_args);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1340 if (self->dialect == NULL) {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1341 Py_DECREF(self);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1342 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1343 }
34381
4bd180d171cc Add missing PyObject_GC_Track and PyObject_GC_UnTrack calls to csv reader and
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34380
diff changeset
1344 PyObject_GC_Track(self);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1345 return (PyObject *)self;
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 /*
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1349 * DIALECT REGISTRY
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1350 */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1351 static PyObject *
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1352 csv_list_dialects(PyObject *module, PyObject *args)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1353 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1354 return PyDict_Keys(dialects);
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
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1357 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
1358 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
1359 {
34391
0a1608a5eb05 Allow dialect-describing keywords to be supplied to register_dialect,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34390
diff changeset
1360 PyObject *name_obj, *dialect_obj = NULL;
0a1608a5eb05 Allow dialect-describing keywords to be supplied to register_dialect,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34390
diff changeset
1361 PyObject *dialect;
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1362
34391
0a1608a5eb05 Allow dialect-describing keywords to be supplied to register_dialect,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34390
diff changeset
1363 if (!PyArg_UnpackTuple(args, "", 1, 2, &name_obj, &dialect_obj))
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1364 return NULL;
34385
3533e3cb7b97 Where a string is desired, test for PyBaseString_Type derived type,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34381
diff changeset
1365 if (!IS_BASESTRING(name_obj)) {
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1366 PyErr_SetString(PyExc_TypeError,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1367 "dialect name must be a string or unicode");
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1368 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1369 }
34391
0a1608a5eb05 Allow dialect-describing keywords to be supplied to register_dialect,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34390
diff changeset
1370 dialect = _call_dialect(dialect_obj, kwargs);
0a1608a5eb05 Allow dialect-describing keywords to be supplied to register_dialect,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34390
diff changeset
1371 if (dialect == NULL)
0a1608a5eb05 Allow dialect-describing keywords to be supplied to register_dialect,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34390
diff changeset
1372 return NULL;
0a1608a5eb05 Allow dialect-describing keywords to be supplied to register_dialect,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34390
diff changeset
1373 if (PyDict_SetItem(dialects, name_obj, dialect) < 0) {
0a1608a5eb05 Allow dialect-describing keywords to be supplied to register_dialect,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34390
diff changeset
1374 Py_DECREF(dialect);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1375 return NULL;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1376 }
34391
0a1608a5eb05 Allow dialect-describing keywords to be supplied to register_dialect,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34390
diff changeset
1377 Py_DECREF(dialect);
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1378 Py_INCREF(Py_None);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1379 return Py_None;
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
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1382 static PyObject *
28591
883a694795f5 tighten up string checks
Skip Montanaro <skip@pobox.com>
parents: 28590
diff changeset
1383 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
1384 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1385 if (PyDict_DelItem(dialects, name_obj) < 0)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1386 return PyErr_Format(error_obj, "unknown dialect");
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1387 Py_INCREF(Py_None);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1388 return Py_None;
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
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1391 static PyObject *
28591
883a694795f5 tighten up string checks
Skip Montanaro <skip@pobox.com>
parents: 28590
diff changeset
1392 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
1393 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1394 return get_dialect_from_registry(name_obj);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1395 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1396
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
1397 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
1398 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
1399 {
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
1400 PyObject *new_limit = NULL;
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 long old_limit = field_limit;
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
1402
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
1403 if (!PyArg_UnpackTuple(args, "field_size_limit", 0, 1, &new_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
1404 return NULL;
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
1405 if (new_limit != NULL) {
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
1406 if (!PyInt_Check(new_limit)) {
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
1407 PyErr_Format(PyExc_TypeError,
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
1408 "limit must be an integer");
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
1409 return NULL;
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
1410 }
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
1411 field_limit = PyInt_AsLong(new_limit);
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
1412 }
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
1413 return PyInt_FromLong(old_limit);
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
1414 }
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
1415
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1416 /*
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1417 * MODULE
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1418 */
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 PyDoc_STRVAR(csv_module_doc,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1421 "CSV parsing and writing.\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1422 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1423 "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
1424 "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
1425 "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
1426 "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
1427 "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
1428 "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
1429 "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
1430 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1431 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1432 "DIALECT REGISTRATION:\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 "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
1435 "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
1436 "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
1437 "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
1438 "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
1439 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1440 " class excel:\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1441 " delimiter = ','\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1442 " quotechar = '\"'\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1443 " escapechar = None\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1444 " doublequote = True\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1445 " skipinitialspace = False\n"
33134
fc1637fc4588 Quote \r\n correctly, remove random indentation (patch #1009384). Thanks
Johannes Gijsbers <jlg@dds.nl>
parents: 32389
diff changeset
1446 " lineterminator = '\\r\\n'\n"
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1447 " quoting = QUOTE_MINIMAL\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1448 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1449 "SETTINGS:\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1450 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1451 " * 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
1452 " quoting character. It defaults to '\"'.\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1453 " * 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
1454 " field separator. It defaults to ','.\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1455 " * 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
1456 " 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
1457 " 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
1458 " of the following field.\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1459 " * 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
1460 " terminate rows.\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1461 " * 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
1462 " 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
1463 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1464 " 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
1465 " 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
1466 " 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
1467 " csv.QUOTE_NONNUMERIC means that quotes are always placed around\n"
31074
48695c839d98 doc nit
Skip Montanaro <skip@pobox.com>
parents: 29389
diff changeset
1468 " fields which do not parse as integers or floating point\n"
48695c839d98 doc nit
Skip Montanaro <skip@pobox.com>
parents: 29389
diff changeset
1469 " numbers.\n"
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1470 " 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
1471 " * 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
1472 " 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
1473 " * 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
1474 " 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
1475 " 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
1476 " written as two quotes\n");
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1477
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1478 PyDoc_STRVAR(csv_reader_doc,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1479 " csv_reader = reader(iterable [, dialect='excel']\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1480 " [optional keyword args])\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1481 " for row in csv_reader:\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1482 " process(row)\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1483 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1484 "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
1485 "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
1486 "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
1487 "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
1488 "provided by the dialect.\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1489 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1490 "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
1491 "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
1492
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1493 PyDoc_STRVAR(csv_writer_doc,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1494 " 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
1495 " [optional keyword args])\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1496 " for row in csv_writer:\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1497 " csv_writer.writerow(row)\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1498 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1499 " [or]\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1500 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1501 " 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
1502 " [optional keyword args])\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1503 " csv_writer.writerows(rows)\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1504 "\n"
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1505 "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
1506
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1507 PyDoc_STRVAR(csv_list_dialects_doc,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1508 "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
1509 " names = csv.list_dialects()");
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1510
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1511 PyDoc_STRVAR(csv_get_dialect_doc,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1512 "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
1513 " dialect = csv.get_dialect(name)");
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1514
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1515 PyDoc_STRVAR(csv_register_dialect_doc,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1516 "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
1517 " dialect = csv.register_dialect(name, dialect)");
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1518
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1519 PyDoc_STRVAR(csv_unregister_dialect_doc,
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1520 "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
1521 " csv.unregister_dialect(name)");
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1522
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
1523 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
1524 "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
1525 " 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
1526 "\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
1527 "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
1528 "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
1529
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1530 static struct PyMethodDef csv_methods[] = {
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
1531 { "reader", (PyCFunction)csv_reader,
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 METH_VARARGS | METH_KEYWORDS, csv_reader_doc},
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
1533 { "writer", (PyCFunction)csv_writer,
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
1534 METH_VARARGS | METH_KEYWORDS, csv_writer_doc},
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
1535 { "list_dialects", (PyCFunction)csv_list_dialects,
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
1536 METH_NOARGS, csv_list_dialects_doc},
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
1537 { "register_dialect", (PyCFunction)csv_register_dialect,
34391
0a1608a5eb05 Allow dialect-describing keywords to be supplied to register_dialect,
Andrew McNamara <andrewm@object-craft.com.au>
parents: 34390
diff changeset
1538 METH_VARARGS | METH_KEYWORDS, csv_register_dialect_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
1539 { "unregister_dialect", (PyCFunction)csv_unregister_dialect,
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
1540 METH_O, csv_unregister_dialect_doc},
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
1541 { "get_dialect", (PyCFunction)csv_get_dialect,
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
1542 METH_O, csv_get_dialect_doc},
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
1543 { "field_size_limit", (PyCFunction)csv_field_size_limit,
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
1544 METH_VARARGS, 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
1545 { NULL, NULL }
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1546 };
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1547
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1548 PyMODINIT_FUNC
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1549 init_csv(void)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1550 {
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1551 PyObject *module;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1552 StyleDesc *style;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1553
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1554 if (PyType_Ready(&Dialect_Type) < 0)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1555 return;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1556
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1557 if (PyType_Ready(&Reader_Type) < 0)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1558 return;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1559
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1560 if (PyType_Ready(&Writer_Type) < 0)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1561 return;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1562
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1563 /* Create the module and add the functions */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1564 module = Py_InitModule3("_csv", csv_methods, csv_module_doc);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1565 if (module == NULL)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1566 return;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1567
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1568 /* Add version to the module. */
28592
ef05f981bc4b use PyModule_Add{Int,String}Constant() where appropriate
Skip Montanaro <skip@pobox.com>
parents: 28591
diff changeset
1569 if (PyModule_AddStringConstant(module, "__version__",
ef05f981bc4b use PyModule_Add{Int,String}Constant() where appropriate
Skip Montanaro <skip@pobox.com>
parents: 28591
diff changeset
1570 MODULE_VERSION) == -1)
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1571 return;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1572
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1573 /* Add _dialects dictionary */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1574 dialects = PyDict_New();
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1575 if (dialects == NULL)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1576 return;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1577 if (PyModule_AddObject(module, "_dialects", dialects))
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1578 return;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1579
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1580 /* Add quote styles into dictionary */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1581 for (style = quote_styles; style->name; style++) {
28592
ef05f981bc4b use PyModule_Add{Int,String}Constant() where appropriate
Skip Montanaro <skip@pobox.com>
parents: 28591
diff changeset
1582 if (PyModule_AddIntConstant(module, style->name,
ef05f981bc4b use PyModule_Add{Int,String}Constant() where appropriate
Skip Montanaro <skip@pobox.com>
parents: 28591
diff changeset
1583 style->style) == -1)
28339
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1584 return;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1585 }
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1586
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1587 /* Add the Dialect type */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1588 if (PyModule_AddObject(module, "Dialect", (PyObject *)&Dialect_Type))
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1589 return;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1590
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1591 /* Add the CSV exception object to the module. */
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1592 error_obj = PyErr_NewException("_csv.Error", NULL, NULL);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1593 if (error_obj == NULL)
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1594 return;
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1595 PyModule_AddObject(module, "Error", error_obj);
cc35ed2b26a8 new CSV file processing module - see PEP 305
Skip Montanaro <skip@pobox.com>
parents:
diff changeset
1596 }