blob: 9922d03f3ac22b6d054c2655b24b0eca981c7fe9 [file] [log] [blame]
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001
2#include "Python.h"
3#include "import.h"
4#include "cStringIO.h"
Raymond Hettinger352f9472003-04-24 15:50:11 +00005#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006
7PyDoc_STRVAR(cStringIO_module_documentation,
Guido van Rossum049cd901996-12-05 23:30:48 +00008"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 Drakeaef10002000-06-19 13:17:41 +000012"full generality of StringIO, but it provides enough for most\n"
Thomas Wouters7e474022000-07-16 12:04:32 +000013"applications and is especially useful in conjunction with the\n"
Guido van Rossum049cd901996-12-05 23:30:48 +000014"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 Hyltonb189b072002-03-08 17:17:33 +000023" value=an_output_stream.getvalue()\n"
Guido van Rossum049cd901996-12-05 23:30:48 +000024"\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 Rossum7d9b4131998-11-25 16:17:32 +000028" an_input_stream.seek(0) # OK, start over\n"
Guido van Rossum049cd901996-12-05 23:30:48 +000029" 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 Rossum142eeb81997-08-13 03:14:41 +000033"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000034"cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n");
Guido van Rossum049cd901996-12-05 23:30:48 +000035
Antoine Pitrouc83ea132010-05-09 14:46:46 +000036/* Declaration for file-like objects that manage data as strings
Guido van Rossum049cd901996-12-05 23:30:48 +000037
Jim Fultone60de4d2000-10-06 19:24:23 +000038 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 Rossum049cd901996-12-05 23:30:48 +000043
44typedef struct {
45 PyObject_HEAD
46 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000047 Py_ssize_t pos, string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +000048} IOobject;
49
50#define IOOOBJECT(O) ((IOobject*)(O))
51
Skip Montanaroe1388282003-08-11 13:15:11 +000052/* Declarations for objects of type StringO */
Jim Fultone60de4d2000-10-06 19:24:23 +000053
54typedef struct { /* Subtype of IOobject */
55 PyObject_HEAD
56 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000057 Py_ssize_t pos, string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +000058
Martin v. Löwis18e16552006-02-15 17:27:45 +000059 Py_ssize_t buf_size;
60 int softspace;
Jim Fultone60de4d2000-10-06 19:24:23 +000061} Oobject;
62
63/* Declarations for objects of type StringI */
64
65typedef struct { /* Subtype of IOobject */
66 PyObject_HEAD
67 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000068 Py_ssize_t pos, string_size;
Marc-André Lemburge47df7a2001-09-24 17:34:52 +000069 /* We store a reference to the object here in order to keep
70 the buffer alive during the lifetime of the Iobject. */
Guido van Rossum049cd901996-12-05 23:30:48 +000071 PyObject *pbuf;
72} Iobject;
73
Jim Fultone60de4d2000-10-06 19:24:23 +000074/* IOobject (common) methods */
75
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000076PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing.");
Jim Fultone60de4d2000-10-06 19:24:23 +000077
78static int
79IO__opencheck(IOobject *self) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000080 if (!self->buf) {
81 PyErr_SetString(PyExc_ValueError,
82 "I/O operation on closed file");
83 return 0;
84 }
85 return 1;
Jim Fultone60de4d2000-10-06 19:24:23 +000086}
87
88static PyObject *
Raymond Hettinger5475f232003-08-08 12:20:03 +000089IO_get_closed(IOobject *self, void *closure)
90{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000091 PyObject *result = Py_False;
Raymond Hettinger5475f232003-08-08 12:20:03 +000092
Antoine Pitrouc83ea132010-05-09 14:46:46 +000093 if (self->buf == NULL)
94 result = Py_True;
95 Py_INCREF(result);
96 return result;
Raymond Hettinger5475f232003-08-08 12:20:03 +000097}
98
99static PyGetSetDef file_getsetlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000100 {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"},
101 {0},
Raymond Hettinger5475f232003-08-08 12:20:03 +0000102};
103
104static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000105IO_flush(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000106
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000107 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000108
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000109 Py_INCREF(Py_None);
110 return Py_None;
Jim Fultone60de4d2000-10-06 19:24:23 +0000111}
112
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000113PyDoc_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 Rossum049cd901996-12-05 23:30:48 +0000118
119static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000120IO_cgetval(PyObject *self) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000121 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 Rossum049cd901996-12-05 23:30:48 +0000125}
126
Guido van Rossum049cd901996-12-05 23:30:48 +0000127static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000128IO_getval(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000129 PyObject *use_pos=Py_None;
Antoine Pitrouc5bef752012-08-15 23:16:51 +0200130 int b;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000131 Py_ssize_t s;
Jim Fultone60de4d2000-10-06 19:24:23 +0000132
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000133 if (!IO__opencheck(self)) return NULL;
134 if (!PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000135
Antoine Pitrouc5bef752012-08-15 23:16:51 +0200136 b = PyObject_IsTrue(use_pos);
137 if (b < 0)
138 return NULL;
139 if (b) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000140 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 Rossum049cd901996-12-05 23:30:48 +0000147}
148
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000149PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0");
Guido van Rossum049cd901996-12-05 23:30:48 +0000150
151static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000152IO_isatty(IOobject *self, PyObject *unused) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000153 if (!IO__opencheck(self)) return NULL;
154 Py_INCREF(Py_False);
155 return Py_False;
Guido van Rossum049cd901996-12-05 23:30:48 +0000156}
157
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000158PyDoc_STRVAR(IO_read__doc__,
159"read([s]) -- Read s characters, or the rest of the string");
Guido van Rossum049cd901996-12-05 23:30:48 +0000160
161static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000162IO_cread(PyObject *self, char **output, Py_ssize_t n) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000163 Py_ssize_t l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000164
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000165 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 }
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200173 if (n > INT_MAX) {
174 PyErr_SetString(PyExc_OverflowError,
175 "length too large");
176 return -1;
177 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000178
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000179 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
180 ((IOobject*)self)->pos += n;
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200181 return (int)n;
Guido van Rossum049cd901996-12-05 23:30:48 +0000182}
183
184static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000185IO_read(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000186 Py_ssize_t n = -1;
187 char *output = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000188
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000189 if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000190
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000191 if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000192
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000193 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000194}
195
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000196PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");
Guido van Rossum049cd901996-12-05 23:30:48 +0000197
198static int
Jim Fultone60de4d2000-10-06 19:24:23 +0000199IO_creadline(PyObject *self, char **output) {
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200200 char *n, *start, *end;
201 Py_ssize_t len;
Guido van Rossum049cd901996-12-05 23:30:48 +0000202
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000203 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000204
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200205 n = start = ((IOobject*)self)->buf + ((IOobject*)self)->pos;
206 end = ((IOobject*)self)->buf + ((IOobject*)self)->string_size;
207 while (n < end && *n != '\n')
208 n++;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000209
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200210 if (n < end) n++;
Jim Fultone60de4d2000-10-06 19:24:23 +0000211
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200212 len = n - start;
213 if (len > INT_MAX) {
214 PyErr_SetString(PyExc_OverflowError,
215 "length too large");
216 return -1;
217 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000218
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200219 *output=start;
220
221 assert(IOOOBJECT(self)->pos <= PY_SSIZE_T_MAX - len);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000222 assert(IOOOBJECT(self)->pos >= 0);
223 assert(IOOOBJECT(self)->string_size >= 0);
Gregory P. Smith9d534572008-06-11 07:41:16 +0000224
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200225 ((IOobject*)self)->pos += len;
226 return (int)len;
Guido van Rossum049cd901996-12-05 23:30:48 +0000227}
228
229static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000230IO_readline(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000231 int n, m=-1;
232 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000233
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000234 if (args)
235 if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000236
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000237 if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL;
238 if (m >= 0 && m < n) {
239 m = n - m;
240 n -= m;
241 self->pos -= m;
242 }
243 assert(IOOOBJECT(self)->pos >= 0);
244 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000245}
246
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000247PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000248
249static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000250IO_readlines(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000251 int n;
252 char *output;
253 PyObject *result, *line;
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200254 Py_ssize_t hint = 0, length = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000255
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200256 if (!PyArg_ParseTuple(args, "|n:readlines", &hint)) return NULL;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000257
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000258 result = PyList_New(0);
259 if (!result)
Jim Fultone60de4d2000-10-06 19:24:23 +0000260 return NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000261
262 while (1){
263 if ( (n = IO_creadline((PyObject*)self,&output)) < 0)
264 goto err;
265 if (n == 0)
266 break;
267 line = PyString_FromStringAndSize (output, n);
268 if (!line)
269 goto err;
270 if (PyList_Append (result, line) == -1) {
271 Py_DECREF (line);
272 goto err;
273 }
274 Py_DECREF (line);
275 length += n;
276 if (hint > 0 && length >= hint)
277 break;
278 }
279 return result;
280 err:
281 Py_DECREF(result);
282 return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000283}
284
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000285PyDoc_STRVAR(IO_reset__doc__,
286"reset() -- Reset the file position to the beginning");
Jim Fultone60de4d2000-10-06 19:24:23 +0000287
288static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000289IO_reset(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000290
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000291 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000292
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000293 self->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000294
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000295 Py_INCREF(Py_None);
296 return Py_None;
Jim Fultone60de4d2000-10-06 19:24:23 +0000297}
298
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000299PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000300
301static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000302IO_tell(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000303
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000304 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000305
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000306 assert(self->pos >= 0);
307 return PyInt_FromSsize_t(self->pos);
Jim Fultone60de4d2000-10-06 19:24:23 +0000308}
309
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000310PyDoc_STRVAR(IO_truncate__doc__,
311"truncate(): truncate the file at the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000312
313static PyObject *
314IO_truncate(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000315 Py_ssize_t pos = -1;
Martin v. Löwiscffcc8b2006-11-19 10:41:41 +0000316
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000317 if (!IO__opencheck(self)) return NULL;
318 if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;
Martin v. Löwiscffcc8b2006-11-19 10:41:41 +0000319
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000320 if (PyTuple_Size(args) == 0) {
321 /* No argument passed, truncate to current position */
322 pos = self->pos;
323 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000324
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000325 if (pos < 0) {
326 errno = EINVAL;
327 PyErr_SetFromErrno(PyExc_IOError);
328 return NULL;
329 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000330
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000331 if (self->string_size > pos) self->string_size = pos;
332 self->pos = self->string_size;
333
334 Py_INCREF(Py_None);
335 return Py_None;
Jim Fultone60de4d2000-10-06 19:24:23 +0000336}
337
Raymond Hettinger352f9472003-04-24 15:50:11 +0000338static PyObject *
339IO_iternext(Iobject *self)
340{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000341 PyObject *next;
342 next = IO_readline((IOobject *)self, NULL);
343 if (!next)
344 return NULL;
345 if (!PyString_GET_SIZE(next)) {
346 Py_DECREF(next);
347 PyErr_SetNone(PyExc_StopIteration);
348 return NULL;
349 }
350 return next;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000351}
352
Jim Fultone60de4d2000-10-06 19:24:23 +0000353
354
355
356/* Read-write object methods */
357
Fred Drake577acb42010-10-11 19:13:04 +0000358PyDoc_STRVAR(IO_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000359"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000360"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000361
362static PyObject *
Fred Drake577acb42010-10-11 19:13:04 +0000363IO_seek(Iobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000364 Py_ssize_t position;
365 int mode = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000366
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000367 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
368 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
369 return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000370
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000371 if (mode == 2) {
372 position += self->string_size;
373 }
374 else if (mode == 1) {
375 position += self->pos;
376 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000377
Fred Drake577acb42010-10-11 19:13:04 +0000378 if (position < 0) position=0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000379
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000380 self->pos=position;
Jim Fultone60de4d2000-10-06 19:24:23 +0000381
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000382 Py_INCREF(Py_None);
383 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000384}
385
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000386PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000387"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000388"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000389
390
391static int
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200392O_cwrite(PyObject *self, const char *c, Py_ssize_t len) {
393 Py_ssize_t newpos;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000394 Oobject *oself;
395 char *newbuf;
Guido van Rossum55702f81997-01-06 22:57:52 +0000396
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000397 if (!IO__opencheck(IOOOBJECT(self))) return -1;
398 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000399
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200400 if (len > INT_MAX) {
401 PyErr_SetString(PyExc_OverflowError,
402 "length too large");
403 return -1;
404 }
405 assert(len >= 0);
406 if (oself->pos >= PY_SSIZE_T_MAX - len) {
407 PyErr_SetString(PyExc_OverflowError,
408 "new position too large");
409 return -1;
410 }
411 newpos = oself->pos + len;
412 if (newpos >= oself->buf_size) {
413 size_t newsize = oself->buf_size;
414 newsize *= 2;
415 if (newsize <= (size_t)newpos || newsize > PY_SSIZE_T_MAX) {
416 assert(newpos < PY_SSIZE_T_MAX - 1);
417 newsize = newpos + 1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000418 }
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200419 newbuf = (char*)realloc(oself->buf, newsize);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000420 if (!newbuf) {
421 PyErr_SetString(PyExc_MemoryError,"out of memory");
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000422 return -1;
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200423 }
424 oself->buf_size = (Py_ssize_t)newsize;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000425 oself->buf = newbuf;
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200426 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000427
Fred Drake577acb42010-10-11 19:13:04 +0000428 if (oself->string_size < oself->pos) {
429 /* In case of overseek, pad with null bytes the buffer region between
430 the end of stream and the current position.
431
432 0 lo string_size hi
433 | |<---used--->|<----------available----------->|
434 | | <--to pad-->|<---to write---> |
435 0 buf position
436 */
437 memset(oself->buf + oself->string_size, '\0',
438 (oself->pos - oself->string_size) * sizeof(char));
439 }
440
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200441 memcpy(oself->buf + oself->pos, c, len);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000442
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200443 oself->pos = newpos;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000444
445 if (oself->string_size < oself->pos) {
446 oself->string_size = oself->pos;
447 }
448
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200449 return (int)len;
Guido van Rossum049cd901996-12-05 23:30:48 +0000450}
451
452static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000453O_write(Oobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000454 char *c;
455 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000456
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000457 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000458
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000459 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000460
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000461 Py_INCREF(Py_None);
462 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000463}
464
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000465PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000466
467static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000468O_close(Oobject *self, PyObject *unused) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000469 if (self->buf != NULL) free(self->buf);
470 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000471
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000472 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000473
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000474 Py_INCREF(Py_None);
475 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000476}
477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000478PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000479"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
480"\n"
481"Note that newlines are not added. The sequence can be any iterable object\n"
482"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000483static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000484O_writelines(Oobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000485 PyObject *it, *s;
486
487 it = PyObject_GetIter(args);
488 if (it == NULL)
489 return NULL;
490 while ((s = PyIter_Next(it)) != NULL) {
491 Py_ssize_t n;
492 char *c;
493 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
494 Py_DECREF(it);
495 Py_DECREF(s);
496 return NULL;
497 }
498 if (O_cwrite((PyObject *)self, c, n) == -1) {
499 Py_DECREF(it);
500 Py_DECREF(s);
501 return NULL;
502 }
503 Py_DECREF(s);
Michael W. Hudson10402a32005-09-22 09:19:01 +0000504 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000505
Michael W. Hudson10402a32005-09-22 09:19:01 +0000506 Py_DECREF(it);
507
508 /* See if PyIter_Next failed */
509 if (PyErr_Occurred())
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000510 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000511
512 Py_RETURN_NONE;
513}
Guido van Rossum049cd901996-12-05 23:30:48 +0000514static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000515 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000516 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000517 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000518 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000519 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
520 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
521 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
522 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
Fred Drake577acb42010-10-11 19:13:04 +0000523 {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000524 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000525 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
526
527 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000528 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000529 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
530 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
531 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000532};
533
Raymond Hettinger352f9472003-04-24 15:50:11 +0000534static PyMemberDef O_memberlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000535 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
536 "flag indicating that a space needs to be printed; used by print"},
537 /* getattr(f, "closed") is implemented without this table */
538 {NULL} /* Sentinel */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000539};
540
Guido van Rossum049cd901996-12-05 23:30:48 +0000541static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000542O_dealloc(Oobject *self) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000543 if (self->buf != NULL)
544 free(self->buf);
545 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000546}
547
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000548PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000549
550static PyTypeObject Otype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000551 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000552 "cStringIO.StringO", /*tp_name*/
553 sizeof(Oobject), /*tp_basicsize*/
554 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000555 /* methods */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000556 (destructor)O_dealloc, /*tp_dealloc*/
557 0, /*tp_print*/
558 0, /*tp_getattr */
559 0, /*tp_setattr */
560 0, /*tp_compare*/
561 0, /*tp_repr*/
562 0, /*tp_as_number*/
563 0, /*tp_as_sequence*/
564 0, /*tp_as_mapping*/
565 0, /*tp_hash*/
566 0 , /*tp_call*/
567 0, /*tp_str*/
568 0, /*tp_getattro */
569 0, /*tp_setattro */
570 0, /*tp_as_buffer */
571 Py_TPFLAGS_DEFAULT, /*tp_flags*/
572 Otype__doc__, /*tp_doc */
573 0, /*tp_traverse */
574 0, /*tp_clear */
575 0, /*tp_richcompare */
576 0, /*tp_weaklistoffset */
577 PyObject_SelfIter, /*tp_iter */
578 (iternextfunc)IO_iternext, /*tp_iternext */
579 O_methods, /*tp_methods */
580 O_memberlist, /*tp_members */
581 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000582};
583
Guido van Rossum142eeb81997-08-13 03:14:41 +0000584static PyObject *
585newOobject(int size) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000586 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000587
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000588 self = PyObject_New(Oobject, &Otype);
589 if (self == NULL)
590 return NULL;
591 self->pos=0;
592 self->string_size = 0;
593 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000594
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000595 self->buf = (char *)malloc(size);
596 if (!self->buf) {
597 PyErr_SetString(PyExc_MemoryError,"out of memory");
598 self->buf_size = 0;
599 Py_DECREF(self);
600 return NULL;
601 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000602
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000603 self->buf_size=size;
604 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000605}
606
Skip Montanaroe1388282003-08-11 13:15:11 +0000607/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000608/* -------------------------------------------------------- */
609
610static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000611I_close(Iobject *self, PyObject *unused) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000612 Py_CLEAR(self->pbuf);
613 self->buf = NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000614
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000615 self->pos = self->string_size = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000616
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000617 Py_INCREF(Py_None);
618 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000619}
620
Guido van Rossum049cd901996-12-05 23:30:48 +0000621static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000622 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000623 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000624 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000625 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000626 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
627 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
628 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
629 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
Fred Drake577acb42010-10-11 19:13:04 +0000630 {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000631 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000632 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
633
634 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000635 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000636 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000637};
638
Guido van Rossum049cd901996-12-05 23:30:48 +0000639static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000640I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000641 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000642 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000643}
644
Barry Warsaw3e8be722001-09-22 04:36:49 +0000645
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000646PyDoc_STRVAR(Itype__doc__,
647"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000648
649static PyTypeObject Itype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000650 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000651 "cStringIO.StringI", /*tp_name*/
652 sizeof(Iobject), /*tp_basicsize*/
653 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000654 /* methods */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000655 (destructor)I_dealloc, /*tp_dealloc*/
656 0, /*tp_print*/
657 0, /* tp_getattr */
658 0, /*tp_setattr*/
659 0, /*tp_compare*/
660 0, /*tp_repr*/
661 0, /*tp_as_number*/
662 0, /*tp_as_sequence*/
663 0, /*tp_as_mapping*/
664 0, /*tp_hash*/
665 0, /*tp_call*/
666 0, /*tp_str*/
667 0, /* tp_getattro */
668 0, /* tp_setattro */
669 0, /* tp_as_buffer */
670 Py_TPFLAGS_DEFAULT, /* tp_flags */
671 Itype__doc__, /* tp_doc */
672 0, /* tp_traverse */
673 0, /* tp_clear */
674 0, /* tp_richcompare */
675 0, /* tp_weaklistoffset */
676 PyObject_SelfIter, /* tp_iter */
677 (iternextfunc)IO_iternext, /* tp_iternext */
678 I_methods, /* tp_methods */
679 0, /* tp_members */
680 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000681};
682
Guido van Rossum142eeb81997-08-13 03:14:41 +0000683static PyObject *
684newIobject(PyObject *s) {
685 Iobject *self;
686 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000687 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000688
Antoine Pitrou5a77fe92011-10-22 21:26:01 +0200689 if (PyUnicode_Check(s)) {
690 if (PyObject_AsCharBuffer(s, (const char **)&buf, &size) != 0)
691 return NULL;
692 }
693 else if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
Georg Brandl96164442007-08-08 13:03:41 +0000694 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
695 s->ob_type->tp_name);
696 return NULL;
697 }
Georg Brandl5597e262006-10-12 09:47:12 +0000698
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000699 self = PyObject_New(Iobject, &Itype);
700 if (!self) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000701 Py_INCREF(s);
702 self->buf=buf;
703 self->string_size=size;
704 self->pbuf=s;
705 self->pos=0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000706
Guido van Rossum142eeb81997-08-13 03:14:41 +0000707 return (PyObject*)self;
708}
709
Guido van Rossum049cd901996-12-05 23:30:48 +0000710/* End of code for StringI objects */
711/* -------------------------------------------------------- */
712
713
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000714PyDoc_STRVAR(IO_StringIO__doc__,
715"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000716
717static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000718IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000719 PyObject *s=0;
720
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000721 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000722
723 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000724 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000725}
726
727/* List of methods defined in the module */
728
729static struct PyMethodDef IO_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000730 {"StringIO", (PyCFunction)IO_StringIO,
731 METH_VARARGS, IO_StringIO__doc__},
732 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000733};
734
735
736/* Initialization function for the module (*must* be called initcStringIO) */
737
Guido van Rossum154417e1997-04-09 17:35:33 +0000738static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000739 IO_cread,
740 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000741 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000742 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000743 newOobject,
744 newIobject,
745 &Itype,
746 &Otype,
747};
748
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000749#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000750#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000751#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000752PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000753initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000754 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000755
Guido van Rossum154417e1997-04-09 17:35:33 +0000756
Guido van Rossum049cd901996-12-05 23:30:48 +0000757 /* Create the module and add the functions */
758 m = Py_InitModule4("cStringIO", IO_methods,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000759 cStringIO_module_documentation,
760 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000761 if (m == NULL) return;
Guido van Rossum049cd901996-12-05 23:30:48 +0000762
763 /* Add some symbolic constants to the module */
764 d = PyModule_GetDict(m);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000765
Guido van Rossum55702f81997-01-06 22:57:52 +0000766 /* Export C API */
Christian Heimese93237d2007-12-19 02:37:44 +0000767 Py_TYPE(&Itype)=&PyType_Type;
768 Py_TYPE(&Otype)=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000769 if (PyType_Ready(&Otype) < 0) return;
770 if (PyType_Ready(&Itype) < 0) return;
Larry Hastings402b73f2010-03-25 00:54:54 +0000771 v = PyCapsule_New(&CAPI, PycStringIO_CAPSULE_NAME, NULL);
772 PyDict_SetItemString(d,"cStringIO_CAPI", v);
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000773 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000774
775 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000776 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
777 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000778
779 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000780 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000781}