blob: 566851f66d8533ec050e8dddfb5e70faadcfd059 [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;
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200213 if (len > INT_MAX)
214 len = INT_MAX;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000215
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200216 *output=start;
217
218 assert(IOOOBJECT(self)->pos <= PY_SSIZE_T_MAX - len);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000219 assert(IOOOBJECT(self)->pos >= 0);
220 assert(IOOOBJECT(self)->string_size >= 0);
Gregory P. Smith9d534572008-06-11 07:41:16 +0000221
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200222 ((IOobject*)self)->pos += len;
223 return (int)len;
Guido van Rossum049cd901996-12-05 23:30:48 +0000224}
225
226static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000227IO_readline(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000228 int n, m=-1;
229 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000230
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000231 if (args)
232 if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000233
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000234 if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL;
235 if (m >= 0 && m < n) {
236 m = n - m;
237 n -= m;
238 self->pos -= m;
239 }
240 assert(IOOOBJECT(self)->pos >= 0);
241 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000242}
243
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000244PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000245
246static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000247IO_readlines(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000248 int n;
249 char *output;
250 PyObject *result, *line;
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200251 Py_ssize_t hint = 0, length = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000252
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200253 if (!PyArg_ParseTuple(args, "|n:readlines", &hint)) return NULL;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000254
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000255 result = PyList_New(0);
256 if (!result)
Jim Fultone60de4d2000-10-06 19:24:23 +0000257 return NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000258
259 while (1){
260 if ( (n = IO_creadline((PyObject*)self,&output)) < 0)
261 goto err;
262 if (n == 0)
263 break;
264 line = PyString_FromStringAndSize (output, n);
265 if (!line)
266 goto err;
267 if (PyList_Append (result, line) == -1) {
268 Py_DECREF (line);
269 goto err;
270 }
271 Py_DECREF (line);
272 length += n;
273 if (hint > 0 && length >= hint)
274 break;
275 }
276 return result;
277 err:
278 Py_DECREF(result);
279 return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000280}
281
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000282PyDoc_STRVAR(IO_reset__doc__,
283"reset() -- Reset the file position to the beginning");
Jim Fultone60de4d2000-10-06 19:24:23 +0000284
285static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000286IO_reset(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000287
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000288 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000289
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000290 self->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000291
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000292 Py_INCREF(Py_None);
293 return Py_None;
Jim Fultone60de4d2000-10-06 19:24:23 +0000294}
295
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000296PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000297
298static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000299IO_tell(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000300
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000301 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000302
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000303 assert(self->pos >= 0);
304 return PyInt_FromSsize_t(self->pos);
Jim Fultone60de4d2000-10-06 19:24:23 +0000305}
306
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000307PyDoc_STRVAR(IO_truncate__doc__,
308"truncate(): truncate the file at the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000309
310static PyObject *
311IO_truncate(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000312 Py_ssize_t pos = -1;
Martin v. Löwiscffcc8b2006-11-19 10:41:41 +0000313
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000314 if (!IO__opencheck(self)) return NULL;
315 if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;
Martin v. Löwiscffcc8b2006-11-19 10:41:41 +0000316
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000317 if (PyTuple_Size(args) == 0) {
318 /* No argument passed, truncate to current position */
319 pos = self->pos;
320 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000321
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000322 if (pos < 0) {
323 errno = EINVAL;
324 PyErr_SetFromErrno(PyExc_IOError);
325 return NULL;
326 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000327
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000328 if (self->string_size > pos) self->string_size = pos;
329 self->pos = self->string_size;
330
331 Py_INCREF(Py_None);
332 return Py_None;
Jim Fultone60de4d2000-10-06 19:24:23 +0000333}
334
Raymond Hettinger352f9472003-04-24 15:50:11 +0000335static PyObject *
336IO_iternext(Iobject *self)
337{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000338 PyObject *next;
339 next = IO_readline((IOobject *)self, NULL);
340 if (!next)
341 return NULL;
342 if (!PyString_GET_SIZE(next)) {
343 Py_DECREF(next);
344 PyErr_SetNone(PyExc_StopIteration);
345 return NULL;
346 }
347 return next;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000348}
349
Jim Fultone60de4d2000-10-06 19:24:23 +0000350
351
352
353/* Read-write object methods */
354
Fred Drake577acb42010-10-11 19:13:04 +0000355PyDoc_STRVAR(IO_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000356"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000357"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000358
359static PyObject *
Fred Drake577acb42010-10-11 19:13:04 +0000360IO_seek(Iobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000361 Py_ssize_t position;
362 int mode = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000363
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000364 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
365 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
366 return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000367
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000368 if (mode == 2) {
369 position += self->string_size;
370 }
371 else if (mode == 1) {
372 position += self->pos;
373 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000374
Fred Drake577acb42010-10-11 19:13:04 +0000375 if (position < 0) position=0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000376
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000377 self->pos=position;
Jim Fultone60de4d2000-10-06 19:24:23 +0000378
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000379 Py_INCREF(Py_None);
380 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000381}
382
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000383PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000384"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000385"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000386
387
388static int
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200389O_cwrite(PyObject *self, const char *c, Py_ssize_t len) {
390 Py_ssize_t newpos;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000391 Oobject *oself;
392 char *newbuf;
Guido van Rossum55702f81997-01-06 22:57:52 +0000393
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000394 if (!IO__opencheck(IOOOBJECT(self))) return -1;
395 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000396
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200397 if (len > INT_MAX) {
398 PyErr_SetString(PyExc_OverflowError,
399 "length too large");
400 return -1;
401 }
402 assert(len >= 0);
403 if (oself->pos >= PY_SSIZE_T_MAX - len) {
404 PyErr_SetString(PyExc_OverflowError,
405 "new position too large");
406 return -1;
407 }
408 newpos = oself->pos + len;
409 if (newpos >= oself->buf_size) {
410 size_t newsize = oself->buf_size;
411 newsize *= 2;
412 if (newsize <= (size_t)newpos || newsize > PY_SSIZE_T_MAX) {
413 assert(newpos < PY_SSIZE_T_MAX - 1);
414 newsize = newpos + 1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000415 }
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200416 newbuf = (char*)realloc(oself->buf, newsize);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000417 if (!newbuf) {
418 PyErr_SetString(PyExc_MemoryError,"out of memory");
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000419 return -1;
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200420 }
421 oself->buf_size = (Py_ssize_t)newsize;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000422 oself->buf = newbuf;
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200423 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000424
Fred Drake577acb42010-10-11 19:13:04 +0000425 if (oself->string_size < oself->pos) {
426 /* In case of overseek, pad with null bytes the buffer region between
427 the end of stream and the current position.
428
429 0 lo string_size hi
430 | |<---used--->|<----------available----------->|
431 | | <--to pad-->|<---to write---> |
432 0 buf position
433 */
434 memset(oself->buf + oself->string_size, '\0',
435 (oself->pos - oself->string_size) * sizeof(char));
436 }
437
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200438 memcpy(oself->buf + oself->pos, c, len);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000439
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200440 oself->pos = newpos;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000441
442 if (oself->string_size < oself->pos) {
443 oself->string_size = oself->pos;
444 }
445
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200446 return (int)len;
Guido van Rossum049cd901996-12-05 23:30:48 +0000447}
448
449static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000450O_write(Oobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000451 char *c;
452 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000453
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000454 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000455
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000456 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000457
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000458 Py_INCREF(Py_None);
459 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000460}
461
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000462PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000463
464static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000465O_close(Oobject *self, PyObject *unused) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000466 if (self->buf != NULL) free(self->buf);
467 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000468
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000469 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000470
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000471 Py_INCREF(Py_None);
472 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000473}
474
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000475PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000476"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
477"\n"
478"Note that newlines are not added. The sequence can be any iterable object\n"
479"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000480static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000481O_writelines(Oobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000482 PyObject *it, *s;
483
484 it = PyObject_GetIter(args);
485 if (it == NULL)
486 return NULL;
487 while ((s = PyIter_Next(it)) != NULL) {
488 Py_ssize_t n;
489 char *c;
490 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
491 Py_DECREF(it);
492 Py_DECREF(s);
493 return NULL;
494 }
495 if (O_cwrite((PyObject *)self, c, n) == -1) {
496 Py_DECREF(it);
497 Py_DECREF(s);
498 return NULL;
499 }
500 Py_DECREF(s);
Michael W. Hudson10402a32005-09-22 09:19:01 +0000501 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000502
Michael W. Hudson10402a32005-09-22 09:19:01 +0000503 Py_DECREF(it);
504
505 /* See if PyIter_Next failed */
506 if (PyErr_Occurred())
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000507 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000508
509 Py_RETURN_NONE;
510}
Guido van Rossum049cd901996-12-05 23:30:48 +0000511static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000512 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000513 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000514 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000515 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000516 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
517 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
518 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
519 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
Fred Drake577acb42010-10-11 19:13:04 +0000520 {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000521 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000522 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
523
524 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000525 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000526 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
527 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
528 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000529};
530
Raymond Hettinger352f9472003-04-24 15:50:11 +0000531static PyMemberDef O_memberlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000532 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
533 "flag indicating that a space needs to be printed; used by print"},
534 /* getattr(f, "closed") is implemented without this table */
535 {NULL} /* Sentinel */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000536};
537
Guido van Rossum049cd901996-12-05 23:30:48 +0000538static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000539O_dealloc(Oobject *self) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000540 if (self->buf != NULL)
541 free(self->buf);
542 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000543}
544
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000545PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000546
547static PyTypeObject Otype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000548 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000549 "cStringIO.StringO", /*tp_name*/
550 sizeof(Oobject), /*tp_basicsize*/
551 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000552 /* methods */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000553 (destructor)O_dealloc, /*tp_dealloc*/
554 0, /*tp_print*/
555 0, /*tp_getattr */
556 0, /*tp_setattr */
557 0, /*tp_compare*/
558 0, /*tp_repr*/
559 0, /*tp_as_number*/
560 0, /*tp_as_sequence*/
561 0, /*tp_as_mapping*/
562 0, /*tp_hash*/
563 0 , /*tp_call*/
564 0, /*tp_str*/
565 0, /*tp_getattro */
566 0, /*tp_setattro */
567 0, /*tp_as_buffer */
568 Py_TPFLAGS_DEFAULT, /*tp_flags*/
569 Otype__doc__, /*tp_doc */
570 0, /*tp_traverse */
571 0, /*tp_clear */
572 0, /*tp_richcompare */
573 0, /*tp_weaklistoffset */
574 PyObject_SelfIter, /*tp_iter */
575 (iternextfunc)IO_iternext, /*tp_iternext */
576 O_methods, /*tp_methods */
577 O_memberlist, /*tp_members */
578 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000579};
580
Guido van Rossum142eeb81997-08-13 03:14:41 +0000581static PyObject *
582newOobject(int size) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000583 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000584
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000585 self = PyObject_New(Oobject, &Otype);
586 if (self == NULL)
587 return NULL;
588 self->pos=0;
589 self->string_size = 0;
590 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000591
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000592 self->buf = (char *)malloc(size);
593 if (!self->buf) {
594 PyErr_SetString(PyExc_MemoryError,"out of memory");
595 self->buf_size = 0;
596 Py_DECREF(self);
597 return NULL;
598 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000599
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000600 self->buf_size=size;
601 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000602}
603
Skip Montanaroe1388282003-08-11 13:15:11 +0000604/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000605/* -------------------------------------------------------- */
606
607static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000608I_close(Iobject *self, PyObject *unused) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000609 Py_CLEAR(self->pbuf);
610 self->buf = NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000611
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000612 self->pos = self->string_size = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000613
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000614 Py_INCREF(Py_None);
615 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000616}
617
Guido van Rossum049cd901996-12-05 23:30:48 +0000618static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000619 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000620 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000621 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000622 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000623 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
624 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
625 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
626 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
Fred Drake577acb42010-10-11 19:13:04 +0000627 {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000628 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000629 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
630
631 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000632 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000633 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000634};
635
Guido van Rossum049cd901996-12-05 23:30:48 +0000636static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000637I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000638 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000639 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000640}
641
Barry Warsaw3e8be722001-09-22 04:36:49 +0000642
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000643PyDoc_STRVAR(Itype__doc__,
644"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000645
646static PyTypeObject Itype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000647 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000648 "cStringIO.StringI", /*tp_name*/
649 sizeof(Iobject), /*tp_basicsize*/
650 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000651 /* methods */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000652 (destructor)I_dealloc, /*tp_dealloc*/
653 0, /*tp_print*/
654 0, /* tp_getattr */
655 0, /*tp_setattr*/
656 0, /*tp_compare*/
657 0, /*tp_repr*/
658 0, /*tp_as_number*/
659 0, /*tp_as_sequence*/
660 0, /*tp_as_mapping*/
661 0, /*tp_hash*/
662 0, /*tp_call*/
663 0, /*tp_str*/
664 0, /* tp_getattro */
665 0, /* tp_setattro */
666 0, /* tp_as_buffer */
667 Py_TPFLAGS_DEFAULT, /* tp_flags */
668 Itype__doc__, /* tp_doc */
669 0, /* tp_traverse */
670 0, /* tp_clear */
671 0, /* tp_richcompare */
672 0, /* tp_weaklistoffset */
673 PyObject_SelfIter, /* tp_iter */
674 (iternextfunc)IO_iternext, /* tp_iternext */
675 I_methods, /* tp_methods */
676 0, /* tp_members */
677 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000678};
679
Guido van Rossum142eeb81997-08-13 03:14:41 +0000680static PyObject *
681newIobject(PyObject *s) {
682 Iobject *self;
683 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000684 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000685
Antoine Pitrou5a77fe92011-10-22 21:26:01 +0200686 if (PyUnicode_Check(s)) {
687 if (PyObject_AsCharBuffer(s, (const char **)&buf, &size) != 0)
688 return NULL;
689 }
690 else if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
Georg Brandl96164442007-08-08 13:03:41 +0000691 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
692 s->ob_type->tp_name);
693 return NULL;
694 }
Georg Brandl5597e262006-10-12 09:47:12 +0000695
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000696 self = PyObject_New(Iobject, &Itype);
697 if (!self) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000698 Py_INCREF(s);
699 self->buf=buf;
700 self->string_size=size;
701 self->pbuf=s;
702 self->pos=0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000703
Guido van Rossum142eeb81997-08-13 03:14:41 +0000704 return (PyObject*)self;
705}
706
Guido van Rossum049cd901996-12-05 23:30:48 +0000707/* End of code for StringI objects */
708/* -------------------------------------------------------- */
709
710
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000711PyDoc_STRVAR(IO_StringIO__doc__,
712"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000713
714static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000715IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000716 PyObject *s=0;
717
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000718 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000719
720 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000721 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000722}
723
724/* List of methods defined in the module */
725
726static struct PyMethodDef IO_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000727 {"StringIO", (PyCFunction)IO_StringIO,
728 METH_VARARGS, IO_StringIO__doc__},
729 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000730};
731
732
733/* Initialization function for the module (*must* be called initcStringIO) */
734
Guido van Rossum154417e1997-04-09 17:35:33 +0000735static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000736 IO_cread,
737 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000738 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000739 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000740 newOobject,
741 newIobject,
742 &Itype,
743 &Otype,
744};
745
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000746#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000747#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000748#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000749PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000750initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000751 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000752
Guido van Rossum154417e1997-04-09 17:35:33 +0000753
Guido van Rossum049cd901996-12-05 23:30:48 +0000754 /* Create the module and add the functions */
755 m = Py_InitModule4("cStringIO", IO_methods,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000756 cStringIO_module_documentation,
757 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000758 if (m == NULL) return;
Guido van Rossum049cd901996-12-05 23:30:48 +0000759
760 /* Add some symbolic constants to the module */
761 d = PyModule_GetDict(m);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000762
Guido van Rossum55702f81997-01-06 22:57:52 +0000763 /* Export C API */
Christian Heimese93237d2007-12-19 02:37:44 +0000764 Py_TYPE(&Itype)=&PyType_Type;
765 Py_TYPE(&Otype)=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000766 if (PyType_Ready(&Otype) < 0) return;
767 if (PyType_Ready(&Itype) < 0) return;
Larry Hastings402b73f2010-03-25 00:54:54 +0000768 v = PyCapsule_New(&CAPI, PycStringIO_CAPSULE_NAME, NULL);
769 PyDict_SetItemString(d,"cStringIO_CAPI", v);
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000770 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000771
772 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000773 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
774 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000775
776 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000777 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000778}