blob: a19a31e9d35a180d851fc251aaab5295bca00f60 [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 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000173
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000174 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
175 ((IOobject*)self)->pos += n;
176 return n;
Guido van Rossum049cd901996-12-05 23:30:48 +0000177}
178
179static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000180IO_read(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000181 Py_ssize_t n = -1;
182 char *output = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000183
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000184 if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000185
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000186 if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000187
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000188 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000189}
190
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000191PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");
Guido van Rossum049cd901996-12-05 23:30:48 +0000192
193static int
Jim Fultone60de4d2000-10-06 19:24:23 +0000194IO_creadline(PyObject *self, char **output) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000195 char *n, *s;
196 Py_ssize_t l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000197
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000198 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000199
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000200 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. Smith9d534572008-06-11 07:41:16 +0000203
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000204 if (n < s) n++;
Jim Fultone60de4d2000-10-06 19:24:23 +0000205
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000206 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
207 l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000208
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000209 assert(IOOOBJECT(self)->pos <= PY_SSIZE_T_MAX - l);
210 assert(IOOOBJECT(self)->pos >= 0);
211 assert(IOOOBJECT(self)->string_size >= 0);
Gregory P. Smith9d534572008-06-11 07:41:16 +0000212
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000213 ((IOobject*)self)->pos += l;
214 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000215}
216
217static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000218IO_readline(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000219 int n, m=-1;
220 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000221
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000222 if (args)
223 if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000224
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000225 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 Rossum049cd901996-12-05 23:30:48 +0000233}
234
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000235PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000236
237static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000238IO_readlines(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000239 int n;
240 char *output;
241 PyObject *result, *line;
242 int hint = 0, length = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000243
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000244 if (!PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000245
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000246 result = PyList_New(0);
247 if (!result)
Jim Fultone60de4d2000-10-06 19:24:23 +0000248 return NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000249
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 Fultone60de4d2000-10-06 19:24:23 +0000271}
272
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000273PyDoc_STRVAR(IO_reset__doc__,
274"reset() -- Reset the file position to the beginning");
Jim Fultone60de4d2000-10-06 19:24:23 +0000275
276static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000277IO_reset(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000278
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000279 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000280
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000281 self->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000282
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000283 Py_INCREF(Py_None);
284 return Py_None;
Jim Fultone60de4d2000-10-06 19:24:23 +0000285}
286
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000287PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000288
289static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000290IO_tell(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000291
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000292 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000293
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000294 assert(self->pos >= 0);
295 return PyInt_FromSsize_t(self->pos);
Jim Fultone60de4d2000-10-06 19:24:23 +0000296}
297
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000298PyDoc_STRVAR(IO_truncate__doc__,
299"truncate(): truncate the file at the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000300
301static PyObject *
302IO_truncate(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000303 Py_ssize_t pos = -1;
Martin v. Löwiscffcc8b2006-11-19 10:41:41 +0000304
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000305 if (!IO__opencheck(self)) return NULL;
306 if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;
Martin v. Löwiscffcc8b2006-11-19 10:41:41 +0000307
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000308 if (PyTuple_Size(args) == 0) {
309 /* No argument passed, truncate to current position */
310 pos = self->pos;
311 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000312
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000313 if (pos < 0) {
314 errno = EINVAL;
315 PyErr_SetFromErrno(PyExc_IOError);
316 return NULL;
317 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000318
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000319 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 Fultone60de4d2000-10-06 19:24:23 +0000324}
325
Raymond Hettinger352f9472003-04-24 15:50:11 +0000326static PyObject *
327IO_iternext(Iobject *self)
328{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000329 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 Hettinger352f9472003-04-24 15:50:11 +0000339}
340
Jim Fultone60de4d2000-10-06 19:24:23 +0000341
342
343
344/* Read-write object methods */
345
Fred Drake577acb42010-10-11 19:13:04 +0000346PyDoc_STRVAR(IO_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000347"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000348"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000349
350static PyObject *
Fred Drake577acb42010-10-11 19:13:04 +0000351IO_seek(Iobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000352 Py_ssize_t position;
353 int mode = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000354
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000355 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
356 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
357 return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000358
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000359 if (mode == 2) {
360 position += self->string_size;
361 }
362 else if (mode == 1) {
363 position += self->pos;
364 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000365
Fred Drake577acb42010-10-11 19:13:04 +0000366 if (position < 0) position=0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000367
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000368 self->pos=position;
Jim Fultone60de4d2000-10-06 19:24:23 +0000369
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000370 Py_INCREF(Py_None);
371 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000372}
373
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000374PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000375"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000376"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000377
378
379static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000380O_cwrite(PyObject *self, const char *c, Py_ssize_t l) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000381 Py_ssize_t newl;
382 Oobject *oself;
383 char *newbuf;
Guido van Rossum55702f81997-01-06 22:57:52 +0000384
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000385 if (!IO__opencheck(IOOOBJECT(self))) return -1;
386 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000387
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000388 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 Rossum2f098122001-12-07 20:20:28 +0000394 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000395 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 Fultone60de4d2000-10-06 19:24:23 +0000405
Fred Drake577acb42010-10-11 19:13:04 +0000406 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 Pitrouc83ea132010-05-09 14:46:46 +0000419 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 Rossum049cd901996-12-05 23:30:48 +0000429}
430
431static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000432O_write(Oobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000433 char *c;
434 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000435
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000436 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000437
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000438 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000439
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000440 Py_INCREF(Py_None);
441 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000442}
443
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000444PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000445
446static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000447O_close(Oobject *self, PyObject *unused) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000448 if (self->buf != NULL) free(self->buf);
449 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000450
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000451 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000452
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000453 Py_INCREF(Py_None);
454 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000455}
456
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000457PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000458"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 Rossum049cd901996-12-05 23:30:48 +0000462static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000463O_writelines(Oobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000464 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. Hudson10402a32005-09-22 09:19:01 +0000483 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000484
Michael W. Hudson10402a32005-09-22 09:19:01 +0000485 Py_DECREF(it);
486
487 /* See if PyIter_Next failed */
488 if (PyErr_Occurred())
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000489 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000490
491 Py_RETURN_NONE;
492}
Guido van Rossum049cd901996-12-05 23:30:48 +0000493static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000494 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000495 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000496 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000497 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000498 {"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 Drake577acb42010-10-11 19:13:04 +0000502 {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000503 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000504 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
505
506 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000507 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000508 {"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 Rossum049cd901996-12-05 23:30:48 +0000511};
512
Raymond Hettinger352f9472003-04-24 15:50:11 +0000513static PyMemberDef O_memberlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000514 {"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 Hettinger352f9472003-04-24 15:50:11 +0000518};
519
Guido van Rossum049cd901996-12-05 23:30:48 +0000520static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000521O_dealloc(Oobject *self) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000522 if (self->buf != NULL)
523 free(self->buf);
524 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000525}
526
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000527PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000528
529static PyTypeObject Otype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000530 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000531 "cStringIO.StringO", /*tp_name*/
532 sizeof(Oobject), /*tp_basicsize*/
533 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000534 /* methods */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000535 (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 Rossum049cd901996-12-05 23:30:48 +0000561};
562
Guido van Rossum142eeb81997-08-13 03:14:41 +0000563static PyObject *
564newOobject(int size) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000565 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000566
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000567 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 Rossum142eeb81997-08-13 03:14:41 +0000573
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000574 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 Fultone60de4d2000-10-06 19:24:23 +0000581
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000582 self->buf_size=size;
583 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000584}
585
Skip Montanaroe1388282003-08-11 13:15:11 +0000586/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000587/* -------------------------------------------------------- */
588
589static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000590I_close(Iobject *self, PyObject *unused) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000591 Py_CLEAR(self->pbuf);
592 self->buf = NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000593
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000594 self->pos = self->string_size = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000595
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000596 Py_INCREF(Py_None);
597 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000598}
599
Guido van Rossum049cd901996-12-05 23:30:48 +0000600static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000601 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000602 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000603 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000604 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000605 {"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 Drake577acb42010-10-11 19:13:04 +0000609 {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000610 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000611 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
612
613 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000614 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000615 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000616};
617
Guido van Rossum049cd901996-12-05 23:30:48 +0000618static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000619I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000620 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000621 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000622}
623
Barry Warsaw3e8be722001-09-22 04:36:49 +0000624
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000625PyDoc_STRVAR(Itype__doc__,
626"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000627
628static PyTypeObject Itype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000629 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000630 "cStringIO.StringI", /*tp_name*/
631 sizeof(Iobject), /*tp_basicsize*/
632 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000633 /* methods */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000634 (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 Rossum049cd901996-12-05 23:30:48 +0000660};
661
Guido van Rossum142eeb81997-08-13 03:14:41 +0000662static PyObject *
663newIobject(PyObject *s) {
664 Iobject *self;
665 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000666 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000667
Antoine Pitrou5a77fe92011-10-22 21:26:01 +0200668 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 Brandl96164442007-08-08 13:03:41 +0000673 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
674 s->ob_type->tp_name);
675 return NULL;
676 }
Georg Brandl5597e262006-10-12 09:47:12 +0000677
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000678 self = PyObject_New(Iobject, &Itype);
679 if (!self) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000680 Py_INCREF(s);
681 self->buf=buf;
682 self->string_size=size;
683 self->pbuf=s;
684 self->pos=0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000685
Guido van Rossum142eeb81997-08-13 03:14:41 +0000686 return (PyObject*)self;
687}
688
Guido van Rossum049cd901996-12-05 23:30:48 +0000689/* End of code for StringI objects */
690/* -------------------------------------------------------- */
691
692
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000693PyDoc_STRVAR(IO_StringIO__doc__,
694"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000695
696static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000697IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000698 PyObject *s=0;
699
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000700 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000701
702 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000703 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000704}
705
706/* List of methods defined in the module */
707
708static struct PyMethodDef IO_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000709 {"StringIO", (PyCFunction)IO_StringIO,
710 METH_VARARGS, IO_StringIO__doc__},
711 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000712};
713
714
715/* Initialization function for the module (*must* be called initcStringIO) */
716
Guido van Rossum154417e1997-04-09 17:35:33 +0000717static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000718 IO_cread,
719 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000720 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000721 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000722 newOobject,
723 newIobject,
724 &Itype,
725 &Otype,
726};
727
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000728#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000729#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000730#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000731PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000732initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000733 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000734
Guido van Rossum154417e1997-04-09 17:35:33 +0000735
Guido van Rossum049cd901996-12-05 23:30:48 +0000736 /* Create the module and add the functions */
737 m = Py_InitModule4("cStringIO", IO_methods,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000738 cStringIO_module_documentation,
739 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000740 if (m == NULL) return;
Guido van Rossum049cd901996-12-05 23:30:48 +0000741
742 /* Add some symbolic constants to the module */
743 d = PyModule_GetDict(m);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000744
Guido van Rossum55702f81997-01-06 22:57:52 +0000745 /* Export C API */
Christian Heimese93237d2007-12-19 02:37:44 +0000746 Py_TYPE(&Itype)=&PyType_Type;
747 Py_TYPE(&Otype)=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000748 if (PyType_Ready(&Otype) < 0) return;
749 if (PyType_Ready(&Itype) < 0) return;
Larry Hastings402b73f2010-03-25 00:54:54 +0000750 v = PyCapsule_New(&CAPI, PycStringIO_CAPSULE_NAME, NULL);
751 PyDict_SetItemString(d,"cStringIO_CAPI", v);
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000752 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000753
754 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000755 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
756 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000757
758 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000759 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000760}