| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1 |  | 
 | 2 | #include "Python.h" | 
 | 3 | #include "import.h" | 
 | 4 | #include "cStringIO.h" | 
| Raymond Hettinger | 352f947 | 2003-04-24 15:50:11 +0000 | [diff] [blame] | 5 | #include "structmember.h" | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 6 |  | 
 | 7 | PyDoc_STRVAR(cStringIO_module_documentation, | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 8 | "A simple fast partial StringIO replacement.\n" | 
 | 9 | "\n" | 
 | 10 | "This module provides a simple useful replacement for\n" | 
 | 11 | "the StringIO module that is written in C.  It does not provide the\n" | 
| Fred Drake | aef1000 | 2000-06-19 13:17:41 +0000 | [diff] [blame] | 12 | "full generality of StringIO, but it provides enough for most\n" | 
| Thomas Wouters | 7e47402 | 2000-07-16 12:04:32 +0000 | [diff] [blame] | 13 | "applications and is especially useful in conjunction with the\n" | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 14 | "pickle module.\n" | 
 | 15 | "\n" | 
 | 16 | "Usage:\n" | 
 | 17 | "\n" | 
 | 18 | "  from cStringIO import StringIO\n" | 
 | 19 | "\n" | 
 | 20 | "  an_output_stream=StringIO()\n" | 
 | 21 | "  an_output_stream.write(some_stuff)\n" | 
 | 22 | "  ...\n" | 
| Jeremy Hylton | b189b07 | 2002-03-08 17:17:33 +0000 | [diff] [blame] | 23 | "  value=an_output_stream.getvalue()\n" | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 24 | "\n" | 
 | 25 | "  an_input_stream=StringIO(a_string)\n" | 
 | 26 | "  spam=an_input_stream.readline()\n" | 
 | 27 | "  spam=an_input_stream.read(5)\n" | 
| Guido van Rossum | 7d9b413 | 1998-11-25 16:17:32 +0000 | [diff] [blame] | 28 | "  an_input_stream.seek(0)           # OK, start over\n" | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 29 | "  spam=an_input_stream.read()       # and read it all\n" | 
 | 30 | "  \n" | 
 | 31 | "If someone else wants to provide a more complete implementation,\n" | 
 | 32 | "go for it. :-)  \n" | 
| Guido van Rossum | 142eeb8 | 1997-08-13 03:14:41 +0000 | [diff] [blame] | 33 | "\n" | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 34 | "cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n"); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 35 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 36 | /* Declaration for file-like objects that manage data as strings | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 37 |  | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 38 |    The IOobject type should be though of as a common base type for | 
 | 39 |    Iobjects, which provide input (read-only) StringIO objects and | 
 | 40 |    Oobjects, which provide read-write objects.  Most of the methods | 
 | 41 |    depend only on common data. | 
 | 42 | */ | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 43 |  | 
 | 44 | typedef struct { | 
 | 45 |   PyObject_HEAD | 
 | 46 |   char *buf; | 
| Martin v. Löwis | 18e1655 | 2006-02-15 17:27:45 +0000 | [diff] [blame] | 47 |   Py_ssize_t pos, string_size; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 48 | } IOobject; | 
 | 49 |  | 
 | 50 | #define IOOOBJECT(O) ((IOobject*)(O)) | 
 | 51 |  | 
| Skip Montanaro | e138828 | 2003-08-11 13:15:11 +0000 | [diff] [blame] | 52 | /* Declarations for objects of type StringO */ | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 53 |  | 
 | 54 | typedef struct { /* Subtype of IOobject */ | 
 | 55 |   PyObject_HEAD | 
 | 56 |   char *buf; | 
| Martin v. Löwis | 18e1655 | 2006-02-15 17:27:45 +0000 | [diff] [blame] | 57 |   Py_ssize_t pos, string_size; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 58 |  | 
| Martin v. Löwis | 18e1655 | 2006-02-15 17:27:45 +0000 | [diff] [blame] | 59 |   Py_ssize_t buf_size; | 
 | 60 |   int softspace; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 61 | } Oobject; | 
 | 62 |  | 
 | 63 | /* Declarations for objects of type StringI */ | 
 | 64 |  | 
 | 65 | typedef struct { /* Subtype of IOobject */ | 
 | 66 |   PyObject_HEAD | 
 | 67 |   char *buf; | 
| Martin v. Löwis | 18e1655 | 2006-02-15 17:27:45 +0000 | [diff] [blame] | 68 |   Py_ssize_t pos, string_size; | 
| Marc-André Lemburg | e47df7a | 2001-09-24 17:34:52 +0000 | [diff] [blame] | 69 |   /* We store a reference to the object here in order to keep | 
 | 70 |      the buffer alive during the lifetime of the Iobject. */ | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 71 |   PyObject *pbuf; | 
 | 72 | } Iobject; | 
 | 73 |  | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 74 | /* IOobject (common) methods */ | 
 | 75 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 76 | PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing."); | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 77 |  | 
 | 78 | static int | 
 | 79 | IO__opencheck(IOobject *self) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 80 |     if (!self->buf) { | 
 | 81 |         PyErr_SetString(PyExc_ValueError, | 
 | 82 |                         "I/O operation on closed file"); | 
 | 83 |         return 0; | 
 | 84 |     } | 
 | 85 |     return 1; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 86 | } | 
 | 87 |  | 
 | 88 | static PyObject * | 
| Raymond Hettinger | 5475f23 | 2003-08-08 12:20:03 +0000 | [diff] [blame] | 89 | IO_get_closed(IOobject *self, void *closure) | 
 | 90 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 91 |     PyObject *result = Py_False; | 
