SF patch #907403:  Improvements to cStringIO.writelines()

The writelines() method now accepts any iterable argument and writes
the lines one at a time rather than using ''.join(lines) followed by
a single write.  Results in considerable memory savings and makes
the method suitable for use with generator expressions.
diff --git a/Modules/cStringIO.c b/Modules/cStringIO.c
index 4ec5e88..1420bce 100644
--- a/Modules/cStringIO.c
+++ b/Modules/cStringIO.c
@@ -416,40 +416,35 @@
         return Py_None;
 }
 
-
 PyDoc_STRVAR(O_writelines__doc__,
-"writelines(sequence_of_strings): write each string");
+"writelines(sequence_of_strings) -> None.  Write the strings to the file.\n"
+"\n"
+"Note that newlines are not added.  The sequence can be any iterable object\n"
+"producing strings. This is equivalent to calling write() for each string.");
 static PyObject *
 O_writelines(Oobject *self, PyObject *args) {
-        PyObject *tmp = 0;
-	static PyObject *joiner = NULL;
-
-	if (!joiner) {
-		PyObject *empty_string = PyString_FromString("");
-		if (empty_string == NULL)
-			return NULL;
-		joiner = PyObject_GetAttrString(empty_string, "join");
-		Py_DECREF(empty_string);
-		if (joiner == NULL)
-			return NULL;
-	}
-
-        if (PyObject_Size(args) < 0) return NULL;
-
-	args = PyTuple_Pack(1, args);
-	if (args == NULL)
+	PyObject *it, *s;
+	
+	it = PyObject_GetIter(args);
+	if (it == NULL)
 		return NULL;
-	tmp = PyObject_Call(joiner, args, NULL);
-	Py_DECREF(args);
-        UNLESS (tmp) return NULL;
-
-        args = PyTuple_Pack(1, tmp);
-        Py_DECREF(tmp);
-        UNLESS (args) return NULL;
-
-        tmp = O_write(self, args);
-        Py_DECREF(args);
-        return tmp;
+	while ((s = PyIter_Next(it)) != NULL) {
+		int n;
+		char *c;
+		if (PyString_AsStringAndSize(s, &c, &n) == -1) {
+			Py_DECREF(it);
+			Py_DECREF(s);
+			return NULL;
+		}
+		if (O_cwrite((PyObject *)self, c, n) == -1) {
+			Py_DECREF(it);
+			Py_DECREF(s);
+			return NULL;
+		}
+		Py_DECREF(s);
+	}
+	Py_DECREF(it);
+	Py_RETURN_NONE;
 }
 
 static struct PyMethodDef O_methods[] = {