| /* | 
 |  * cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp | 
 |  *  | 
 |  * Copyright (c) 1996-1998, Digital Creations, Fredericksburg, VA, USA.   | 
 |  * All rights reserved. | 
 |  *  | 
 |  * Redistribution and use in source and binary forms, with or without | 
 |  * modification, are permitted provided that the following conditions are | 
 |  * met: | 
 |  *  | 
 |  *   o Redistributions of source code must retain the above copyright | 
 |  *     notice, this list of conditions, and the disclaimer that follows. | 
 |  *  | 
 |  *   o Redistributions in binary form must reproduce the above copyright | 
 |  *     notice, this list of conditions, and the following disclaimer in | 
 |  *     the documentation and/or other materials provided with the | 
 |  *     distribution. | 
 |  *  | 
 |  *   o All advertising materials mentioning features or use of this | 
 |  *     software must display the following acknowledgement: | 
 |  *  | 
 |  *       This product includes software developed by Digital Creations | 
 |  *       and its contributors. | 
 |  *  | 
 |  *   o Neither the name of Digital Creations nor the names of its | 
 |  *     contributors may be used to endorse or promote products derived | 
 |  *     from this software without specific prior written permission. | 
 |  *  | 
 |  *  | 
 |  * THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS AND CONTRIBUTORS *AS | 
 |  * IS* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | 
 |  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | 
 |  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL | 
 |  * CREATIONS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | 
 |  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | 
 |  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS | 
 |  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 
 |  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR | 
 |  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE | 
 |  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | 
 |  * DAMAGE. | 
 |  *  | 
 |  #  | 
 |  # If you have questions regarding this software, contact: | 
 |  # | 
 |  #   Digital Creations, L.C. | 
 |  #   910 Princess Ann Street | 
 |  #   Fredericksburge, Virginia  22401 | 
 |  # | 
 |  #   info@digicool.com | 
 |  # | 
 |  #   (540) 371-6909 | 
 |  */ | 
 | static char cStringIO_module_documentation[] =  | 
 | "A simple fast partial StringIO replacement.\n" | 
 | "\n" | 
 | "This module provides a simple useful replacement for\n" | 
 | "the StringIO module that is written in C.  It does not provide the\n" | 
 | "full generality of StringIO, but it provides enough for most\n" | 
 | "applications and is especially useful in conjunction with the\n" | 
 | "pickle module.\n" | 
 | "\n" | 
 | "Usage:\n" | 
 | "\n" | 
 | "  from cStringIO import StringIO\n" | 
 | "\n" | 
 | "  an_output_stream=StringIO()\n" | 
 | "  an_output_stream.write(some_stuff)\n" | 
 | "  ...\n" | 
 | "  value=an_output_stream.getvalue() # str(an_output_stream) works too!\n" | 
 | "\n" | 
 | "  an_input_stream=StringIO(a_string)\n" | 
 | "  spam=an_input_stream.readline()\n" | 
 | "  spam=an_input_stream.read(5)\n" | 
 | "  an_input_stream.seek(0)           # OK, start over\n" | 
 | "  spam=an_input_stream.read()       # and read it all\n" | 
 | "  \n" | 
 | "If someone else wants to provide a more complete implementation,\n" | 
 | "go for it. :-)  \n" | 
 | "\n" | 
 | "cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n" | 
 | ; | 
 |  | 
 | #include "Python.h" | 
 | #include "import.h" | 
 | #include "cStringIO.h" | 
 |  | 
 | #define UNLESS(E) if(!(E)) | 
 |  | 
 | /* Declarations for objects of type StringO */ | 
 |  | 
 | typedef struct { | 
 |   PyObject_HEAD | 
 |   char *buf; | 
 |   int pos, string_size, buf_size, softspace; | 
 | } Oobject; | 
 |  | 
 | /* Declarations for objects of type StringI */ | 
 |  | 
 | typedef struct { | 
 |   PyObject_HEAD | 
 |   char *buf; | 
 |   int pos, string_size; | 
 |   PyObject *pbuf; | 
 | } Iobject; | 
 |  | 
 | static char O_reset__doc__[] =  | 
 | "reset() -- Reset the file position to the beginning" | 
 | ; | 
 |  | 
 | static PyObject * | 
 | O_reset(Oobject *self, PyObject *args) { | 
 |   self->pos = 0; | 
 |  | 
 |   Py_INCREF(Py_None); | 
 |   return Py_None; | 
 | } | 
 |  | 
 |  | 
 | static char O_tell__doc__[] = | 
 | "tell() -- get the current position."; | 
 |  | 
 | static PyObject * | 
 | O_tell(Oobject *self, PyObject *args) { | 
 |   return PyInt_FromLong(self->pos); | 
 | } | 
 |  | 
 |  | 
 | static char O_seek__doc__[] = | 
 | "seek(position)       -- set the current position\n" | 
 | "seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF"; | 
 |  | 
 | static PyObject * | 
 | O_seek(Oobject *self, PyObject *args) { | 
 |   int position, mode = 0; | 
 |  | 
 |   UNLESS(PyArg_ParseTuple(args, "i|i:seek", &position, &mode)) { | 
 |     return NULL; | 
 |   } | 
 |  | 
 |   if (mode == 2) { | 
 |     position += self->string_size; | 
 |   } | 
 |   else if (mode == 1) { | 
 |     position += self->pos; | 
 |   } | 
 |  | 
 |   if (position > self->buf_size) { | 
 |       self->buf_size*=2; | 
 |       if(self->buf_size <= position) self->buf_size=position+1; | 
 |       UNLESS(self->buf=(char*)realloc(self->buf,self->buf_size*sizeof(char))) { | 
 | 	  self->buf_size=self->pos=0; | 
 | 	  return PyErr_NoMemory(); | 
 | 	} | 
 |     } | 
 |   else if(position < 0) position=0; | 
 |    | 
 |   self->pos=position; | 
 |  | 
 |   while(--position >= self->string_size) self->buf[position]=0; | 
 |  | 
 |   Py_INCREF(Py_None); | 
 |   return Py_None; | 
 | } | 
 |  | 
 | static char O_read__doc__[] =  | 
 | "read([s]) -- Read s characters, or the rest of the string" | 
 | ; | 
 |  | 
 | static int | 
 | O_cread(PyObject *self, char **output, int  n) { | 
 |   int l; | 
 |  | 
 |   l = ((Oobject*)self)->string_size - ((Oobject*)self)->pos;   | 
 |   if (n < 0 || n > l) { | 
 |     n = l; | 
 |     if (n < 0) n=0; | 
 |   } | 
 |  | 
 |   *output=((Oobject*)self)->buf + ((Oobject*)self)->pos; | 
 |   ((Oobject*)self)->pos += n; | 
 |   return n; | 
 | } | 
 |  | 
 | static PyObject * | 
 | O_read(Oobject *self, PyObject *args) { | 
 |   int n = -1; | 
 |   char *output; | 
 |  | 
 |   UNLESS(PyArg_ParseTuple(args, "|i:read", &n)) return NULL; | 
 |  | 
 |   n=O_cread((PyObject*)self,&output,n); | 
 |  | 
 |   return PyString_FromStringAndSize(output, n); | 
 | } | 
 |  | 
 |  | 
 | static char O_readline__doc__[] =  | 
 | "readline() -- Read one line" | 
 | ; | 
 |  | 
 | static int | 
 | O_creadline(PyObject *self, char **output) { | 
 |   char *n, *s; | 
 |   int l; | 
 |  | 
 |   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=((Oobject*)self)->buf + ((Oobject*)self)->pos; | 
 |   l = n - ((Oobject*)self)->buf - ((Oobject*)self)->pos; | 
 |   ((Oobject*)self)->pos += l; | 
 |   return l; | 
 | } | 
 |  | 
 | static PyObject * | 
 | O_readline(Oobject *self, PyObject *args) { | 
 |   int n; | 
 |   char *output; | 
 |  | 
 |   n=O_creadline((PyObject*)self,&output); | 
 |   return PyString_FromStringAndSize(output, n); | 
 | } | 
 |  | 
 | static char O_write__doc__[] =  | 
 | "write(s) -- Write a string to the file" | 
 | "\n\nNote (hack:) writing None resets the buffer" | 
 | ; | 
 |  | 
 |  | 
 | static int | 
 | O_cwrite(PyObject *self, char *c, int  l) { | 
 |   int newl; | 
 |  | 
 |   newl=((Oobject*)self)->pos+l; | 
 |   if(newl >= ((Oobject*)self)->buf_size) { | 
 |       ((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"); | 
 | 	  ((Oobject*)self)->buf_size=((Oobject*)self)->pos=0; | 
 | 	  return -1; | 
 | 	} | 
 |     } | 
 |  | 
 |   memcpy(((Oobject*)((Oobject*)self))->buf+((Oobject*)self)->pos,c,l); | 
 |  | 
 |   ((Oobject*)self)->pos += l; | 
 |  | 
 |   if (((Oobject*)self)->string_size < ((Oobject*)self)->pos) { | 
 |       ((Oobject*)self)->string_size = ((Oobject*)self)->pos; | 
 |     } | 
 |  | 
 |   return l; | 
 | } | 
 |  | 
 | static PyObject * | 
 | O_write(Oobject *self, PyObject *args) { | 
 |   PyObject *s; | 
 |   char *c; | 
 |   int l; | 
 |  | 
 |   UNLESS(PyArg_ParseTuple(args, "O:write", &s)) return NULL; | 
 |   UNLESS(-1 != (l=PyString_Size(s))) return NULL; | 
 |   UNLESS(c=PyString_AsString(s)) return NULL; | 
 |   UNLESS(-1 != O_cwrite((PyObject*)self,c,l)) return NULL; | 
 |  | 
 |   Py_INCREF(Py_None); | 
 |   return Py_None; | 
 | } | 
 |  | 
 | static char O_getval__doc__[] =  | 
 |    "getvalue([use_pos]) -- Get the string value." | 
 |    "\n" | 
 |    "If use_pos is specified and is a true value, then the string returned\n" | 
 |    "will include only the text up to the current file position.\n" | 
 | ; | 
 |  | 
 | static PyObject * | 
 | O_getval(Oobject *self, PyObject *args) { | 
 |   PyObject *use_pos=Py_None; | 
 |   int s; | 
 |  | 
 |   use_pos=Py_None; | 
 |   UNLESS(PyArg_ParseTuple(args,"|O:getval",&use_pos)) return NULL; | 
 |   if(PyObject_IsTrue(use_pos)) { | 
 |       s=self->pos; | 
 |       if (s > self->string_size) s=self->string_size; | 
 |   } | 
 |   else | 
 |       s=self->string_size; | 
 |   return PyString_FromStringAndSize(self->buf, s); | 
 | } | 
 |  | 
 | 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(Oobject *self, PyObject *args) { | 
 |   if (self->string_size > self->pos) | 
 |       self->string_size = self->pos; | 
 |   Py_INCREF(Py_None); | 
 |   return Py_None; | 
 | } | 
 |  | 
 | static char O_isatty__doc__[] = "isatty(): always returns 0"; | 
 |  | 
 | static PyObject * | 
 | O_isatty(Oobject *self, PyObject *args) { | 
 |   return PyInt_FromLong(0); | 
 | } | 
 |  | 
 | static char O_close__doc__[] = "close(): explicitly release resources held."; | 
 |  | 
 | static PyObject * | 
 | O_close(Oobject *self, PyObject *args) { | 
 |   if (self->buf != NULL) | 
 |     free(self->buf); | 
 |   self->buf = NULL; | 
 |  | 
 |   self->pos = self->string_size = self->buf_size = 0; | 
 |  | 
 |   Py_INCREF(Py_None); | 
 |   return Py_None; | 
 | } | 
 |  | 
 | static char O_flush__doc__[] = "flush(): does nothing."; | 
 |  | 
 | static PyObject * | 
 | O_flush(Oobject *self, PyObject *args) { | 
 |   Py_INCREF(Py_None); | 
 |   return Py_None; | 
 | } | 
 |  | 
 |  | 
 | static char O_writelines__doc__[] = | 
 | "writelines(sequence_of_strings): write each string"; | 
 | static PyObject * | 
 | O_writelines(Oobject *self, PyObject *args) { | 
 |   PyObject *string_module = 0; | 
 |   static PyObject *string_joinfields = 0; | 
 |  | 
 |   UNLESS(PyArg_ParseTuple(args, "O:writelines", &args)) { | 
 |     return NULL; | 
 |   } | 
 |  | 
 |   if (!string_joinfields) { | 
 |     UNLESS(string_module = PyImport_ImportModule("string")) { | 
 |       return NULL; | 
 |     } | 
 |  | 
 |     UNLESS(string_joinfields= | 
 |         PyObject_GetAttrString(string_module, "joinfields")) { | 
 |       return NULL; | 
 |     } | 
 |  | 
 |     Py_DECREF(string_module); | 
 |   } | 
 |  | 
 |   if (PyObject_Size(args) == -1) { | 
 |     return NULL; | 
 |   } | 
 |  | 
 |   { | 
 | 	  PyObject *x = PyObject_CallFunction(string_joinfields, | 
 | 					      "Os", args, ""); | 
 | 	  if (x == NULL) | 
 | 		  return NULL; | 
 | 	  args = Py_BuildValue("(O)", x); | 
 | 	  Py_DECREF(x); | 
 | 	  if (args == NULL) | 
 | 		  return NULL; | 
 | 	  x = O_write(self, args); | 
 | 	  Py_DECREF(args); | 
 | 	  return x; | 
 |   } | 
 | } | 
 |  | 
 | static struct PyMethodDef O_methods[] = { | 
 |   {"write",	 (PyCFunction)O_write,      METH_VARARGS, O_write__doc__}, | 
 |   {"read",       (PyCFunction)O_read,       METH_VARARGS, O_read__doc__}, | 
 |   {"readline",   (PyCFunction)O_readline,   METH_VARARGS, O_readline__doc__}, | 
 |   {"reset",      (PyCFunction)O_reset,      METH_VARARGS, O_reset__doc__}, | 
 |   {"seek",       (PyCFunction)O_seek,       METH_VARARGS, O_seek__doc__}, | 
 |   {"tell",       (PyCFunction)O_tell,       METH_VARARGS, O_tell__doc__}, | 
 |   {"getvalue",   (PyCFunction)O_getval,     METH_VARARGS, O_getval__doc__}, | 
 |   {"truncate",   (PyCFunction)O_truncate,   METH_VARARGS, O_truncate__doc__}, | 
 |   {"isatty",     (PyCFunction)O_isatty,     METH_VARARGS, O_isatty__doc__}, | 
 |   {"close",      (PyCFunction)O_close,      METH_VARARGS, O_close__doc__}, | 
 |   {"flush",      (PyCFunction)O_flush,      METH_VARARGS, O_flush__doc__}, | 
 |   {"writelines", (PyCFunction)O_writelines, METH_VARARGS, O_writelines__doc__}, | 
 |   {NULL,	 NULL}		/* sentinel */ | 
 | }; | 
 |  | 
 |  | 
 | static void | 
 | O_dealloc(Oobject *self) { | 
 |   if (self->buf != NULL) | 
 |     free(self->buf); | 
 |   PyObject_Del(self); | 
 | } | 
 |  | 
 | 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." | 
 | ; | 
 |  | 
 | static PyTypeObject Otype = { | 
 |   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)O_setattr,	/*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 */ | 
 | }; | 
 |  | 
 | static PyObject * | 
 | newOobject(int  size) { | 
 |   Oobject *self; | 
 | 	 | 
 |   self = PyObject_New(Oobject, &Otype); | 
 |   if (self == NULL) | 
 |     return NULL; | 
 |   self->pos=0; | 
 |   self->string_size = 0; | 
 |   self->softspace = 0; | 
 |  | 
 |   UNLESS(self->buf=malloc(size*sizeof(char))) { | 
 |       PyErr_SetString(PyExc_MemoryError,"out of memory"); | 
 |       self->buf_size = 0; | 
 |       return NULL; | 
 |     } | 
 |  | 
 |   self->buf_size=size; | 
 |   return (PyObject*)self; | 
 | } | 
 |  | 
 | /* End of code for StringO objects */ | 
 | /* -------------------------------------------------------- */ | 
 |  | 
 | static PyObject * | 
 | I_close(Iobject *self, PyObject *args) { | 
 |   Py_XDECREF(self->pbuf); | 
 |   self->pbuf = NULL; | 
 |  | 
 |   self->pos = self->string_size = 0; | 
 |  | 
 |   Py_INCREF(Py_None); | 
 |   return Py_None; | 
 | } | 
 |  | 
 | static PyObject * | 
 | I_seek(Oobject *self, PyObject *args) { | 
 |   int position, mode = 0; | 
 |  | 
 |   UNLESS(PyArg_ParseTuple(args, "i|i:seek", &position, &mode)) { | 
 |     return NULL; | 
 |   } | 
 |  | 
 |   if (mode == 2) { | 
 |     position += self->string_size; | 
 |   } | 
 |   else if (mode == 1) { | 
 |     position += self->pos; | 
 |   } | 
 |  | 
 |   if(position < 0) position=0; | 
 |    | 
 |   self->pos=position; | 
 |  | 
 |   Py_INCREF(Py_None); | 
 |   return Py_None; | 
 | } | 
 |  | 
 | static struct PyMethodDef I_methods[] = { | 
 |   {"read",	(PyCFunction)O_read,     METH_VARARGS, O_read__doc__}, | 
 |   {"readline",	(PyCFunction)O_readline, METH_VARARGS, O_readline__doc__}, | 
 |   {"reset",	(PyCFunction)O_reset,	 METH_VARARGS, O_reset__doc__}, | 
 |   {"seek",      (PyCFunction)I_seek,     METH_VARARGS, O_seek__doc__},   | 
 |   {"tell",      (PyCFunction)O_tell,     METH_VARARGS, O_tell__doc__}, | 
 |   {"getvalue",  (PyCFunction)O_getval,   METH_VARARGS, O_getval__doc__}, | 
 |   {"truncate",  (PyCFunction)O_truncate, METH_VARARGS, O_truncate__doc__}, | 
 |   {"isatty",    (PyCFunction)O_isatty,   METH_VARARGS, O_isatty__doc__}, | 
 |   {"close",     (PyCFunction)I_close,    METH_VARARGS, O_close__doc__}, | 
 |   {"flush",     (PyCFunction)O_flush,    METH_VARARGS, O_flush__doc__}, | 
 |   {NULL,	NULL} | 
 | }; | 
 |  | 
 | static void | 
 | I_dealloc(Iobject *self) { | 
 |   Py_XDECREF(self->pbuf); | 
 |   PyObject_Del(self); | 
 | } | 
 |  | 
 | static PyObject * | 
 | I_getattr(Iobject *self, char *name) { | 
 |   return Py_FindMethod(I_methods, (PyObject *)self, name); | 
 | } | 
 |  | 
 | static char Itype__doc__[] =  | 
 | "Simple type for treating strings as input file streams" | 
 | ; | 
 |  | 
 | static PyTypeObject Itype = { | 
 |   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 */ | 
 | }; | 
 |  | 
 | static PyObject * | 
 | newIobject(PyObject *s) { | 
 |   Iobject *self; | 
 |   char *buf; | 
 |   int size; | 
 |  | 
 |   if (!PyString_Check(s)) { | 
 |       PyErr_Format(PyExc_TypeError, "expected string, %.200s found", | 
 | 		   s->ob_type->tp_name); | 
 |       return NULL; | 
 |   } | 
 |   buf = PyString_AS_STRING(s); | 
 |   size = PyString_GET_SIZE(s); | 
 |   UNLESS(self = PyObject_New(Iobject, &Itype)) return NULL; | 
 |   Py_INCREF(s); | 
 |   self->buf=buf; | 
 |   self->string_size=size; | 
 |   self->pbuf=s; | 
 |   self->pos=0; | 
 |    | 
 |   return (PyObject*)self; | 
 | } | 
 |  | 
 | /* End of code for StringI objects */ | 
 | /* -------------------------------------------------------- */ | 
 |  | 
 |  | 
 | static char IO_StringIO__doc__[] = | 
 | "StringIO([s]) -- Return a StringIO-like stream for reading or writing" | 
 | ; | 
 |  | 
 | static PyObject * | 
 | IO_StringIO(PyObject *self, PyObject *args) { | 
 |   PyObject *s=0; | 
 |  | 
 |   if (!PyArg_ParseTuple(args, "|O:StringIO", &s)) | 
 |       return NULL; | 
 |   if(s) return newIobject(s); | 
 |   return newOobject(128); | 
 | } | 
 |  | 
 | /* List of methods defined in the module */ | 
 |  | 
 | static struct PyMethodDef IO_methods[] = { | 
 |   {"StringIO",	(PyCFunction)IO_StringIO,	 | 
 |    METH_VARARGS,	IO_StringIO__doc__}, | 
 |   {NULL,		NULL}		/* sentinel */ | 
 | }; | 
 |  | 
 |  | 
 | /* 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, | 
 | }; | 
 |  | 
 | #ifndef DL_EXPORT	/* declarations for DLL import/export */ | 
 | #define DL_EXPORT(RTYPE) RTYPE | 
 | #endif | 
 | DL_EXPORT(void) | 
 | initcStringIO(void) { | 
 |   PyObject *m, *d, *v; | 
 |  | 
 |  | 
 |   /* Create the module and add the functions */ | 
 |   m = Py_InitModule4("cStringIO", IO_methods, | 
 | 		     cStringIO_module_documentation, | 
 | 		     (PyObject*)NULL,PYTHON_API_VERSION); | 
 |  | 
 |   /* Add some symbolic constants to the module */ | 
 |   d = PyModule_GetDict(m); | 
 |    | 
 |   /* Export C API */ | 
 |   Itype.ob_type=&PyType_Type; | 
 |   Otype.ob_type=&PyType_Type; | 
 |   PyDict_SetItemString(d,"cStringIO_CAPI", | 
 | 		       v = PyCObject_FromVoidPtr(&CAPI,NULL)); | 
 |   Py_XDECREF(v); | 
 |  | 
 |   /* Export Types */ | 
 |   PyDict_SetItemString(d,"InputType",  (PyObject*)&Itype); | 
 |   PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype); | 
 |  | 
 |   /* Maybe make certain warnings go away */ | 
 |   if(0) PycString_IMPORT; | 
 | } |