| Raymond Hettinger | 5475f23 | 2003-08-08 12:20:03 +0000 | [diff] [blame] | 92 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 93 |     if (self->buf == NULL) | 
 | 94 |         result = Py_True; | 
 | 95 |     Py_INCREF(result); | 
 | 96 |     return result; | 
| Raymond Hettinger | 5475f23 | 2003-08-08 12:20:03 +0000 | [diff] [blame] | 97 | } | 
 | 98 |  | 
 | 99 | static PyGetSetDef file_getsetlist[] = { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 100 |     {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"}, | 
 | 101 |     {0}, | 
| Raymond Hettinger | 5475f23 | 2003-08-08 12:20:03 +0000 | [diff] [blame] | 102 | }; | 
 | 103 |  | 
 | 104 | static PyObject * | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 105 | IO_flush(IOobject *self, PyObject *unused) { | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 106 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 107 |     if (!IO__opencheck(self)) return NULL; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 108 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 109 |     Py_INCREF(Py_None); | 
 | 110 |     return Py_None; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 111 | } | 
 | 112 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 113 | PyDoc_STRVAR(IO_getval__doc__, | 
 | 114 | "getvalue([use_pos]) -- Get the string value." | 
 | 115 | "\n" | 
 | 116 | "If use_pos is specified and is a true value, then the string returned\n" | 
 | 117 | "will include only the text up to the current file position.\n"); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 118 |  | 
 | 119 | static PyObject * | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 120 | IO_cgetval(PyObject *self) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 121 |     if (!IO__opencheck(IOOOBJECT(self))) return NULL; | 
 | 122 |     assert(IOOOBJECT(self)->pos >= 0); | 
 | 123 |     return PyString_FromStringAndSize(((IOobject*)self)->buf, | 
 | 124 |                                       ((IOobject*)self)->pos); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 125 | } | 
 | 126 |  | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 127 | static PyObject * | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 128 | IO_getval(IOobject *self, PyObject *args) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 129 |     PyObject *use_pos=Py_None; | 
| Antoine Pitrou | c5bef75 | 2012-08-15 23:16:51 +0200 | [diff] [blame] | 130 |     int b; | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 131 |     Py_ssize_t s; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 132 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 133 |     if (!IO__opencheck(self)) return NULL; | 
 | 134 |     if (!PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 135 |  | 
| Antoine Pitrou | c5bef75 | 2012-08-15 23:16:51 +0200 | [diff] [blame] | 136 |     b = PyObject_IsTrue(use_pos); | 
 | 137 |     if (b < 0) | 
 | 138 |         return NULL; | 
 | 139 |     if (b) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 140 |               s=self->pos; | 
 | 141 |               if (s > self->string_size) s=self->string_size; | 
 | 142 |     } | 
 | 143 |     else | 
 | 144 |               s=self->string_size; | 
 | 145 |     assert(self->pos >= 0); | 
 | 146 |     return PyString_FromStringAndSize(self->buf, s); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 147 | } | 
 | 148 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 149 | PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0"); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 150 |  | 
 | 151 | static PyObject * | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 152 | IO_isatty(IOobject *self, PyObject *unused) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 153 |     if (!IO__opencheck(self)) return NULL; | 
 | 154 |     Py_INCREF(Py_False); | 
 | 155 |     return Py_False; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 156 | } | 
 | 157 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 158 | PyDoc_STRVAR(IO_read__doc__, | 
 | 159 | "read([s]) -- Read s characters, or the rest of the string"); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 160 |  | 
 | 161 | static int | 
| Martin v. Löwis | 18e1655 | 2006-02-15 17:27:45 +0000 | [diff] [blame] | 162 | IO_cread(PyObject *self, char **output, Py_ssize_t  n) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 163 |     Py_ssize_t l; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 164 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 165 |     if (!IO__opencheck(IOOOBJECT(self))) return -1; | 
 | 166 |     assert(IOOOBJECT(self)->pos >= 0); | 
 | 167 |     assert(IOOOBJECT(self)->string_size >= 0); | 
 | 168 |     l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos; | 
 | 169 |     if (n < 0 || n > l) { | 
 | 170 |         n = l; | 
 | 171 |         if (n < 0) n=0; | 
 | 172 |     } | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 173 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 174 |     *output=((IOobject*)self)->buf + ((IOobject*)self)->pos; | 
 | 175 |     ((IOobject*)self)->pos += n; | 
 | 176 |     return n; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 177 | } | 
 | 178 |  | 
 | 179 | static PyObject * | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 180 | IO_read(IOobject *self, PyObject *args) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 181 |     Py_ssize_t n = -1; | 
 | 182 |     char *output = NULL; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 183 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 184 |     if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 185 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 186 |     if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 187 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 188 |     return PyString_FromStringAndSize(output, n); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 189 | } | 
 | 190 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 191 | PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line"); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 192 |  | 
 | 193 | static int | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 194 | IO_creadline(PyObject *self, char **output) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 195 |     char *n, *s; | 
 | 196 |     Py_ssize_t l; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 197 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 198 |     if (!IO__opencheck(IOOOBJECT(self))) return -1; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 199 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 200 |     for (n = ((IOobject*)self)->buf + ((IOobject*)self)->pos, | 
 | 201 |            s = ((IOobject*)self)->buf + ((IOobject*)self)->string_size; | 
 | 202 |          n < s && *n != '\n'; n++); | 
