Jim's latest version.
diff --git a/Modules/cStringIO.c b/Modules/cStringIO.c
index e9f8033..f2750cc 100644
--- a/Modules/cStringIO.c
+++ b/Modules/cStringIO.c
@@ -58,8 +58,24 @@
 
 
   $Log$
-  Revision 2.1  1996/12/05 23:30:40  guido
-  Jim F's brainchild
+  Revision 2.2  1997/01/06 22:57:52  guido
+  Jim's latest version.
+
+  Revision 1.10  1997/01/02 15:19:55  chris
+  checked in to be sure repository is up to date.
+
+  Revision 1.9  1996/12/27 21:40:29  jim
+  Took out some lamosities in interface, like returning self from
+  write.
+
+  Revision 1.8  1996/12/23 15:52:49  jim
+  Added ifdef to check for CObject before using it.
+
+  Revision 1.7  1996/12/23 15:22:35  jim
+  Finished implementation, adding full compatibility with StringIO, and
+  then some.
+
+  We still need to take out some cStringIO oddities.
 
   Revision 1.6  1996/10/15 18:42:07  jim
   Added lots of casts to make warnings go away.
@@ -114,6 +130,14 @@
 
 static PyObject *ErrorObject;
 
+#ifdef __cplusplus
+#define ARG(T,N) T N
+#define ARGDECL(T,N)
+#else
+#define ARG(T,N) N
+#define ARGDECL(T,N) T N;
+#endif
+
 #define ASSIGN(V,E) {PyObject *__e; __e=(E); Py_XDECREF(V); (V)=__e;}
 #define UNLESS(E) if(!(E))
 #define UNLESS_ASSIGN(V,E) ASSIGN(V,E) UNLESS(V)
@@ -153,7 +177,9 @@
 ;
 
 static PyObject *
