My own patch: support writable 'softspace' attribute.
diff --git a/Modules/cStringIO.c b/Modules/cStringIO.c
index 107f889..104ab51 100644
--- a/Modules/cStringIO.c
+++ b/Modules/cStringIO.c
@@ -58,6 +58,9 @@
 
 
   $Log$
+  Revision 2.5  1997/04/11 19:56:06  guido
+  My own patch: support writable 'softspace' attribute.
+
   Revision 2.4  1997/04/09 17:35:33  guido
   Unknown changes by Jim Fulton.
 
@@ -154,7 +157,7 @@
 typedef struct {
   PyObject_HEAD
   char *buf;
-  int pos, string_size, buf_size, closed;
+  int pos, string_size, buf_size, closed, softspace;
 } Oobject;
 
 staticforward PyTypeObject Otype;
@@ -453,6 +456,7 @@
   self->pos=0;
   self->closed = 0;
   self->string_size = 0;
+  self->softspace = 0;
 
   UNLESS(self->buf=malloc(size*sizeof(char)))
     {
@@ -474,9 +478,26 @@
 
 static PyObject *
 O_getattr(Oobject *self, char *name) {
+  if (strcmp(name, "softspace") == 0) {
+	  return PyInt_FromLong(self->softspace);
+  }
   return Py_FindMethod(O_methods, (PyObject *)self, name);
 }
 
+static int
+O_setattr(Oobject *self, char *name, PyObject *value) {
+	long x;
+	if (strcmp(name, "softspace") != 0) {
+		PyErr_SetString(PyExc_AttributeError, name);
+		return -1;
+	}
+	x = PyInt_AsLong(value);
+	if (x == -1 && PyErr_Occurred())
+		return -1;
+	self->softspace = x;
+	return 0;
+}
+
 static char Otype__doc__[] = 
 "Simple type for output to strings."
 ;
@@ -491,7 +512,7 @@
   (destructor)O_dealloc,	/*tp_dealloc*/
   (printfunc)0,		/*tp_print*/
   (getattrfunc)O_getattr,	/*tp_getattr*/
-  (setattrfunc)0,		/*tp_setattr*/
+  (setattrfunc)O_setattr,	/*tp_setattr*/
   (cmpfunc)0,		/*tp_compare*/
   (reprfunc)0,		/*tp_repr*/
   0,			/*tp_as_number*/