| Gregory P. Smith | 9d53457 | 2008-06-11 07:41:16 +0000 | [diff] [blame] | 203 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 204 |     if (n < s) n++; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 205 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 206 |     *output=((IOobject*)self)->buf + ((IOobject*)self)->pos; | 
 | 207 |     l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos; | 
| Gregory P. Smith | 9d53457 | 2008-06-11 07:41:16 +0000 | [diff] [blame] | 208 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 209 |     assert(IOOOBJECT(self)->pos <= PY_SSIZE_T_MAX - l); | 
 | 210 |     assert(IOOOBJECT(self)->pos >= 0); | 
 | 211 |     assert(IOOOBJECT(self)->string_size >= 0); | 
| Gregory P. Smith | 9d53457 | 2008-06-11 07:41:16 +0000 | [diff] [blame] | 212 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 213 |     ((IOobject*)self)->pos += l; | 
 | 214 |     return (int)l; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 215 | } | 
 | 216 |  | 
 | 217 | static PyObject * | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 218 | IO_readline(IOobject *self, PyObject *args) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 219 |     int n, m=-1; | 
 | 220 |     char *output; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 221 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 222 |     if (args) | 
 | 223 |         if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 224 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 225 |     if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL; | 
 | 226 |     if (m >= 0 && m < n) { | 
 | 227 |         m = n - m; | 
 | 228 |         n -= m; | 
 | 229 |         self->pos -= m; | 
 | 230 |     } | 
 | 231 |     assert(IOOOBJECT(self)->pos >= 0); | 
 | 232 |     return PyString_FromStringAndSize(output, n); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 233 | } | 
 | 234 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 235 | PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines"); | 
| Martin v. Löwis | c912a3a | 2000-09-19 11:06:46 +0000 | [diff] [blame] | 236 |  | 
 | 237 | static PyObject * | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 238 | IO_readlines(IOobject *self, PyObject *args) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 239 |     int n; | 
 | 240 |     char *output; | 
 | 241 |     PyObject *result, *line; | 
 | 242 |     int hint = 0, length = 0; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 243 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 244 |     if (!PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL; | 
| Martin v. Löwis | c912a3a | 2000-09-19 11:06:46 +0000 | [diff] [blame] | 245 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 246 |     result = PyList_New(0); | 
 | 247 |     if (!result) | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 248 |         return NULL; | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 249 |  | 
 | 250 |     while (1){ | 
 | 251 |         if ( (n = IO_creadline((PyObject*)self,&output)) < 0) | 
 | 252 |             goto err; | 
 | 253 |         if (n == 0) | 
 | 254 |             break; | 
 | 255 |         line = PyString_FromStringAndSize (output, n); | 
 | 256 |         if (!line) | 
 | 257 |             goto err; | 
 | 258 |         if (PyList_Append (result, line) == -1) { | 
 | 259 |             Py_DECREF (line); | 
 | 260 |             goto err; | 
 | 261 |         } | 
 | 262 |         Py_DECREF (line); | 
 | 263 |         length += n; | 
 | 264 |         if (hint > 0 && length >= hint) | 
 | 265 |             break; | 
 | 266 |     } | 
 | 267 |     return result; | 
 | 268 |  err: | 
 | 269 |     Py_DECREF(result); | 
 | 270 |     return NULL; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 271 | } | 
 | 272 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 273 | PyDoc_STRVAR(IO_reset__doc__, | 
 | 274 | "reset() -- Reset the file position to the beginning"); | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 275 |  | 
 | 276 | static PyObject * | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 277 | IO_reset(IOobject *self, PyObject *unused) { | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 278 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 279 |     if (!IO__opencheck(self)) return NULL; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 280 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 281 |     self->pos = 0; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 282 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 283 |     Py_INCREF(Py_None); | 
 | 284 |     return Py_None; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 285 | } | 
 | 286 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 287 | PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position."); | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 288 |  | 
 | 289 | static PyObject * | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 290 | IO_tell(IOobject *self, PyObject *unused) { | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 291 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 292 |     if (!IO__opencheck(self)) return NULL; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 293 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 294 |     assert(self->pos >= 0); | 
 | 295 |     return PyInt_FromSsize_t(self->pos); | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 296 | } | 
 | 297 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 298 | PyDoc_STRVAR(IO_truncate__doc__, | 
 | 299 | "truncate(): truncate the file at the current position."); | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 300 |  | 
 | 301 | static PyObject * | 
 | 302 | IO_truncate(IOobject *self, PyObject *args) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 303 |     Py_ssize_t pos = -1; | 
| Martin v. Löwis | cffcc8b | 2006-11-19 10:41:41 +0000 | [diff] [blame] | 304 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 305 |     if (!IO__opencheck(self)) return NULL; | 
 | 306 |     if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL; | 
| Martin v. Löwis | cffcc8b | 2006-11-19 10:41:41 +0000 | [diff] [blame] | 307 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 308 |     if (PyTuple_Size(args) == 0) { | 
 | 309 |         /* No argument passed, truncate to current position */ | 
 | 310 |         pos = self->pos; | 
 | 311 |     } | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 312 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 313 |     if (pos < 0) { | 
 | 314 |         errno = EINVAL; | 
 | 315 |         PyErr_SetFromErrno(PyExc_IOError); | 
 | 316 |         return NULL; | 
 | 317 |     } | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 318 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 319 |     if (self->string_size > pos) self->string_size = pos; | 
 | 320 |     self->pos = self->string_size; | 
 | 321 |  | 
 | 322 |     Py_INCREF(Py_None); | 
 | 323 |     return Py_None; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 324 | } | 
 | 325 |  | 
