[Python-checkins] python/nondist/sandbox/csv _csv.c,1.8,1.9
davecole@users.sourceforge.net
davecole@users.sourceforge.net
Sun, 02 Feb 2003 03:55:43 -0800
Update of /cvsroot/python/python/nondist/sandbox/csv
In directory sc8-pr-cvs1:/tmp/cvs-serv11819
Modified Files:
_csv.c
Log Message:
Fixed refcount bug in constructor regarding lineterminator string.
Implemented lineterminator functionality - appends lineterminator to
end of joined record. Not sure what to do with \n which do not match
the lineterminator string...
Index: _csv.c
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/csv/_csv.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** _csv.c 2 Feb 2003 11:14:28 -0000 1.8
--- _csv.c 2 Feb 2003 11:55:41 -0000 1.9
***************
*** 486,499 ****
static int
! join_append(ParserObj *self, char *field, int quote_empty)
{
- int rec_len, quoted;
-
- quoted = 0;
- rec_len = join_append_data(self, field, quote_empty, "ed, 0);
- if (rec_len < 0)
- return 0;
-
- /* grow record buffer if necessary */
if (rec_len > self->rec_size) {
if (self->rec_size == 0) {
--- 486,491 ----
static int
! join_check_rec_size(ParserObj *self, int rec_len)
{
if (rec_len > self->rec_size) {
if (self->rec_size == 0) {
***************
*** 514,517 ****
--- 506,525 ----
}
}
+ return 1;
+ }
+
+ static int
+ join_append(ParserObj *self, char *field, int quote_empty)
+ {
+ int rec_len, quoted;
+
+ quoted = 0;
+ rec_len = join_append_data(self, field, quote_empty, "ed, 0);
+ if (rec_len < 0)
+ return 0;
+
+ /* grow record buffer if necessary */
+ if (!join_check_rec_size(self, rec_len))
+ return 0;
self->rec_len = join_append_data(self, field, quote_empty, "ed, 1);
***************
*** 521,524 ****
--- 529,550 ----
}
+ static int
+ join_append_lineterminator(ParserObj *self)
+ {
+ int terminator_len;
+
+ terminator_len = PyString_Size(self->lineterminator);
+
+ /* grow record buffer if necessary */
+ if (!join_check_rec_size(self, self->rec_len + terminator_len))
+ return 0;
+
+ memmove(self->rec + self->rec_len,
+ PyString_AsString(self->lineterminator), terminator_len);
+ self->rec_len += terminator_len;
+
+ return 1;
+ }
+
static PyObject *
join_string(ParserObj *self)
***************
*** 548,551 ****
--- 574,579 ----
return NULL;
+ /* Join all fields in internal buffer.
+ */
join_reset(self);
for (i = 0; i < len; i++) {
***************
*** 580,583 ****
--- 608,616 ----
}
+ /* Add line terminator.
+ */
+ if (!join_append_lineterminator(self))
+ return 0;
+
return join_string(self);
}
***************
*** 691,694 ****
--- 724,731 ----
return 0;
}
+ else if (strcmp(name, "lineterminator") == 0 && !PyString_Check(v)) {
+ PyErr_BadArgument();
+ return -1;
+ }
else
return PyMember_Set((char *)self, Parser_memberlist, name, v);
***************
*** 788,792 ****
self->have_escapechar = 0;
self->skipinitialspace = 0;
! self->lineterminator = PyString_FromString("\r\n");
self->quoting = QUOTE_MINIMAL;
self->doublequote = 1;
--- 825,829 ----
self->have_escapechar = 0;
self->skipinitialspace = 0;
! self->lineterminator = NULL;
self->quoting = QUOTE_MINIMAL;
self->doublequote = 1;
***************
*** 796,799 ****
--- 833,841 ----
self->state = START_RECORD;
self->fields = PyList_New(0);
+ if (self->fields == NULL) {
+ Py_DECREF(self);
+ return NULL;
+ }
+
self->had_parse_error = 0;
self->field = NULL;
***************
*** 806,816 ****
self->num_fields = 0;
- if (self->lineterminator == NULL || self->fields == NULL) {
- Py_DECREF(self);
- return NULL;
- }
-
quotechar = escapechar = NULL;
! if (PyArg_ParseTupleAndKeywords(args, keyword_args, "|OcOiOiiii",
keywords,
"echar, &self->delimiter,
--- 848,853 ----
self->num_fields = 0;
quotechar = escapechar = NULL;
! if (PyArg_ParseTupleAndKeywords(args, keyword_args, "|OcOiSiiii",
keywords,
"echar, &self->delimiter,
***************
*** 823,826 ****
--- 860,869 ----
&& !_set_char_attr(&self->escapechar,
&self->have_escapechar, escapechar)) {
+ if (self->lineterminator == NULL)
+ self->lineterminator = PyString_FromString("\r\n");
+ else {
+ Py_INCREF(self->lineterminator);
+ }
+
if (self->quoting < 0 || self->quoting > QUOTE_NONE)
PyErr_SetString(PyExc_ValueError, "bad quoting value");