annotate Modules/_csv.c @ 78088:eaafae4e275e

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