| Raymond Hettinger | 352f947 | 2003-04-24 15:50:11 +0000 | [diff] [blame] | 326 | static PyObject * | 
 | 327 | IO_iternext(Iobject *self) | 
 | 328 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 329 |     PyObject *next; | 
 | 330 |     next = IO_readline((IOobject *)self, NULL); | 
 | 331 |     if (!next) | 
 | 332 |         return NULL; | 
 | 333 |     if (!PyString_GET_SIZE(next)) { | 
 | 334 |         Py_DECREF(next); | 
 | 335 |         PyErr_SetNone(PyExc_StopIteration); | 
 | 336 |         return NULL; | 
 | 337 |     } | 
 | 338 |     return next; | 
| Raymond Hettinger | 352f947 | 2003-04-24 15:50:11 +0000 | [diff] [blame] | 339 | } | 
 | 340 |  | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 341 |  | 
 | 342 |  | 
 | 343 |  | 
 | 344 | /* Read-write object methods */ | 
 | 345 |  | 
| Fred Drake | 577acb4 | 2010-10-11 19:13:04 +0000 | [diff] [blame] | 346 | PyDoc_STRVAR(IO_seek__doc__, | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 347 | "seek(position)       -- set the current position\n" | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 348 | "seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF"); | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 349 |  | 
 | 350 | static PyObject * | 
| Fred Drake | 577acb4 | 2010-10-11 19:13:04 +0000 | [diff] [blame] | 351 | IO_seek(Iobject *self, PyObject *args) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 352 |     Py_ssize_t position; | 
 | 353 |     int mode = 0; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 354 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 355 |     if (!IO__opencheck(IOOOBJECT(self))) return NULL; | 
 | 356 |     if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode)) | 
 | 357 |         return NULL; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 358 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 359 |     if (mode == 2) { | 
 | 360 |         position += self->string_size; | 
 | 361 |     } | 
 | 362 |     else if (mode == 1) { | 
 | 363 |         position += self->pos; | 
 | 364 |     } | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 365 |  | 
| Fred Drake | 577acb4 | 2010-10-11 19:13:04 +0000 | [diff] [blame] | 366 |     if (position < 0) position=0; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 367 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 368 |     self->pos=position; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 369 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 370 |     Py_INCREF(Py_None); | 
 | 371 |     return Py_None; | 
| Martin v. Löwis | c912a3a | 2000-09-19 11:06:46 +0000 | [diff] [blame] | 372 | } | 
 | 373 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 374 | PyDoc_STRVAR(O_write__doc__, | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 375 | "write(s) -- Write a string to the file" | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 376 | "\n\nNote (hack:) writing None resets the buffer"); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 377 |  | 
 | 378 |  | 
 | 379 | static int | 
| Martin v. Löwis | 18e1655 | 2006-02-15 17:27:45 +0000 | [diff] [blame] | 380 | O_cwrite(PyObject *self, const char *c, Py_ssize_t  l) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 381 |     Py_ssize_t newl; | 
 | 382 |     Oobject *oself; | 
 | 383 |     char *newbuf; | 
| Guido van Rossum | 55702f8 | 1997-01-06 22:57:52 +0000 | [diff] [blame] | 384 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 385 |     if (!IO__opencheck(IOOOBJECT(self))) return -1; | 
 | 386 |     oself = (Oobject *)self; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 387 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 388 |     newl = oself->pos+l; | 
 | 389 |     if (newl >= oself->buf_size) { | 
 | 390 |         oself->buf_size *= 2; | 
 | 391 |         if (oself->buf_size <= newl) { | 
 | 392 |             assert(newl + 1 < INT_MAX); | 
 | 393 |             oself->buf_size = (int)(newl+1); | 
| Guido van Rossum | 2f09812 | 2001-12-07 20:20:28 +0000 | [diff] [blame] | 394 |         } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 395 |         newbuf = (char*)realloc(oself->buf, oself->buf_size); | 
 | 396 |         if (!newbuf) { | 
 | 397 |             PyErr_SetString(PyExc_MemoryError,"out of memory"); | 
 | 398 |             free(oself->buf); | 
 | 399 |             oself->buf = 0; | 
 | 400 |             oself->buf_size = oself->pos = 0; | 
 | 401 |             return -1; | 
 | 402 |           } | 
 | 403 |         oself->buf = newbuf; | 
 | 404 |       } | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 405 |  | 
