diff --git a/Modules/cStringIO.c b/Modules/cStringIO.c
index 72c7a4c..107f889 100644
--- a/Modules/cStringIO.c
+++ b/Modules/cStringIO.c
@@ -58,14 +58,24 @@
 
 
   $Log$
-  Revision 2.3  1997/01/14 17:38:28  bwarsaw
-  Quieted gcc -Wall by removing unused local variables.
+  Revision 2.4  1997/04/09 17:35:33  guido
+  Unknown changes by Jim Fulton.
 
-  Suppressing my urge to reformat according to Python coding standards!
-  :-)
+  Revision 1.16  1997/02/17 22:17:43  jim
+  *** empty log message ***
 
-  Revision 2.2  1997/01/06 22:57:52  guido
-  Jim's latest version.
+  Revision 1.14  1997/01/24 19:56:24  chris
+  undid last change
+
+  Revision 1.13  1997/01/24 19:45:20  chris
+  extra byte in buffer no longer included in buf_size
+
+  Revision 1.12  1997/01/24 19:38:28  chris
+  *** empty log message ***
+
+  Revision 1.11  1997/01/23 20:45:01  jim
+  ANSIfied it.
+  Changed way C API was exported.
 
   Revision 1.10  1997/01/02 15:19:55  chris
   checked in to be sure repository is up to date.
@@ -133,21 +143,9 @@
 
 #include "Python.h"
 #include "import.h"
+#include "cStringIO.h"
 
-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)
-#define Py_ASSIGN(P,E) if(!PyObject_AssignExpression(&(P),(E))) return NULL
 
 /* ----------------------------------------------------- */
 
@@ -174,8 +172,6 @@
 
 staticforward PyTypeObject Itype;
 
-
-
 /* ---------------------------------------------------------------- */
 
 static char O_reset__doc__[] = 
@@ -183,10 +179,7 @@
 ;
 
 static PyObject *
