[Python-checkins] python/dist/src/Modules _csv.c,1.32,1.33

andrewmcnamara at users.sourceforge.net andrewmcnamara at users.sourceforge.net
Wed Jan 12 10:45:50 CET 2005


Update of /cvsroot/python/python/dist/src/Modules
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9797/Modules

Modified Files:
	_csv.c 
Log Message:
When quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
to floats.


Index: _csv.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/_csv.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- _csv.c	12 Jan 2005 08:16:06 -0000	1.32
+++ _csv.c	12 Jan 2005 09:45:16 -0000	1.33
@@ -97,6 +97,7 @@
 	int field_size;		/* size of allocated buffer */
 	int field_len;		/* length of current field */
 	int had_parse_error;	/* did we have a parse error? */
+	int numeric_field;	/* treat field as numeric */
 } ReaderObj;
 
 staticforward PyTypeObject Reader_Type;
@@ -495,17 +496,30 @@
 	return dialect;
 }
 
-static void
+static int
 parse_save_field(ReaderObj *self)
 {
 	PyObject *field;
 
 	field = PyString_FromStringAndSize(self->field, self->field_len);
-	if (field != NULL) {
-		PyList_Append(self->fields, field);
-		Py_XDECREF(field);
-	}
+	if (field == NULL)
+		return -1;
 	self->field_len = 0;
+	if (self->numeric_field) {
+		PyObject *tmp;
+
+		self->numeric_field = 0;
+		tmp = PyNumber_Float(field);
+		if (tmp == NULL) {
+			Py_DECREF(field);
+			return -1;
+		}
+		Py_DECREF(field);
+		field = tmp;
+	}
+	PyList_Append(self->fields, field);
+	Py_DECREF(field);
+	return 0;
 }
 
 static int
@@ -529,6 +543,22 @@
 }
 
 static int
+parse_reset(ReaderObj *self)
+{
+	if (self->fields) {
+		Py_DECREF(self->fields);
+	}
+	self->fields = PyList_New(0);
+	if (self->fields == NULL)
+		return -1;
+	self->field_len = 0;
+	self->state = START_RECORD;
+	self->had_parse_error = 0;
+	self->numeric_field = 0;
+	return 0;
+}
+
+static int
 parse_add_char(ReaderObj *self, char c)
 {
 	if (self->field_len >= field_limit) {
@@ -560,7 +590,8 @@
 		/* expecting field */
 		if (c == '\n') {
 			/* save empty field - return [fields] */
-			parse_save_field(self);
+			if (parse_save_field(self) < 0)
+				return -1;
 			self->state = START_RECORD;
 		}
 		else if (c == dialect->quotechar && 
@@ -577,10 +608,13 @@
 			;
 		else if (c == dialect->delimiter) {
 			/* save empty field */
-			parse_save_field(self);
+			if (parse_save_field(self) < 0)
+				return -1;
 		}
 		else {
 			/* begin new unquoted field */
+			if (dialect->quoting == QUOTE_NONNUMERIC)
+				self->numeric_field = 1;
 			if (parse_add_char(self, c) < 0)
 				return -1;
 			self->state = IN_FIELD;
@@ -597,7 +631,8 @@
 		/* in unquoted field */
 		if (c == '\n') {
 			/* end of line - return [fields] */
-			parse_save_field(self);
+			if (parse_save_field(self) < 0)
+				return -1;
 			self->state = START_RECORD;
 		}
 		else if (c == dialect->escapechar) {
@@ -606,7 +641,8 @@
 		}
 		else if (c == dialect->delimiter) {
 			/* save field - wait for new field */
-			parse_save_field(self);
+			if (parse_save_field(self) < 0)
+				return -1;
 			self->state = START_FIELD;
 		}
 		else {
@@ -662,12 +698,14 @@
 		}
 		else if (c == dialect->delimiter) {
 			/* save field - wait for new field */
-			parse_save_field(self);
+			if (parse_save_field(self) < 0)
+				return -1;
 			self->state = START_FIELD;
 		}
 		else if (c == '\n') {
 			/* end of line - return [fields] */
-			parse_save_field(self);
+			if (parse_save_field(self) < 0)
+				return -1;
 			self->state = START_RECORD;
 		}
 		else if (!dialect->strict) {
@@ -716,15 +754,11 @@
                         return NULL;
                 }
 
-                if (self->had_parse_error) {
-                        if (self->fields) {
-                                Py_XDECREF(self->fields);
-                        }
-                        self->fields = PyList_New(0);
-                        self->field_len = 0;
-                        self->state = START_RECORD;
-                        self->had_parse_error = 0;
-                }
+                if (self->had_parse_error)
+			if (parse_reset(self) < 0) {
+				Py_DECREF(lineobj);
+				return NULL;
+			}
                 line = PyString_AsString(lineobj);
 
                 if (line == NULL) {
@@ -886,15 +920,15 @@
                 return NULL;
 
         self->dialect = NULL;
-        self->input_iter = self->fields = NULL;
-
         self->fields = NULL;
         self->input_iter = NULL;
-	self->had_parse_error = 0;
 	self->field = NULL;
 	self->field_size = 0;
-	self->field_len = 0;
-	self->state = START_RECORD;
+
+	if (parse_reset(self) < 0) {
+                Py_DECREF(self);
+                return NULL;
+	}
 
 	if (!PyArg_UnpackTuple(args, "", 1, 2, &iterator, &dialect)) {
                 Py_DECREF(self);
@@ -912,11 +946,6 @@
                 Py_DECREF(self);
                 return NULL;
         }
-	self->fields = PyList_New(0);
-	if (self->fields == NULL) {
-		Py_DECREF(self);
-		return NULL;
-	}
 
 	PyObject_GC_Track(self);
         return (PyObject *)self;



More information about the Python-checkins mailing list