| Fred Drake | 577acb4 | 2010-10-11 19:13:04 +0000 | [diff] [blame] | 406 |     if (oself->string_size < oself->pos) { | 
 | 407 |         /* In case of overseek, pad with null bytes the buffer region between | 
 | 408 |            the end of stream and the current position. | 
 | 409 |  | 
 | 410 |           0   lo      string_size                           hi | 
 | 411 |           |   |<---used--->|<----------available----------->| | 
 | 412 |           |   |            <--to pad-->|<---to write--->    | | 
 | 413 |           0   buf                   position | 
 | 414 |         */ | 
 | 415 |         memset(oself->buf + oself->string_size, '\0', | 
 | 416 |                (oself->pos - oself->string_size) * sizeof(char)); | 
 | 417 |     } | 
 | 418 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 419 |     memcpy(oself->buf+oself->pos,c,l); | 
 | 420 |  | 
 | 421 |     assert(oself->pos + l < INT_MAX); | 
 | 422 |     oself->pos += (int)l; | 
 | 423 |  | 
 | 424 |     if (oself->string_size < oself->pos) { | 
 | 425 |         oself->string_size = oself->pos; | 
 | 426 |     } | 
 | 427 |  | 
 | 428 |     return (int)l; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 429 | } | 
 | 430 |  | 
 | 431 | static PyObject * | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 432 | O_write(Oobject *self, PyObject *args) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 433 |     char *c; | 
 | 434 |     int l; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 435 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 436 |     if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 437 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 438 |     if (O_cwrite((PyObject*)self,c,l) < 0) return NULL; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 439 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 440 |     Py_INCREF(Py_None); | 
 | 441 |     return Py_None; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 442 | } | 
 | 443 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 444 | PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held."); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 445 |  | 
 | 446 | static PyObject * | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 447 | O_close(Oobject *self, PyObject *unused) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 448 |     if (self->buf != NULL) free(self->buf); | 
 | 449 |     self->buf = NULL; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 450 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 451 |     self->pos = self->string_size = self->buf_size = 0; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 452 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 453 |     Py_INCREF(Py_None); | 
 | 454 |     return Py_None; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 455 | } | 
 | 456 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 457 | PyDoc_STRVAR(O_writelines__doc__, | 
| Raymond Hettinger | 6ec0996 | 2004-03-08 18:17:31 +0000 | [diff] [blame] | 458 | "writelines(sequence_of_strings) -> None.  Write the strings to the file.\n" | 
 | 459 | "\n" | 
 | 460 | "Note that newlines are not added.  The sequence can be any iterable object\n" | 
 | 461 | "producing strings. This is equivalent to calling write() for each string."); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 462 | static PyObject * | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 463 | O_writelines(Oobject *self, PyObject *args) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 464 |     PyObject *it, *s; | 
 | 465 |  | 
 | 466 |     it = PyObject_GetIter(args); | 
 | 467 |     if (it == NULL) | 
 | 468 |         return NULL; | 
 | 469 |     while ((s = PyIter_Next(it)) != NULL) { | 
 | 470 |         Py_ssize_t n; | 
 | 471 |         char *c; | 
 | 472 |         if (PyString_AsStringAndSize(s, &c, &n) == -1) { | 
 | 473 |             Py_DECREF(it); | 
 | 474 |             Py_DECREF(s); | 
 | 475 |             return NULL; | 
 | 476 |         } | 
 | 477 |         if (O_cwrite((PyObject *)self, c, n) == -1) { | 
 | 478 |             Py_DECREF(it); | 
 | 479 |             Py_DECREF(s); | 
 | 480 |             return NULL; | 
 | 481 |            } | 
 | 482 |            Py_DECREF(s); | 
| Michael W. Hudson | 10402a3 | 2005-09-22 09:19:01 +0000 | [diff] [blame] | 483 |        } | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 484 |  | 
| Michael W. Hudson | 10402a3 | 2005-09-22 09:19:01 +0000 | [diff] [blame] | 485 |        Py_DECREF(it); | 
 | 486 |  | 
 | 487 |        /* See if PyIter_Next failed */ | 
 | 488 |        if (PyErr_Occurred()) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 489 |            return NULL; | 