-O_reset(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
+O_reset(Oobject *self, PyObject *args) {
   self->pos = 0;
 
   Py_INCREF(Py_None);
@@ -198,10 +191,7 @@
 "tell() -- get the current position.";
 
 static PyObject *
-O_tell(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
+O_tell(Oobject *self, PyObject *args) {
   return PyInt_FromLong(self->pos);
 }
 
@@ -211,10 +201,7 @@
 "seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF";
 
 static PyObject *
-O_seek(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
+O_seek(Oobject *self, PyObject *args) {
   int position, mode = 0;
 
   UNLESS(PyArg_ParseTuple(args, "i|i", &position, &mode))
@@ -243,35 +230,28 @@
 ;
 
 static int
-O_cread(ARG(Oobject*, self), ARG(char**, output), ARG(int, n))
-    ARGDECL(Oobject*, self)
-    ARGDECL(char**, output)
-    ARGDECL(int, n)
-{
+O_cread(PyObject *self, char **output, int  n) {
   int l;
 
-  l = self->string_size - self->pos;  
+  l = ((Oobject*)self)->string_size - ((Oobject*)self)->pos;  
   if (n < 0 || n > l)
   {
     n = l;
   }
 
-  *output=self->buf + self->pos;
-  self->pos += n;
+  *output=((Oobject*)self)->buf + ((Oobject*)self)->pos;
+  ((Oobject*)self)->pos += n;
   return n;
 }
 
 static PyObject *
-O_read(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
+O_read(Oobject *self, PyObject *args) {
   int n = -1;
   char *output;
 
   UNLESS(PyArg_ParseTuple(args, "|i", &n)) return NULL;
 
-  n=O_cread(self,&output,n);
+  n=O_cread((PyObject*)self,&output,n);
 
   return PyString_FromStringAndSize(output, n);
 }
@@ -282,32 +262,27 @@
 ;
 
 static int
-O_creadline(ARG(Oobject*, self), ARG(char**, output))
-    ARGDECL(Oobject*, self)
-    ARGDECL(char**, output)
-{
+O_creadline(PyObject *self, char **output) {
   char *n, *s;
   int l;
 
-  for (n = self->buf + self->pos, s = self->buf + self->string_size; 
+  for (n = ((Oobject*)self)->buf + ((Oobject*)self)->pos,
+	 s = ((Oobject*)self)->buf + ((Oobject*)self)->string_size; 
        n < s && *n != '\n'; n++);
   if (n < s) n++;
  
-  *output=self->buf + self->pos;
-  l = n - self->buf - self->pos;
-  self->pos += l;
+  *output=((Oobject*)self)->buf + ((Oobject*)self)->pos;
+  l = n - ((Oobject*)self)->buf - ((Oobject*)self)->pos;
+  ((Oobject*)self)->pos += l;
   return l;
 }
 
 static PyObject *
-O_readline(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
+O_readline(Oobject *self, PyObject *args) {
   int n;
   char *output;
 
-  n=O_creadline(self,&output);
+  n=O_creadline((PyObject*)self,&output);
   return PyString_FromStringAndSize(output, n);
 }
 
@@ -318,43 +293,38 @@
 
 
 static int
-O_cwrite(ARG(Oobject*, self), ARG(char*, c), ARG(int, l))
-    ARGDECL(Oobject*, self)
-    ARGDECL(char*, c)
-    ARGDECL(int, l)
-{
+O_cwrite(PyObject *self, char *c, int  l) {
   int newl;
 
-  newl=self->pos+l;
-  if(newl > self->buf_size)
+  newl=((Oobject*)self)->pos+l;
+  if(newl >= ((Oobject*)self)->buf_size)
     {
-      self->buf_size*=2;
-      if(self->buf_size < newl) self->buf_size=newl;
-      UNLESS(self->buf=(char*)realloc(self->buf, self->buf_size*sizeof(char)))
+      ((Oobject*)self)->buf_size*=2;
+      if(((Oobject*)self)->buf_size <= newl) ((Oobject*)self)->buf_size=newl+1;
+      UNLESS(((Oobject*)self)->buf=
+	     (char*)realloc(((Oobject*)self)->buf,
+			    (((Oobject*)self)->buf_size) *sizeof(char)))
 	{
 	  PyErr_SetString(PyExc_MemoryError,"out of memory");
-	  self->buf_size=self->pos=0;
+	  ((Oobject*)self)->buf_size=((Oobject*)self)->pos=0;
 	  return -1;
 	}
     }
 
-  memcpy(self->buf+self->pos,c,l);
+  memcpy(((Oobject*)((Oobject*)self))->buf+((Oobject*)self)->pos,c,l);
 
-  self->pos += l;
+  ((Oobject*)self)->pos += l;
 
-  if (self->string_size < self->pos)
+  if (((Oobject*)self)->string_size < ((Oobject*)self)->pos)
     {
-      self->string_size = self->pos;
+      ((Oobject*)self)->string_size = ((Oobject*)self)->pos;
     }
 
   return l;
 }
 
 static PyObject *
-O_write(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
+O_write(Oobject *self, PyObject *args) {
   PyObject *s;
   char *c;
   int l;
@@ -362,28 +332,28 @@
   UNLESS(PyArg_Parse(args, "O", &s)) return NULL;
   UNLESS(-1 != (l=PyString_Size(s))) return NULL;
   UNLESS(c=PyString_AsString(s)) return NULL;
-  UNLESS(-1 != O_cwrite(self,c,l)) return NULL;
+  UNLESS(-1 != O_cwrite((PyObject*)self,c,l)) return NULL;
 
   Py_INCREF(Py_None);
   return Py_None;
 }
 
 static PyObject *
-O_getval(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
-  return PyString_FromStringAndSize(self->buf,self->pos);
+O_getval(Oobject *self, PyObject *args) {
+  return PyString_FromStringAndSize(self->buf, self->pos);
+}
+
+static PyObject *
+O_cgetval(PyObject *self) {
+  return PyString_FromStringAndSize(((Oobject*)self)->buf,
+				    ((Oobject*)self)->pos);
 }
 
 static char O_truncate__doc__[] = 
 "truncate(): truncate the file at the current position.";
 
 static PyObject *
-O_truncate(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
+O_truncate(Oobject *self, PyObject *args) {
   self->string_size = self->pos;
   Py_INCREF(Py_None);
   return Py_None;
@@ -392,20 +362,14 @@
 static char O_isatty__doc__[] = "isatty(): always returns 0";
 
 static PyObject *
-O_isatty(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
+O_isatty(Oobject *self, PyObject *args) {
   return PyInt_FromLong(0);
 }
 
 static char O_close__doc__[] = "close(): explicitly release resources held.";
 
 static PyObject *
-O_close(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
+O_close(Oobject *self, PyObject *args) {
   free(self->buf);
 
   self->pos = self->string_size = self->buf_size = 0;
@@ -418,10 +382,7 @@
 static char O_flush__doc__[] = "flush(): does nothing.";
 
 static PyObject *
-O_flush(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
+O_flush(Oobject *self, PyObject *args) {
   Py_INCREF(Py_None);
   return Py_None;
 }
@@ -429,10 +390,7 @@
 
 static char O_writelines__doc__[] = "blah";
 static PyObject *
-O_writelines(ARG(Oobject*, self), ARG(PyObject*, args))
-    ARGDECL(Oobject*, self)
-    ARGDECL(PyObject*, args)
-{
+O_writelines(Oobject *self, PyObject *args) {
   PyObject *string_module = 0;
   static PyObject *string_joinfields = 0;
 
@@ -467,9 +425,9 @@
 }
 
 static struct PyMethodDef O_methods[] = {
+  {"write",	 (PyCFunction)O_write,        0,      O_write__doc__},
   {"read",       (PyCFunction)O_read,         1,      O_read__doc__},
   {"readline",   (PyCFunction)O_readline,     0,      O_readline__doc__},
-  {"write",	 (PyCFunction)O_write,        0,      O_write__doc__},
   {"reset",      (PyCFunction)O_reset,        0,      O_reset__doc__},
   {"seek",       (PyCFunction)O_seek,         1,      O_seek__doc__},
   {"tell",       (PyCFunction)O_tell,         0,      O_tell__doc__},
@@ -485,10 +443,8 @@
 /* ---------- */
 
 
-static Oobject *
-newOobject(ARG(int, size))
-    ARGDECL(int, size)
-{
+static PyObject *
+newOobject(int  size) {
   Oobject *self;
 	
   self = PyObject_NEW(Oobject, &Otype);
@@ -506,23 +462,18 @@
     }
 
   self->buf_size=size;
-  return self;
+  return (PyObject*)self;
 }
 
 
 static void
-O_dealloc(ARG(Oobject*, self))
-    ARGDECL(Oobject*, self)
-{
+O_dealloc(Oobject *self) {
   free(self->buf);
   PyMem_DEL(self);
 }
 
 static PyObject *
-O_getattr(ARG(Oobject*, self), ARG(char*, name))
-    ARGDECL(Oobject*, self)
-    ARGDECL(char*, name)
-{
+O_getattr(Oobject *self, char *name) {
   return Py_FindMethod(O_methods, (PyObject *)self, name);
 }
 
@@ -531,38 +482,35 @@
 ;
 
 static PyTypeObject Otype = {
-	PyObject_HEAD_INIT(&PyType_Type)
-	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*/
-	(cmpfunc)0,		/*tp_compare*/
-	(reprfunc)0,		/*tp_repr*/
-	0,			/*tp_as_number*/
-	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 */
+  PyObject_HEAD_INIT(NULL)
+  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*/
+  (cmpfunc)0,		/*tp_compare*/
+  (reprfunc)0,		/*tp_repr*/
+  0,			/*tp_as_number*/
+  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 */
 };
 
 /* End of code for StringO objects */
 /* -------------------------------------------------------- */
 
 static PyObject *
-I_close(ARG(Iobject*, self), ARG(PyObject*, args))
-    ARGDECL(Iobject*, self)
-    ARGDECL(PyObject*, args)
-{
+I_close(Iobject *self, PyObject *args) {
   Py_DECREF(self->pbuf);
 
   self->pos = self->string_size = 0;
@@ -588,10 +536,8 @@
 /* ---------- */
 
 
-static Iobject *
-newIobject(ARG(PyObject*, s))
-    ARGDECL(PyObject*, s)
-{
+static PyObject *
+newIobject(PyObject *s) {
   Iobject *self;
   char *buf;
   int size;
@@ -606,23 +552,18 @@
   self->pos=0;
   self->closed = 0;
   
-  return self;
+  return (PyObject*)self;
 }
 
 
 static void
-I_dealloc(ARG(Iobject*, self))
-    ARGDECL(Iobject*, self)
-{
+I_dealloc(Iobject *self) {
   Py_DECREF(self->pbuf);
   PyMem_DEL(self);
 }
 
 static PyObject *
-I_getattr(ARG(Iobject*, self), ARG(char*, name))
-    ARGDECL(Iobject*, self)
-    ARGDECL(char*, name)
-{
+I_getattr(Iobject *self, char *name) {
   return Py_FindMethod(I_methods, (PyObject *)self, name);
 }
 
@@ -631,28 +572,28 @@
 ;
 
 static PyTypeObject Itype = {
-	PyObject_HEAD_INIT(&PyType_Type)
-	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*/
-	(cmpfunc)0,		/*tp_compare*/
-	(reprfunc)0,		/*tp_repr*/
-	0,			/*tp_as_number*/
-	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 */
+  PyObject_HEAD_INIT(NULL)
+  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*/
+  (cmpfunc)0,		/*tp_compare*/
+  (reprfunc)0,		/*tp_repr*/
+  0,			/*tp_as_number*/
+  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 */
 };
 
 /* End of code for StringI objects */
@@ -664,15 +605,12 @@
 ;
 
 static PyObject *
-IO_StringIO(ARG(PyObject*, self), ARG(PyObject*, args))
-    ARGDECL(PyObject*, self)
-    ARGDECL(PyObject*, args)
-{
+IO_StringIO(PyObject *self, PyObject *args) {
   PyObject *s=0;
 
   UNLESS(PyArg_ParseTuple(args, "|O", &s)) return NULL;
-  if(s) return (PyObject *)newIobject(s);
-  return (PyObject *)newOobject(128);
+  if(s) return newIobject(s);
+  return newOobject(128);
 }
 
 /* List of methods defined in the module */
@@ -685,11 +623,22 @@
 
 /* Initialization function for the module (*must* be called initcStringIO) */
 
+static struct PycStringIO_CAPI CAPI = {
+  O_cread,
+  O_creadline,
+  O_cwrite,
+  O_cgetval,
+  newOobject,
+  newIobject,
+  &Itype,
+  &Otype,
+};
+
 void
-initcStringIO()
-{
+initcStringIO() {
   PyObject *m, *d;
 
+
   /* Create the module and add the functions */
   m = Py_InitModule4("cStringIO", IO_methods,
 		     cStringIO_module_documentation,
@@ -697,25 +646,17 @@
 
   /* Add some symbolic constants to the module */
   d = PyModule_GetDict(m);
-  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
-  
+  Itype.ob_type=&PyType_Type;
+  Otype.ob_type=&PyType_Type;
+  PyDict_SetItemString(d,"cStringIO_CAPI", PyCObject_FromVoidPtr(&CAPI,NULL));
+
+  /* Export Types */
   PyDict_SetItemString(d,"InputType",  (PyObject*)&Itype);
   PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
   
-
   /* Check for errors */
-  if (PyErr_Occurred())
-    Py_FatalError("can't initialize module cStringIO");
+  if (PyErr_Occurred()) Py_FatalError("can't initialize module cStringIO");
 }
 
