[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, &quoted, 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, &quoted, 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, &quoted, 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,
  					&quotechar, &self->delimiter,
--- 848,853 ----
  	self->num_fields = 0;
  
  	quotechar = escapechar = NULL;
! 	if (PyArg_ParseTupleAndKeywords(args, keyword_args, "|OcOiSiiii",
  					keywords,
  					&quotechar, &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");