| Michael W. Hudson | 10402a3 | 2005-09-22 09:19:01 +0000 | [diff] [blame] | 490 |  | 
 | 491 |        Py_RETURN_NONE; | 
 | 492 | } | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 493 | static struct PyMethodDef O_methods[] = { | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 494 |   /* Common methods: */ | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 495 |   {"flush",     (PyCFunction)IO_flush,    METH_NOARGS,  IO_flush__doc__}, | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 496 |   {"getvalue",  (PyCFunction)IO_getval,   METH_VARARGS, IO_getval__doc__}, | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 497 |   {"isatty",    (PyCFunction)IO_isatty,   METH_NOARGS,  IO_isatty__doc__}, | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 498 |   {"read",      (PyCFunction)IO_read,     METH_VARARGS, IO_read__doc__}, | 
 | 499 |   {"readline",  (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__}, | 
 | 500 |   {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__}, | 
 | 501 |   {"reset",     (PyCFunction)IO_reset,    METH_NOARGS,  IO_reset__doc__}, | 
| Fred Drake | 577acb4 | 2010-10-11 19:13:04 +0000 | [diff] [blame] | 502 |   {"seek",      (PyCFunction)IO_seek,     METH_VARARGS, IO_seek__doc__}, | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 503 |   {"tell",      (PyCFunction)IO_tell,     METH_NOARGS,  IO_tell__doc__}, | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 504 |   {"truncate",  (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__}, | 
 | 505 |  | 
 | 506 |   /* Read-write StringIO specific  methods: */ | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 507 |   {"close",      (PyCFunction)O_close,      METH_NOARGS,  O_close__doc__}, | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 508 |   {"write",      (PyCFunction)O_write,      METH_VARARGS, O_write__doc__}, | 
 | 509 |   {"writelines", (PyCFunction)O_writelines, METH_O,       O_writelines__doc__}, | 
 | 510 |   {NULL,         NULL}          /* sentinel */ | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 511 | }; | 
 | 512 |  | 
| Raymond Hettinger | 352f947 | 2003-04-24 15:50:11 +0000 | [diff] [blame] | 513 | static PyMemberDef O_memberlist[] = { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 514 |     {"softspace",       T_INT,  offsetof(Oobject, softspace),   0, | 
 | 515 |      "flag indicating that a space needs to be printed; used by print"}, | 
 | 516 |      /* getattr(f, "closed") is implemented without this table */ | 
 | 517 |     {NULL} /* Sentinel */ | 
| Raymond Hettinger | 352f947 | 2003-04-24 15:50:11 +0000 | [diff] [blame] | 518 | }; | 
 | 519 |  | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 520 | static void | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 521 | O_dealloc(Oobject *self) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 522 |     if (self->buf != NULL) | 
 | 523 |         free(self->buf); | 
 | 524 |     PyObject_Del(self); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 525 | } | 
 | 526 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 527 | PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings."); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 528 |  | 
 | 529 | static PyTypeObject Otype = { | 
| Martin v. Löwis | 6819210 | 2007-07-21 06:55:02 +0000 | [diff] [blame] | 530 |   PyVarObject_HEAD_INIT(NULL, 0) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 531 |   "cStringIO.StringO",          /*tp_name*/ | 
 | 532 |   sizeof(Oobject),              /*tp_basicsize*/ | 
 | 533 |   0,                            /*tp_itemsize*/ | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 534 |   /* methods */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 535 |   (destructor)O_dealloc,        /*tp_dealloc*/ | 
 | 536 |   0,                            /*tp_print*/ | 
 | 537 |   0,                            /*tp_getattr */ | 
 | 538 |   0,                            /*tp_setattr */ | 
 | 539 |   0,                            /*tp_compare*/ | 
 | 540 |   0,                            /*tp_repr*/ | 
 | 541 |   0,                            /*tp_as_number*/ | 
 | 542 |   0,                            /*tp_as_sequence*/ | 
 | 543 |   0,                            /*tp_as_mapping*/ | 
 | 544 |   0,                            /*tp_hash*/ | 
 | 545 |   0     ,                       /*tp_call*/ | 
 | 546 |   0,                            /*tp_str*/ | 
 | 547 |   0,                            /*tp_getattro */ | 
 | 548 |   0,                            /*tp_setattro */ | 
 | 549 |   0,                            /*tp_as_buffer */ | 
 | 550 |   Py_TPFLAGS_DEFAULT,           /*tp_flags*/ | 
 | 551 |   Otype__doc__,                 /*tp_doc */ | 
 | 552 |   0,                            /*tp_traverse */ | 
 | 553 |   0,                            /*tp_clear */ | 
 | 554 |   0,                            /*tp_richcompare */ | 
 | 555 |   0,                            /*tp_weaklistoffset */ | 
 | 556 |   PyObject_SelfIter,            /*tp_iter */ | 
 | 557 |   (iternextfunc)IO_iternext,    /*tp_iternext */ | 
 | 558 |   O_methods,                    /*tp_methods */ | 
 | 559 |   O_memberlist,                 /*tp_members */ | 
 | 560 |   file_getsetlist,              /*tp_getset */ | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 561 | }; | 
 | 562 |  | 
| Guido van Rossum | 142eeb8 | 1997-08-13 03:14:41 +0000 | [diff] [blame] | 563 | static PyObject * | 
 | 564 | newOobject(int  size) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 565 |     Oobject *self; | 
| Guido van Rossum | 142eeb8 | 1997-08-13 03:14:41 +0000 | [diff] [blame] | 566 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 567 |     self = PyObject_New(Oobject, &Otype); | 
 | 568 |     if (self == NULL) | 
 | 569 |         return NULL; | 
 | 570 |     self->pos=0; | 
 | 571 |     self->string_size = 0; | 
 | 572 |     self->softspace = 0; | 
| Guido van Rossum | 142eeb8 | 1997-08-13 03:14:41 +0000 | [diff] [blame] | 573 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 574 |     self->buf = (char *)malloc(size); | 
 | 575 |     if (!self->buf) { | 
 | 576 |               PyErr_SetString(PyExc_MemoryError,"out of memory"); | 
 | 577 |               self->buf_size = 0; | 
 | 578 |               Py_DECREF(self); | 
 | 579 |               return NULL; | 
 | 580 |       } | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 581 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 582 |     self->buf_size=size; | 
 | 583 |     return (PyObject*)self; | 
| Guido van Rossum | 142eeb8 | 1997-08-13 03:14:41 +0000 | [diff] [blame] | 584 | } | 
 | 585 |  | 
