blob: b7333fdd380d458df262c7d852b358e5bff1d2ec [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
Jim Fultone60de4d2000-10-06 19:24:23 +000036#define UNLESS(E) if (!(E))
Guido van Rossum049cd901996-12-05 23:30:48 +000037
Guido van Rossum049cd901996-12-05 23:30:48 +000038
Jim Fultone60de4d2000-10-06 19:24:23 +000039/* Declaration for file-like objects that manage data as strings
Guido van Rossum049cd901996-12-05 23:30:48 +000040
Jim Fultone60de4d2000-10-06 19:24:23 +000041 The IOobject type should be though of as a common base type for
42 Iobjects, which provide input (read-only) StringIO objects and
43 Oobjects, which provide read-write objects. Most of the methods
44 depend only on common data.
45*/
Guido van Rossum049cd901996-12-05 23:30:48 +000046
47typedef struct {
48 PyObject_HEAD
49 char *buf;
Guido van Rossum476e49f1998-12-15 21:43:15 +000050 int pos, string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +000051} IOobject;
52
53#define IOOOBJECT(O) ((IOobject*)(O))
54
Skip Montanaroe1388282003-08-11 13:15:11 +000055/* Declarations for objects of type StringO */
Jim Fultone60de4d2000-10-06 19:24:23 +000056
57typedef struct { /* Subtype of IOobject */
58 PyObject_HEAD
59 char *buf;
60 int pos, string_size;
61
62 int buf_size, softspace;
63} Oobject;
64
65/* Declarations for objects of type StringI */
66
67typedef struct { /* Subtype of IOobject */
68 PyObject_HEAD
69 char *buf;
70 int pos, string_size;
Marc-André Lemburge47df7a2001-09-24 17:34:52 +000071 /* We store a reference to the object here in order to keep
72 the buffer alive during the lifetime of the Iobject. */
Guido van Rossum049cd901996-12-05 23:30:48 +000073 PyObject *pbuf;
74} Iobject;
75
Jim Fultone60de4d2000-10-06 19:24:23 +000076/* IOobject (common) methods */
77
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000078PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing.");
Jim Fultone60de4d2000-10-06 19:24:23 +000079
80static int
81IO__opencheck(IOobject *self) {
82 UNLESS (self->buf) {
83 PyErr_SetString(PyExc_ValueError,
84 "I/O operation on closed file");
85 return 0;
86 }
87 return 1;
88}
89
90static PyObject *
Raymond Hettinger5475f232003-08-08 12:20:03 +000091IO_get_closed(IOobject *self, void *closure)
92{
93 PyObject *result = Py_False;
94
95 if (self->buf == NULL)
96 result = Py_True;
97 Py_INCREF(result);
98 return result;
99}
100
101static PyGetSetDef file_getsetlist[] = {
102 {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"},
103 {0},
104};
105
106static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000107IO_flush(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000108
109 UNLESS (IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000110
111 Py_INCREF(Py_None);
112 return Py_None;
113}
114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000115PyDoc_STRVAR(IO_getval__doc__,
116"getvalue([use_pos]) -- Get the string value."
117"\n"
118"If use_pos is specified and is a true value, then the string returned\n"
119"will include only the text up to the current file position.\n");
Guido van Rossum049cd901996-12-05 23:30:48 +0000120
121static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000122IO_cgetval(PyObject *self) {
123 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
124 return PyString_FromStringAndSize(((IOobject*)self)->buf,
125 ((IOobject*)self)->pos);
Guido van Rossum049cd901996-12-05 23:30:48 +0000126}
127
Guido van Rossum049cd901996-12-05 23:30:48 +0000128static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000129IO_getval(IOobject *self, PyObject *args) {
130 PyObject *use_pos=Py_None;
131 int s;
132
133 UNLESS (IO__opencheck(self)) return NULL;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000134 UNLESS (PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000135
136 if (PyObject_IsTrue(use_pos)) {
137 s=self->pos;
138 if (s > self->string_size) s=self->string_size;
139 }
140 else
141 s=self->string_size;
142 return PyString_FromStringAndSize(self->buf, s);
Guido van Rossum049cd901996-12-05 23:30:48 +0000143}
144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000145PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0");
Guido van Rossum049cd901996-12-05 23:30:48 +0000146
147static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000148IO_isatty(IOobject *self, PyObject *unused) {
Guido van Rossum674deb22002-09-01 15:06:28 +0000149 Py_INCREF(Py_False);
150 return Py_False;
Guido van Rossum049cd901996-12-05 23:30:48 +0000151}
152
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000153PyDoc_STRVAR(IO_read__doc__,
154"read([s]) -- Read s characters, or the rest of the string");
Guido van Rossum049cd901996-12-05 23:30:48 +0000155
156static int
Jim Fultone60de4d2000-10-06 19:24:23 +0000157IO_cread(PyObject *self, char **output, int n) {
158 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000159
Jim Fultone60de4d2000-10-06 19:24:23 +0000160 UNLESS (IO__opencheck(IOOOBJECT(self))) return -1;
161 l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos;
162 if (n < 0 || n > l) {
163 n = l;
164 if (n < 0) n=0;
165 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000166
Jim Fultone60de4d2000-10-06 19:24:23 +0000167 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
168 ((IOobject*)self)->pos += n;
169 return n;
Guido van Rossum049cd901996-12-05 23:30:48 +0000170}
171
172static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000173IO_read(IOobject *self, PyObject *args) {
174 int n = -1;
175 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000176
Jim Fultone60de4d2000-10-06 19:24:23 +0000177 UNLESS (PyArg_ParseTuple(args, "|i:read", &n)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000178
Jim Fultone60de4d2000-10-06 19:24:23 +0000179 if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000180
Jim Fultone60de4d2000-10-06 19:24:23 +0000181 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000182}
183
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000184PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");
Guido van Rossum049cd901996-12-05 23:30:48 +0000185
186static int
Jim Fultone60de4d2000-10-06 19:24:23 +0000187IO_creadline(PyObject *self, char **output) {
188 char *n, *s;
189 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000190
Jim Fultone60de4d2000-10-06 19:24:23 +0000191 UNLESS (IO__opencheck(IOOOBJECT(self))) return -1;
192
193 for (n = ((IOobject*)self)->buf + ((IOobject*)self)->pos,
194 s = ((IOobject*)self)->buf + ((IOobject*)self)->string_size;
195 n < s && *n != '\n'; n++);
196 if (n < s) n++;
197
198 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
199 l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos;
200 ((IOobject*)self)->pos += l;
201 return l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000202}
203
204static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000205IO_readline(IOobject *self, PyObject *args) {
206 int n, m=-1;
207 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000208
Raymond Hettinger352f9472003-04-24 15:50:11 +0000209 if (args)
210 UNLESS (PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000211
212 if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL;
213 if (m >= 0 && m < n) {
214 m = n - m;
215 n -= m;
216 self->pos -= m;
217 }
218 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000219}
220
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000221PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000222
223static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000224IO_readlines(IOobject *self, PyObject *args) {
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000225 int n;
226 char *output;
227 PyObject *result, *line;
228 int hint = 0, length = 0;
229
Jim Fultone60de4d2000-10-06 19:24:23 +0000230 UNLESS (PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL;
231
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000232 result = PyList_New(0);
233 if (!result)
234 return NULL;
235
Jim Fultone60de4d2000-10-06 19:24:23 +0000236 while (1){
237 if ( (n = IO_creadline((PyObject*)self,&output)) < 0)
238 goto err;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000239 if (n == 0)
240 break;
241 line = PyString_FromStringAndSize (output, n);
Jim Fultone60de4d2000-10-06 19:24:23 +0000242 if (!line)
243 goto err;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000244 PyList_Append (result, line);
245 Py_DECREF (line);
246 length += n;
247 if (hint > 0 && length >= hint)
248 break;
249 }
250 return result;
Jim Fultone60de4d2000-10-06 19:24:23 +0000251 err:
252 Py_DECREF(result);
253 return NULL;
254}
255
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000256PyDoc_STRVAR(IO_reset__doc__,
257"reset() -- Reset the file position to the beginning");
Jim Fultone60de4d2000-10-06 19:24:23 +0000258
259static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000260IO_reset(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000261
262 UNLESS (IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000263
264 self->pos = 0;
265
266 Py_INCREF(Py_None);
267 return Py_None;
268}
269
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000270PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000271
272static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000273IO_tell(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000274
275 UNLESS (IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000276
277 return PyInt_FromLong(self->pos);
278}
279
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000280PyDoc_STRVAR(IO_truncate__doc__,
281"truncate(): truncate the file at the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000282
283static PyObject *
284IO_truncate(IOobject *self, PyObject *args) {
285 int pos = -1;
286
287 UNLESS (IO__opencheck(self)) return NULL;
288 UNLESS (PyArg_ParseTuple(args, "|i:truncate", &pos)) return NULL;
289 if (pos < 0) pos = self->pos;
290
291 if (self->string_size > pos) self->string_size = pos;
Tim Peters037b3ee2004-08-21 06:55:43 +0000292 self->pos = self->string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +0000293
294 Py_INCREF(Py_None);
295 return Py_None;
296}
297
Raymond Hettinger352f9472003-04-24 15:50:11 +0000298static PyObject *
299IO_iternext(Iobject *self)
300{
301 PyObject *next;
302 next = IO_readline((IOobject *)self, NULL);
303 if (!next)
304 return NULL;
305 if (!PyString_GET_SIZE(next)) {
306 Py_DECREF(next);
307 PyErr_SetNone(PyExc_StopIteration);
308 return NULL;
309 }
310 return next;
311}
312
Jim Fultone60de4d2000-10-06 19:24:23 +0000313
314
315
316/* Read-write object methods */
317
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000318PyDoc_STRVAR(O_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000319"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000320"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000321
322static PyObject *
323O_seek(Oobject *self, PyObject *args) {
324 int position, mode = 0;
325
326 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
327 UNLESS (PyArg_ParseTuple(args, "i|i:seek", &position, &mode))
328 return NULL;
329
330 if (mode == 2) {
331 position += self->string_size;
332 }
333 else if (mode == 1) {
334 position += self->pos;
335 }
336
337 if (position > self->buf_size) {
338 self->buf_size*=2;
339 if (self->buf_size <= position) self->buf_size=position+1;
Tim Peterse7c05322004-06-27 17:24:49 +0000340 UNLESS (self->buf = (char*)
341 realloc(self->buf,self->buf_size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000342 self->buf_size=self->pos=0;
343 return PyErr_NoMemory();
344 }
345 }
346 else if (position < 0) position=0;
347
348 self->pos=position;
349
350 while (--position >= self->string_size) self->buf[position]=0;
351
352 Py_INCREF(Py_None);
353 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000354}
355
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000356PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000357"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000358"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000359
360
361static int
Guido van Rossum154417e1997-04-09 17:35:33 +0000362O_cwrite(PyObject *self, char *c, int l) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000363 int newl;
Guido van Rossum2f098122001-12-07 20:20:28 +0000364 Oobject *oself;
Guido van Rossum55702f81997-01-06 22:57:52 +0000365
Jim Fultone60de4d2000-10-06 19:24:23 +0000366 UNLESS (IO__opencheck(IOOOBJECT(self))) return -1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000367 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000368
Guido van Rossum2f098122001-12-07 20:20:28 +0000369 newl = oself->pos+l;
370 if (newl >= oself->buf_size) {
371 oself->buf_size *= 2;
372 if (oself->buf_size <= newl)
373 oself->buf_size = newl+1;
374 UNLESS (oself->buf =
Tim Peterse7c05322004-06-27 17:24:49 +0000375 (char*)realloc(oself->buf, oself->buf_size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000376 PyErr_SetString(PyExc_MemoryError,"out of memory");
Guido van Rossum2f098122001-12-07 20:20:28 +0000377 oself->buf_size = oself->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000378 return -1;
379 }
380 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000381
Guido van Rossum2f098122001-12-07 20:20:28 +0000382 memcpy(oself->buf+oself->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000383
Guido van Rossum2f098122001-12-07 20:20:28 +0000384 oself->pos += l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000385
Guido van Rossum2f098122001-12-07 20:20:28 +0000386 if (oself->string_size < oself->pos) {
387 oself->string_size = oself->pos;
388 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000389
390 return l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000391}
392
393static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000394O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000395 char *c;
396 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000397
Guido van Rossuma883a3d2002-04-29 13:54:48 +0000398 UNLESS (PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000399
Jim Fultone60de4d2000-10-06 19:24:23 +0000400 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000401
Jim Fultone60de4d2000-10-06 19:24:23 +0000402 Py_INCREF(Py_None);
403 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000404}
405
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000406PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000407
408static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000409O_close(Oobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000410 if (self->buf != NULL) free(self->buf);
411 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000412
Jim Fultone60de4d2000-10-06 19:24:23 +0000413 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000414
Jim Fultone60de4d2000-10-06 19:24:23 +0000415 Py_INCREF(Py_None);
416 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000417}
418
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000419PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000420"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
421"\n"
422"Note that newlines are not added. The sequence can be any iterable object\n"
423"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000424static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000425O_writelines(Oobject *self, PyObject *args) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000426 PyObject *it, *s;
427
428 it = PyObject_GetIter(args);
429 if (it == NULL)
Raymond Hettingerbc72c5a2004-02-27 10:30:49 +0000430 return NULL;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000431 while ((s = PyIter_Next(it)) != NULL) {
432 int n;
433 char *c;
434 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
435 Py_DECREF(it);
436 Py_DECREF(s);
437 return NULL;
438 }
439 if (O_cwrite((PyObject *)self, c, n) == -1) {
440 Py_DECREF(it);
441 Py_DECREF(s);
442 return NULL;
443 }
444 Py_DECREF(s);
445 }
446 Py_DECREF(it);
447 Py_RETURN_NONE;
Guido van Rossum049cd901996-12-05 23:30:48 +0000448}
449
450static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000451 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000452 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000453 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000454 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000455 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
456 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
457 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000458 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
459 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000460 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
461
462 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000463 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000464 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
465 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000466 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000467 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000468};
469
Raymond Hettinger352f9472003-04-24 15:50:11 +0000470static PyMemberDef O_memberlist[] = {
471 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
472 "flag indicating that a space needs to be printed; used by print"},
Raymond Hettinger5475f232003-08-08 12:20:03 +0000473 /* getattr(f, "closed") is implemented without this table */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000474 {NULL} /* Sentinel */
475};
476
Guido van Rossum049cd901996-12-05 23:30:48 +0000477static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000478O_dealloc(Oobject *self) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000479 if (self->buf != NULL)
480 free(self->buf);
481 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000482}
483
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000484PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000485
486static PyTypeObject Otype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000487 PyObject_HEAD_INIT(NULL)
Raymond Hettinger352f9472003-04-24 15:50:11 +0000488 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000489 "cStringIO.StringO", /*tp_name*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000490 sizeof(Oobject), /*tp_basicsize*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000491 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000492 /* methods */
493 (destructor)O_dealloc, /*tp_dealloc*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000494 (printfunc)0, /*tp_print*/
495 0, /*tp_getattr */
496 0, /*tp_setattr */
497 (cmpfunc)0, /*tp_compare*/
498 (reprfunc)0, /*tp_repr*/
499 0, /*tp_as_number*/
500 0, /*tp_as_sequence*/
501 0, /*tp_as_mapping*/
502 (hashfunc)0, /*tp_hash*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000503 (ternaryfunc)0, /*tp_call*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000504 (reprfunc)0, /*tp_str*/
505 0, /*tp_getattro */
506 0, /*tp_setattro */
507 0, /*tp_as_buffer */
508 Py_TPFLAGS_DEFAULT, /*tp_flags*/
509 Otype__doc__, /*tp_doc */
510 0, /*tp_traverse */
511 0, /*tp_clear */
512 0, /*tp_richcompare */
513 0, /*tp_weaklistoffset */
514 PyObject_SelfIter, /*tp_iter */
515 (iternextfunc)IO_iternext, /*tp_iternext */
516 O_methods, /*tp_methods */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000517 O_memberlist, /*tp_members */
518 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000519};
520
Guido van Rossum142eeb81997-08-13 03:14:41 +0000521static PyObject *
522newOobject(int size) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000523 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000524
Jim Fultone60de4d2000-10-06 19:24:23 +0000525 self = PyObject_New(Oobject, &Otype);
526 if (self == NULL)
527 return NULL;
528 self->pos=0;
529 self->string_size = 0;
530 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000531
Tim Peterse7c05322004-06-27 17:24:49 +0000532 UNLESS (self->buf = (char *)malloc(size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000533 PyErr_SetString(PyExc_MemoryError,"out of memory");
534 self->buf_size = 0;
535 return NULL;
536 }
537
538 self->buf_size=size;
539 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000540}
541
Skip Montanaroe1388282003-08-11 13:15:11 +0000542/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000543/* -------------------------------------------------------- */
544
545static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000546I_close(Iobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000547 Py_XDECREF(self->pbuf);
548 self->pbuf = NULL;
549 self->buf = NULL;
550
551 self->pos = self->string_size = 0;
552
553 Py_INCREF(Py_None);
554 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000555}
556
557static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000558I_seek(Iobject *self, PyObject *args) {
559 int position, mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000560
Jim Fultone60de4d2000-10-06 19:24:23 +0000561 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
562 UNLESS (PyArg_ParseTuple(args, "i|i:seek", &position, &mode))
563 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000564
Jim Fultone60de4d2000-10-06 19:24:23 +0000565 if (mode == 2) position += self->string_size;
566 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000567
Jim Fultone60de4d2000-10-06 19:24:23 +0000568 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000569
Jim Fultone60de4d2000-10-06 19:24:23 +0000570 self->pos=position;
571
572 Py_INCREF(Py_None);
573 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000574}
575
576static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000577 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000578 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000579 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000580 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000581 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
582 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
583 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000584 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
585 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000586 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
587
588 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000589 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000590 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000591 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000592};
593
Guido van Rossum049cd901996-12-05 23:30:48 +0000594static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000595I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000596 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000597 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000598}
599
Barry Warsaw3e8be722001-09-22 04:36:49 +0000600
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000601PyDoc_STRVAR(Itype__doc__,
602"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000603
604static PyTypeObject Itype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000605 PyObject_HEAD_INIT(NULL)
Barry Warsaw3e8be722001-09-22 04:36:49 +0000606 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000607 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000608 sizeof(Iobject), /*tp_basicsize*/
609 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000610 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000611 (destructor)I_dealloc, /*tp_dealloc*/
612 (printfunc)0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000613 0, /* tp_getattr */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000614 (setattrfunc)0, /*tp_setattr*/
615 (cmpfunc)0, /*tp_compare*/
616 (reprfunc)0, /*tp_repr*/
617 0, /*tp_as_number*/
618 0, /*tp_as_sequence*/
619 0, /*tp_as_mapping*/
620 (hashfunc)0, /*tp_hash*/
621 (ternaryfunc)0, /*tp_call*/
622 (reprfunc)0, /*tp_str*/
623 0, /* tp_getattro */
624 0, /* tp_setattro */
625 0, /* tp_as_buffer */
626 Py_TPFLAGS_DEFAULT, /* tp_flags */
627 Itype__doc__, /* tp_doc */
628 0, /* tp_traverse */
629 0, /* tp_clear */
630 0, /* tp_richcompare */
631 0, /* tp_weaklistoffset */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000632 PyObject_SelfIter, /* tp_iter */
633 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000634 I_methods, /* tp_methods */
635 0, /* tp_members */
636 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000637};
638
Guido van Rossum142eeb81997-08-13 03:14:41 +0000639static PyObject *
640newIobject(PyObject *s) {
641 Iobject *self;
642 char *buf;
643 int size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000644
Marc-André Lemburge47df7a2001-09-24 17:34:52 +0000645 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
646 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000647 s->ob_type->tp_name);
648 return NULL;
649 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000650 UNLESS (self = PyObject_New(Iobject, &Itype)) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000651 Py_INCREF(s);
652 self->buf=buf;
653 self->string_size=size;
654 self->pbuf=s;
655 self->pos=0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000656
657 return (PyObject*)self;
658}
659
Guido van Rossum049cd901996-12-05 23:30:48 +0000660/* End of code for StringI objects */
661/* -------------------------------------------------------- */
662
663
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000664PyDoc_STRVAR(IO_StringIO__doc__,
665"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000666
667static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000668IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000669 PyObject *s=0;
670
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000671 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000672
673 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000674 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000675}
676
677/* List of methods defined in the module */
678
679static struct PyMethodDef IO_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000680 {"StringIO", (PyCFunction)IO_StringIO,
681 METH_VARARGS, IO_StringIO__doc__},
Guido van Rossum55702f81997-01-06 22:57:52 +0000682 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000683};
684
685
686/* Initialization function for the module (*must* be called initcStringIO) */
687
Guido van Rossum154417e1997-04-09 17:35:33 +0000688static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000689 IO_cread,
690 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000691 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000692 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000693 newOobject,
694 newIobject,
695 &Itype,
696 &Otype,
697};
698
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000699#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
700#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000701#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000702PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000703initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000704 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000705
Guido van Rossum154417e1997-04-09 17:35:33 +0000706
Guido van Rossum049cd901996-12-05 23:30:48 +0000707 /* Create the module and add the functions */
708 m = Py_InitModule4("cStringIO", IO_methods,
709 cStringIO_module_documentation,
710 (PyObject*)NULL,PYTHON_API_VERSION);
711
712 /* Add some symbolic constants to the module */
713 d = PyModule_GetDict(m);
Guido van Rossum049cd901996-12-05 23:30:48 +0000714
Guido van Rossum55702f81997-01-06 22:57:52 +0000715 /* Export C API */
Guido van Rossum154417e1997-04-09 17:35:33 +0000716 Itype.ob_type=&PyType_Type;
717 Otype.ob_type=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000718 if (PyType_Ready(&Otype) < 0) return;
719 if (PyType_Ready(&Itype) < 0) return;
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000720 PyDict_SetItemString(d,"cStringIO_CAPI",
721 v = PyCObject_FromVoidPtr(&CAPI,NULL));
722 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000723
724 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000725 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
726 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000727
728 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000729 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000730}