-O_reset(Oobject *self, PyObject *args)
+O_reset(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   self->pos = 0;
 
@@ -166,7 +192,9 @@
 "tell() -- get the current position.";
 
 static PyObject *
-O_tell(Oobject *self, PyObject *args)
+O_tell(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   return PyInt_FromLong(self->pos);
 }
@@ -177,7 +205,9 @@
 "seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF";
 
 static PyObject *
-O_seek(Oobject *self, PyObject *args)
+O_seek(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   int position, mode = 0;
 
@@ -198,7 +228,8 @@
   self->pos = (position > self->string_size ? self->string_size : 
 	       (position < 0 ? 0 : position));
 
-  return PyInt_FromLong(self->pos);
+  Py_INCREF(Py_None);
+  return Py_None;
 }
 
 static char O_read__doc__[] = 
@@ -206,7 +237,10 @@
 ;
 
 static int
-O_cread(Oobject *self, char **output, int n)
+O_cread(ARG(Oobject*, self), ARG(char**, output), ARG(int, n))
+    ARGDECL(Oobject*, self)
+    ARGDECL(char**, output)
+    ARGDECL(int, n)
 {
   int l;
 
@@ -222,7 +256,9 @@
 }
 
 static PyObject *
-O_read(Oobject *self, PyObject *args)
+O_read(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   int n = -1;
   char *output;
@@ -240,7 +276,9 @@
 ;
 
 static int
-O_creadline(Oobject *self, char **output)
+O_creadline(ARG(Oobject*, self), ARG(char**, output))
+    ARGDECL(Oobject*, self)
+    ARGDECL(char**, output)
 {
   char *n, *s;
   int l;
@@ -256,7 +294,9 @@
 }
 
 static PyObject *
-O_readline(Oobject *self, PyObject *args)
+O_readline(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   int n;
   char *output;
@@ -272,9 +312,15 @@
 
 
 static int
-O_cwrite(Oobject *self, char *c, int l)
+O_cwrite(ARG(Oobject*, self), ARG(char*, c), ARG(int, l))
+    ARGDECL(Oobject*, self)
+    ARGDECL(char*, c)
+    ARGDECL(int, l)
 {
-  int newl;
+  PyObject *s;
+  char *b;
+  int newl, space_needed;
+
   newl=self->pos+l;
   if(newl > self->buf_size)
     {
@@ -301,40 +347,27 @@
 }
 
 static PyObject *
-O_write(Oobject *self, PyObject *args)
+O_write(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   PyObject *s;
-  char *c;
-  int l;
+  char *c, *b;
+  int l, newl, space_needed;
 
   UNLESS(PyArg_Parse(args, "O", &s)) return NULL;
-  if(s!=Py_None)
-    {
-      UNLESS(-1 != (l=PyString_Size(s))) return NULL;
-      UNLESS(c=PyString_AsString(s)) return NULL;
-      UNLESS(-1 != O_cwrite(self,c,l)) return NULL;
-    }
-  else
-    {
-      self->pos=0;
-      self->string_size = 0;
-    }
+  UNLESS(-1 != (l=PyString_Size(s))) return NULL;
+  UNLESS(c=PyString_AsString(s)) return NULL;
+  UNLESS(-1 != O_cwrite(self,c,l)) return NULL;
 
-  Py_INCREF(self);
-  return (PyObject *)self;
+  Py_INCREF(Py_None);
+  return Py_None;
 }
 
 static PyObject *
-O_repr(self)
-	Oobject *self;
-{
-  return PyString_FromStringAndSize(self->buf,self->string_size);
-}
-
-static PyObject *
-O_getval(self,args)
-	Oobject *self;
-	PyObject *args;
+O_getval(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   return PyString_FromStringAndSize(self->buf,self->pos);
 }
@@ -343,9 +376,9 @@
 "truncate(): truncate the file at the current position.";
 
 static PyObject *
-O_truncate(self, args)
-           Oobject *self;
-           PyObject *args;
+O_truncate(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   self->string_size = self->pos;
   Py_INCREF(Py_None);
@@ -355,9 +388,9 @@
 static char O_isatty__doc__[] = "isatty(): always returns 0";
 
 static PyObject *
-O_isatty(self, args)
-           Oobject *self;
-           PyObject *args;
+O_isatty(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   return PyInt_FromLong(0);
 }
@@ -365,9 +398,9 @@
 static char O_close__doc__[] = "close(): explicitly release resources held.";
 
 static PyObject *
-O_close(self, args)
-        Oobject *self;
-        PyObject *args;
+O_close(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   free(self->buf);
 
@@ -381,9 +414,9 @@
 static char O_flush__doc__[] = "flush(): does nothing.";
 
 static PyObject *
-O_flush(self, args)
-        Oobject *self;
-        PyObject *args;
+O_flush(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   Py_INCREF(Py_None);
   return Py_None;
@@ -392,9 +425,9 @@
 
 static char O_writelines__doc__[] = "blah";
 static PyObject *
-O_writelines(self, args)
-             Oobject *self;
-             PyObject *args;
+O_writelines(ARG(Oobject*, self), ARG(PyObject*, args))
+    ARGDECL(Oobject*, self)
+    ARGDECL(PyObject*, args)
 {
   PyObject *string_module = 0;
   static PyObject *string_joinfields = 0;
@@ -449,7 +482,8 @@
 
 
 static Oobject *
-newOobject(int size)
+newOobject(ARG(int, size))
+    ARGDECL(int, size)
 {
   Oobject *self;
 	
@@ -473,17 +507,17 @@
 
 
 static void
-O_dealloc(self)
-	Oobject *self;
+O_dealloc(ARG(Oobject*, self))
+    ARGDECL(Oobject*, self)
 {
   free(self->buf);
   PyMem_DEL(self);
 }
 
 static PyObject *
-O_getattr(self, name)
-	Oobject *self;
-	char *name;
+O_getattr(ARG(Oobject*, self), ARG(char*, name))
+    ARGDECL(Oobject*, self)
+    ARGDECL(char*, name)
 {
   return Py_FindMethod(O_methods, (PyObject *)self, name);
 }
@@ -494,36 +528,36 @@
 
 static PyTypeObject Otype = {
 	PyObject_HEAD_INIT(&PyType_Type)
-	0,				/*ob_size*/
-	"StringO",			/*tp_name*/
-	sizeof(Oobject),		/*tp_basicsize*/
-	0,				/*tp_itemsize*/
+	0,	       		/*ob_size*/
+	"StringO",     		/*tp_name*/
+	sizeof(Oobject),       	/*tp_basicsize*/
+	0,	       		/*tp_itemsize*/
 	/* methods */
 	(destructor)O_dealloc,	/*tp_dealloc*/
 	(printfunc)0,		/*tp_print*/
 	(getattrfunc)O_getattr,	/*tp_getattr*/
-	(setattrfunc)0,	/*tp_setattr*/
+	(setattrfunc)0,		/*tp_setattr*/
 	(cmpfunc)0,		/*tp_compare*/
-	(reprfunc)O_repr,		/*tp_repr*/
+	(reprfunc)0,		/*tp_repr*/
 	0,			/*tp_as_number*/
-	0,		/*tp_as_sequence*/
-	0,		/*tp_as_mapping*/
+	0,			/*tp_as_sequence*/
+	0,			/*tp_as_mapping*/
 	(hashfunc)0,		/*tp_hash*/
 	(ternaryfunc)0,		/*tp_call*/
 	(reprfunc)0,		/*tp_str*/
 
 	/* Space for future expansion */
 	0L,0L,0L,0L,
-	Otype__doc__ /* Documentation string */
+	Otype__doc__ 		/* Documentation string */
 };
 
 /* End of code for StringO objects */
 /* -------------------------------------------------------- */
 
 static PyObject *
-I_close(self, args)
-        Iobject *self;
-        PyObject *args;
+I_close(ARG(Iobject*, self), ARG(PyObject*, args))
+    ARGDECL(Iobject*, self)
+    ARGDECL(PyObject*, args)
 {
   Py_DECREF(self->pbuf);
 
@@ -551,7 +585,8 @@
 
 
 static Iobject *
-newIobject(PyObject *s)
+newIobject(ARG(PyObject*, s))
+    ARGDECL(PyObject*, s)
 {
   Iobject *self;
   char *buf;
@@ -572,17 +607,17 @@
 
 
 static void
-I_dealloc(self)
-	Iobject *self;
+I_dealloc(ARG(Iobject*, self))
+    ARGDECL(Iobject*, self)
 {
   Py_DECREF(self->pbuf);
   PyMem_DEL(self);
 }
 
 static PyObject *
-I_getattr(self, name)
-	Iobject *self;
-	char *name;
+I_getattr(ARG(Iobject*, self), ARG(char*, name))
+    ARGDECL(Iobject*, self)
+    ARGDECL(char*, name)
 {
   return Py_FindMethod(I_methods, (PyObject *)self, name);
 }
@@ -593,27 +628,27 @@
 
 static PyTypeObject Itype = {
 	PyObject_HEAD_INIT(&PyType_Type)
-	0,				/*ob_size*/
-	"StringI",			/*tp_name*/
-	sizeof(Iobject),		/*tp_basicsize*/
-	0,				/*tp_itemsize*/
+	0,		       	/*ob_size*/
+	"StringI",	       	/*tp_name*/
+	sizeof(Iobject),       	/*tp_basicsize*/
+	0,		       	/*tp_itemsize*/
 	/* methods */
 	(destructor)I_dealloc,	/*tp_dealloc*/
 	(printfunc)0,		/*tp_print*/
 	(getattrfunc)I_getattr,	/*tp_getattr*/
-	(setattrfunc)0,	/*tp_setattr*/
+	(setattrfunc)0,		/*tp_setattr*/
 	(cmpfunc)0,		/*tp_compare*/
 	(reprfunc)0,		/*tp_repr*/
 	0,			/*tp_as_number*/
-	0,		/*tp_as_sequence*/
-	0,		/*tp_as_mapping*/
+	0,			/*tp_as_sequence*/
+	0,			/*tp_as_mapping*/
 	(hashfunc)0,		/*tp_hash*/
 	(ternaryfunc)0,		/*tp_call*/
 	(reprfunc)0,		/*tp_str*/
 
 	/* Space for future expansion */
 	0L,0L,0L,0L,
-	Itype__doc__ /* Documentation string */
+	Itype__doc__ 		/* Documentation string */
 };
 
 /* End of code for StringI objects */
@@ -625,9 +660,9 @@
 ;
 
 static PyObject *
-IO_StringIO(self, args)
-	PyObject *self;	/* Not used */
-	PyObject *args;
+IO_StringIO(ARG(PyObject*, self), ARG(PyObject*, args))
+    ARGDECL(PyObject*, self)
+    ARGDECL(PyObject*, args)
 {
   PyObject *s=0;
 
@@ -639,8 +674,8 @@
 /* List of methods defined in the module */
 
 static struct PyMethodDef IO_methods[] = {
-	{"StringIO",	(PyCFunction)IO_StringIO,	1,	IO_StringIO__doc__},
-	{NULL,		NULL}		/* sentinel */
+  {"StringIO",	(PyCFunction)IO_StringIO,	1,	IO_StringIO__doc__},
+  {NULL,		NULL}		/* sentinel */
 };
 
 
@@ -661,12 +696,15 @@
   ErrorObject = PyString_FromString("cStringIO.error");
   PyDict_SetItemString(d, "error", ErrorObject);
   
+#ifdef Py_COBJECT_H
+  /* Export C API */
   PyDict_SetItemString(d,"cread", PyCObject_FromVoidPtr(O_cread,NULL));
   PyDict_SetItemString(d,"creadline", PyCObject_FromVoidPtr(O_creadline,NULL));
   PyDict_SetItemString(d,"cwrite", PyCObject_FromVoidPtr(O_cwrite,NULL));
   PyDict_SetItemString(d,"cgetvalue", PyCObject_FromVoidPtr(O_getval,NULL));
   PyDict_SetItemString(d,"NewInput", PyCObject_FromVoidPtr(newIobject,NULL));
   PyDict_SetItemString(d,"NewOutput", PyCObject_FromVoidPtr(newOobject,NULL));
+#endif
   
   PyDict_SetItemString(d,"InputType",  (PyObject*)&Itype);
   PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
@@ -676,3 +714,4 @@
   if (PyErr_Occurred())
     Py_FatalError("can't initialize module cStringIO");
 }
+