| Skip Montanaro | e138828 | 2003-08-11 13:15:11 +0000 | [diff] [blame] | 586 | /* End of code for StringO objects */ | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 587 | /* -------------------------------------------------------- */ | 
 | 588 |  | 
 | 589 | static PyObject * | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 590 | I_close(Iobject *self, PyObject *unused) { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 591 |     Py_CLEAR(self->pbuf); | 
 | 592 |     self->buf = NULL; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 593 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 594 |     self->pos = self->string_size = 0; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 595 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 596 |     Py_INCREF(Py_None); | 
 | 597 |     return Py_None; | 
| Guido van Rossum | 476e49f | 1998-12-15 21:43:15 +0000 | [diff] [blame] | 598 | } | 
 | 599 |  | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 600 | static struct PyMethodDef I_methods[] = { | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 601 |   /* Common methods: */ | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 602 |   {"flush",     (PyCFunction)IO_flush,    METH_NOARGS,  IO_flush__doc__}, | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 603 |   {"getvalue",  (PyCFunction)IO_getval,   METH_VARARGS, IO_getval__doc__}, | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 604 |   {"isatty",    (PyCFunction)IO_isatty,   METH_NOARGS,  IO_isatty__doc__}, | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 605 |   {"read",      (PyCFunction)IO_read,     METH_VARARGS, IO_read__doc__}, | 
 | 606 |   {"readline",  (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__}, | 
 | 607 |   {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__}, | 
 | 608 |   {"reset",     (PyCFunction)IO_reset,    METH_NOARGS,  IO_reset__doc__}, | 
| Fred Drake | 577acb4 | 2010-10-11 19:13:04 +0000 | [diff] [blame] | 609 |   {"seek",      (PyCFunction)IO_seek,     METH_VARARGS, IO_seek__doc__}, | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 610 |   {"tell",      (PyCFunction)IO_tell,     METH_NOARGS,  IO_tell__doc__}, | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 611 |   {"truncate",  (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__}, | 
 | 612 |  | 
 | 613 |   /* Read-only StringIO specific  methods: */ | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 614 |   {"close",     (PyCFunction)I_close,    METH_NOARGS,  O_close__doc__}, | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 615 |   {NULL,        NULL} | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 616 | }; | 
 | 617 |  | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 618 | static void | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 619 | I_dealloc(Iobject *self) { | 
| Guido van Rossum | 15a4039 | 1997-09-03 00:09:26 +0000 | [diff] [blame] | 620 |   Py_XDECREF(self->pbuf); | 
| Guido van Rossum | b18618d | 2000-05-03 23:44:39 +0000 | [diff] [blame] | 621 |   PyObject_Del(self); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 622 | } | 
 | 623 |  | 
| Barry Warsaw | 3e8be72 | 2001-09-22 04:36:49 +0000 | [diff] [blame] | 624 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 625 | PyDoc_STRVAR(Itype__doc__, | 
 | 626 | "Simple type for treating strings as input file streams"); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 627 |  | 
 | 628 | static PyTypeObject Itype = { | 
| Martin v. Löwis | 6819210 | 2007-07-21 06:55:02 +0000 | [diff] [blame] | 629 |   PyVarObject_HEAD_INIT(NULL, 0) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 630 |   "cStringIO.StringI",                  /*tp_name*/ | 
 | 631 |   sizeof(Iobject),                      /*tp_basicsize*/ | 
 | 632 |   0,                                    /*tp_itemsize*/ | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 633 |   /* methods */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 634 |   (destructor)I_dealloc,                /*tp_dealloc*/ | 
 | 635 |   0,                                    /*tp_print*/ | 
 | 636 |   0,                                    /* tp_getattr */ | 
 | 637 |   0,                                    /*tp_setattr*/ | 
 | 638 |   0,                                    /*tp_compare*/ | 
 | 639 |   0,                                    /*tp_repr*/ | 
 | 640 |   0,                                    /*tp_as_number*/ | 
 | 641 |   0,                                    /*tp_as_sequence*/ | 
 | 642 |   0,                                    /*tp_as_mapping*/ | 
 | 643 |   0,                                    /*tp_hash*/ | 
 | 644 |   0,                                    /*tp_call*/ | 
 | 645 |   0,                                    /*tp_str*/ | 
 | 646 |   0,                                    /* tp_getattro */ | 
 | 647 |   0,                                    /* tp_setattro */ | 
 | 648 |   0,                                    /* tp_as_buffer */ | 
 | 649 |   Py_TPFLAGS_DEFAULT,                   /* tp_flags */ | 
 | 650 |   Itype__doc__,                         /* tp_doc */ | 
 | 651 |   0,                                    /* tp_traverse */ | 
 | 652 |   0,                                    /* tp_clear */ | 
 | 653 |   0,                                    /* tp_richcompare */ | 
 | 654 |   0,                                    /* tp_weaklistoffset */ | 
 | 655 |   PyObject_SelfIter,                    /* tp_iter */ | 
 | 656 |   (iternextfunc)IO_iternext,            /* tp_iternext */ | 
 | 657 |   I_methods,                            /* tp_methods */ | 
 | 658 |   0,                                    /* tp_members */ | 
 | 659 |   file_getsetlist,                      /* tp_getset */ | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 660 | }; | 
 | 661 |  | 
| Guido van Rossum | 142eeb8 | 1997-08-13 03:14:41 +0000 | [diff] [blame] | 662 | static PyObject * | 
 | 663 | newIobject(PyObject *s) { | 
 | 664 |   Iobject *self; | 
 | 665 |   char *buf; | 
| Martin v. Löwis | 18e1655 | 2006-02-15 17:27:45 +0000 | [diff] [blame] | 666 |   Py_ssize_t size; | 
| Jeremy Hylton | 127b2ef | 2000-04-12 22:04:01 +0000 | [diff] [blame] | 667 |  | 
| Antoine Pitrou | 5a77fe9 | 2011-10-22 21:26:01 +0200 | [diff] [blame] | 668 |   if (PyUnicode_Check(s)) { | 
 | 669 |     if (PyObject_AsCharBuffer(s, (const char **)&buf, &size) != 0) | 
 | 670 |       return NULL; | 
 | 671 |   } | 
 | 672 |   else if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) { | 
| Georg Brandl | 9616444 | 2007-08-08 13:03:41 +0000 | [diff] [blame] | 673 |     PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found", | 
 | 674 |                  s->ob_type->tp_name); | 
 | 675 |     return NULL; | 
 | 676 |   } | 
| Georg Brandl | 5597e26 | 2006-10-12 09:47:12 +0000 | [diff] [blame] | 677 |  | 
| Martin v. Löwis | 5df2e61 | 2006-03-01 23:10:49 +0000 | [diff] [blame] | 678 |   self = PyObject_New(Iobject, &Itype); | 
 | 679 |   if (!self) return NULL; | 
| Guido van Rossum | 142eeb8 | 1997-08-13 03:14:41 +0000 | [diff] [blame] | 680 |   Py_INCREF(s); | 
 | 681 |   self->buf=buf; | 
 | 682 |   self->string_size=size; | 
 | 683 |   self->pbuf=s; | 
 | 684 |   self->pos=0; | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 685 |  | 
| Guido van Rossum | 142eeb8 | 1997-08-13 03:14:41 +0000 | [diff] [blame] | 686 |   return (PyObject*)self; | 
 | 687 | } | 
 | 688 |  | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 689 | /* End of code for StringI objects */ | 
 | 690 | /* -------------------------------------------------------- */ | 
 | 691 |  | 
 | 692 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 693 | PyDoc_STRVAR(IO_StringIO__doc__, | 
 | 694 | "StringIO([s]) -- Return a StringIO-like stream for reading or writing"); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 695 |  | 
 | 696 | static PyObject * | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 697 | IO_StringIO(PyObject *self, PyObject *args) { | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 698 |   PyObject *s=0; | 
 | 699 |  | 
| Raymond Hettinger | 36cd2bf | 2003-01-03 08:24:58 +0000 | [diff] [blame] | 700 |   if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL; | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 701 |  | 
 | 702 |   if (s) return newIobject(s); | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 703 |   return newOobject(128); | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 704 | } | 
 | 705 |  | 
 | 706 | /* List of methods defined in the module */ | 
 | 707 |  | 
 | 708 | static struct PyMethodDef IO_methods[] = { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 709 |   {"StringIO",  (PyCFunction)IO_StringIO, | 
 | 710 |    METH_VARARGS,        IO_StringIO__doc__}, | 
 | 711 |   {NULL,                NULL}           /* sentinel */ | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 712 | }; | 
 | 713 |  | 
 | 714 |  | 
 | 715 | /* Initialization function for the module (*must* be called initcStringIO) */ | 
 | 716 |  | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 717 | static struct PycStringIO_CAPI CAPI = { | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 718 |   IO_cread, | 
 | 719 |   IO_creadline, | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 720 |   O_cwrite, | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 721 |   IO_cgetval, | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 722 |   newOobject, | 
 | 723 |   newIobject, | 
 | 724 |   &Itype, | 
 | 725 |   &Otype, | 
 | 726 | }; | 
 | 727 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 728 | #ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */ | 
| Mark Hammond | fe51c6d | 2002-08-02 02:27:13 +0000 | [diff] [blame] | 729 | #define PyMODINIT_FUNC void | 
| Guido van Rossum | 476e49f | 1998-12-15 21:43:15 +0000 | [diff] [blame] | 730 | #endif | 
| Mark Hammond | fe51c6d | 2002-08-02 02:27:13 +0000 | [diff] [blame] | 731 | PyMODINIT_FUNC | 
| Thomas Wouters | 58d0510 | 2000-07-24 14:43:35 +0000 | [diff] [blame] | 732 | initcStringIO(void) { | 
| Guido van Rossum | 9efe8ef | 1997-09-03 18:19:40 +0000 | [diff] [blame] | 733 |   PyObject *m, *d, *v; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 734 |  | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 735 |  | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 736 |   /* Create the module and add the functions */ | 
 | 737 |   m = Py_InitModule4("cStringIO", IO_methods, | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 738 |                      cStringIO_module_documentation, | 
 | 739 |                      (PyObject*)NULL,PYTHON_API_VERSION); | 
| Neal Norwitz | 1ac754f | 2006-01-19 06:09:39 +0000 | [diff] [blame] | 740 |   if (m == NULL) return; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 741 |  | 
 | 742 |   /* Add some symbolic constants to the module */ | 
 | 743 |   d = PyModule_GetDict(m); | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 744 |  | 
| Guido van Rossum | 55702f8 | 1997-01-06 22:57:52 +0000 | [diff] [blame] | 745 |   /* Export C API */ | 
| Christian Heimes | e93237d | 2007-12-19 02:37:44 +0000 | [diff] [blame] | 746 |   Py_TYPE(&Itype)=&PyType_Type; | 
 | 747 |   Py_TYPE(&Otype)=&PyType_Type; | 
| Raymond Hettinger | 352f947 | 2003-04-24 15:50:11 +0000 | [diff] [blame] | 748 |   if (PyType_Ready(&Otype) < 0) return; | 
 | 749 |   if (PyType_Ready(&Itype) < 0) return; | 
| Larry Hastings | 402b73f | 2010-03-25 00:54:54 +0000 | [diff] [blame] | 750 |   v = PyCapsule_New(&CAPI, PycStringIO_CAPSULE_NAME, NULL); | 
 | 751 |   PyDict_SetItemString(d,"cStringIO_CAPI", v); | 
| Guido van Rossum | 9efe8ef | 1997-09-03 18:19:40 +0000 | [diff] [blame] | 752 |   Py_XDECREF(v); | 
| Guido van Rossum | 154417e | 1997-04-09 17:35:33 +0000 | [diff] [blame] | 753 |  | 
 | 754 |   /* Export Types */ | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 755 |   PyDict_SetItemString(d,"InputType",  (PyObject*)&Itype); | 
 | 756 |   PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype); | 
| Guido van Rossum | 142eeb8 | 1997-08-13 03:14:41 +0000 | [diff] [blame] | 757 |  | 
 | 758 |   /* Maybe make certain warnings go away */ | 
| Jim Fulton | e60de4d | 2000-10-06 19:24:23 +0000 | [diff] [blame] | 759 |   if (0) PycString_IMPORT; | 
| Guido van Rossum | 049cd90 | 1996-12-05 23:30:48 +0000 | [diff] [blame] | 760 | } |