blob: 7e75879215a053cfb153f19a08ea6cc418b2786e [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;
292
293 Py_INCREF(Py_None);
294 return Py_None;
295}
296
Raymond Hettinger352f9472003-04-24 15:50:11 +0000297static PyObject *
298IO_iternext(Iobject *self)
299{
300 PyObject *next;
301 next = IO_readline((IOobject *)self, NULL);
302 if (!next)
303 return NULL;
304 if (!PyString_GET_SIZE(next)) {
305 Py_DECREF(next);
306 PyErr_SetNone(PyExc_StopIteration);
307 return NULL;
308 }
309 return next;
310}
311
Jim Fultone60de4d2000-10-06 19:24:23 +0000312
313
314
315/* Read-write object methods */
316
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000317PyDoc_STRVAR(O_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000318"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000319"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000320
321static PyObject *
322O_seek(Oobject *self, PyObject *args) {
323 int position, mode = 0;
324
325 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
326 UNLESS (PyArg_ParseTuple(args, "i|i:seek", &position, &mode))
327 return NULL;
328
329 if (mode == 2) {
330 position += self->string_size;
331 }
332 else if (mode == 1) {
333 position += self->pos;
334 }
335
336 if (position > self->buf_size) {
337 self->buf_size*=2;
338 if (self->buf_size <= position) self->buf_size=position+1;
Tim Peterse7c05322004-06-27 17:24:49 +0000339 UNLESS (self->buf = (char*)
340 realloc(self->buf,self->buf_size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000341 self->buf_size=self->pos=0;
342 return PyErr_NoMemory();
343 }
344 }
345 else if (position < 0) position=0;
346
347 self->pos=position;
348
349 while (--position >= self->string_size) self->buf[position]=0;
350
351 Py_INCREF(Py_None);
352 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000353}
354
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000355PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000356"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000357"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000358
359
360static int
Guido van Rossum154417e1997-04-09 17:35:33 +0000361O_cwrite(PyObject *self, char *c, int l) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000362 int newl;
Guido van Rossum2f098122001-12-07 20:20:28 +0000363 Oobject *oself;
Guido van Rossum55702f81997-01-06 22:57:52 +0000364
Jim Fultone60de4d2000-10-06 19:24:23 +0000365 UNLESS (IO__opencheck(IOOOBJECT(self))) return -1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000366 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000367
Guido van Rossum2f098122001-12-07 20:20:28 +0000368 newl = oself->pos+l;
369 if (newl >= oself->buf_size) {
370 oself->buf_size *= 2;
371 if (oself->buf_size <= newl)
372 oself->buf_size = newl+1;
373 UNLESS (oself->buf =
Tim Peterse7c05322004-06-27 17:24:49 +0000374 (char*)realloc(oself->buf, oself->buf_size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000375 PyErr_SetString(PyExc_MemoryError,"out of memory");
Guido van Rossum2f098122001-12-07 20:20:28 +0000376 oself->buf_size = oself->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000377 return -1;
378 }
379 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000380
Guido van Rossum2f098122001-12-07 20:20:28 +0000381 memcpy(oself->buf+oself->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000382
Guido van Rossum2f098122001-12-07 20:20:28 +0000383 oself->pos += l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000384
Guido van Rossum2f098122001-12-07 20:20:28 +0000385 if (oself->string_size < oself->pos) {
386 oself->string_size = oself->pos;
387 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000388
389 return l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000390}
391
392static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000393O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000394 char *c;
395 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000396
Guido van Rossuma883a3d2002-04-29 13:54:48 +0000397 UNLESS (PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000398
Jim Fultone60de4d2000-10-06 19:24:23 +0000399 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000400
Jim Fultone60de4d2000-10-06 19:24:23 +0000401 Py_INCREF(Py_None);
402 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000403}
404
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000405PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000406
407static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000408O_close(Oobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000409 if (self->buf != NULL) free(self->buf);
410 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000411
Jim Fultone60de4d2000-10-06 19:24:23 +0000412 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000413
Jim Fultone60de4d2000-10-06 19:24:23 +0000414 Py_INCREF(Py_None);
415 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000416}
417
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000418PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000419"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
420"\n"
421"Note that newlines are not added. The sequence can be any iterable object\n"
422"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000423static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000424O_writelines(Oobject *self, PyObject *args) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000425 PyObject *it, *s;
426
427 it = PyObject_GetIter(args);
428 if (it == NULL)
Raymond Hettingerbc72c5a2004-02-27 10:30:49 +0000429 return NULL;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000430 while ((s = PyIter_Next(it)) != NULL) {
431 int n;
432 char *c;
433 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
434 Py_DECREF(it);
435 Py_DECREF(s);
436 return NULL;
437 }
438 if (O_cwrite((PyObject *)self, c, n) == -1) {
439 Py_DECREF(it);
440 Py_DECREF(s);
441 return NULL;
442 }
443 Py_DECREF(s);
444 }
445 Py_DECREF(it);
446 Py_RETURN_NONE;
Guido van Rossum049cd901996-12-05 23:30:48 +0000447}
448
449static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000450 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000451 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000452 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000453 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000454 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
455 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
456 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000457 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
458 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000459 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
460
461 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000462 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000463 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
464 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000465 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000466 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000467};
468
Raymond Hettinger352f9472003-04-24 15:50:11 +0000469static PyMemberDef O_memberlist[] = {
470 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
471 "flag indicating that a space needs to be printed; used by print"},
Raymond Hettinger5475f232003-08-08 12:20:03 +0000472 /* getattr(f, "closed") is implemented without this table */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000473 {NULL} /* Sentinel */
474};
475
Guido van Rossum049cd901996-12-05 23:30:48 +0000476static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000477O_dealloc(Oobject *self) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000478 if (self->buf != NULL)
479 free(self->buf);
480 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000481}
482
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000483PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000484
485static PyTypeObject Otype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000486 PyObject_HEAD_INIT(NULL)
Raymond Hettinger352f9472003-04-24 15:50:11 +0000487 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000488 "cStringIO.StringO", /*tp_name*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000489 sizeof(Oobject), /*tp_basicsize*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000490 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000491 /* methods */
492 (destructor)O_dealloc, /*tp_dealloc*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000493 (printfunc)0, /*tp_print*/
494 0, /*tp_getattr */
495 0, /*tp_setattr */
496 (cmpfunc)0, /*tp_compare*/
497 (reprfunc)0, /*tp_repr*/
498 0, /*tp_as_number*/
499 0, /*tp_as_sequence*/
500 0, /*tp_as_mapping*/
501 (hashfunc)0, /*tp_hash*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000502 (ternaryfunc)0, /*tp_call*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000503 (reprfunc)0, /*tp_str*/
504 0, /*tp_getattro */
505 0, /*tp_setattro */
506 0, /*tp_as_buffer */
507 Py_TPFLAGS_DEFAULT, /*tp_flags*/
508 Otype__doc__, /*tp_doc */
509 0, /*tp_traverse */
510 0, /*tp_clear */
511 0, /*tp_richcompare */
512 0, /*tp_weaklistoffset */
513 PyObject_SelfIter, /*tp_iter */
514 (iternextfunc)IO_iternext, /*tp_iternext */
515 O_methods, /*tp_methods */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000516 O_memberlist, /*tp_members */
517 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000518};
519
Guido van Rossum142eeb81997-08-13 03:14:41 +0000520static PyObject *
521newOobject(int size) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000522 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000523
Jim Fultone60de4d2000-10-06 19:24:23 +0000524 self = PyObject_New(Oobject, &Otype);
525 if (self == NULL)
526 return NULL;
527 self->pos=0;
528 self->string_size = 0;
529 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000530
Tim Peterse7c05322004-06-27 17:24:49 +0000531 UNLESS (self->buf = (char *)malloc(size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000532 PyErr_SetString(PyExc_MemoryError,"out of memory");
533 self->buf_size = 0;
534 return NULL;
535 }
536
537 self->buf_size=size;
538 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000539}
540
Skip Montanaroe1388282003-08-11 13:15:11 +0000541/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000542/* -------------------------------------------------------- */
543
544static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000545I_close(Iobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000546 Py_XDECREF(self->pbuf);
547 self->pbuf = NULL;
548 self->buf = NULL;
549
550 self->pos = self->string_size = 0;
551
552 Py_INCREF(Py_None);
553 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000554}
555
556static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000557I_seek(Iobject *self, PyObject *args) {
558 int position, mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000559
Jim Fultone60de4d2000-10-06 19:24:23 +0000560 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
561 UNLESS (PyArg_ParseTuple(args, "i|i:seek", &position, &mode))
562 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000563
Jim Fultone60de4d2000-10-06 19:24:23 +0000564 if (mode == 2) position += self->string_size;
565 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000566
Jim Fultone60de4d2000-10-06 19:24:23 +0000567 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000568
Jim Fultone60de4d2000-10-06 19:24:23 +0000569 self->pos=position;
570
571 Py_INCREF(Py_None);
572 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000573}
574
575static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000576 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000577 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000578 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000579 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000580 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
581 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
582 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000583 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
584 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000585 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
586
587 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000588 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000589 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000590 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000591};
592
Guido van Rossum049cd901996-12-05 23:30:48 +0000593static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000594I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000595 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000596 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000597}
598
Barry Warsaw3e8be722001-09-22 04:36:49 +0000599
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000600PyDoc_STRVAR(Itype__doc__,
601"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000602
603static PyTypeObject Itype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000604 PyObject_HEAD_INIT(NULL)
Barry Warsaw3e8be722001-09-22 04:36:49 +0000605 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000606 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000607 sizeof(Iobject), /*tp_basicsize*/
608 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000609 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000610 (destructor)I_dealloc, /*tp_dealloc*/
611 (printfunc)0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000612 0, /* tp_getattr */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000613 (setattrfunc)0, /*tp_setattr*/
614 (cmpfunc)0, /*tp_compare*/
615 (reprfunc)0, /*tp_repr*/
616 0, /*tp_as_number*/
617 0, /*tp_as_sequence*/
618 0, /*tp_as_mapping*/
619 (hashfunc)0, /*tp_hash*/
620 (ternaryfunc)0, /*tp_call*/
621 (reprfunc)0, /*tp_str*/
622 0, /* tp_getattro */
623 0, /* tp_setattro */
624 0, /* tp_as_buffer */
625 Py_TPFLAGS_DEFAULT, /* tp_flags */
626 Itype__doc__, /* tp_doc */
627 0, /* tp_traverse */
628 0, /* tp_clear */
629 0, /* tp_richcompare */
630 0, /* tp_weaklistoffset */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000631 PyObject_SelfIter, /* tp_iter */
632 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000633 I_methods, /* tp_methods */
634 0, /* tp_members */
635 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000636};
637
Guido van Rossum142eeb81997-08-13 03:14:41 +0000638static PyObject *
639newIobject(PyObject *s) {
640 Iobject *self;
641 char *buf;
642 int size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000643
Marc-André Lemburge47df7a2001-09-24 17:34:52 +0000644 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
645 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000646 s->ob_type->tp_name);
647 return NULL;
648 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000649 UNLESS (self = PyObject_New(Iobject, &Itype)) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000650 Py_INCREF(s);
651 self->buf=buf;
652 self->string_size=size;
653 self->pbuf=s;
654 self->pos=0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000655
656 return (PyObject*)self;
657}
658
Guido van Rossum049cd901996-12-05 23:30:48 +0000659/* End of code for StringI objects */
660/* -------------------------------------------------------- */
661
662
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000663PyDoc_STRVAR(IO_StringIO__doc__,
664"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000665
666static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000667IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000668 PyObject *s=0;
669
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000670 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000671
672 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000673 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000674}
675
676/* List of methods defined in the module */
677
678static struct PyMethodDef IO_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000679 {"StringIO", (PyCFunction)IO_StringIO,
680 METH_VARARGS, IO_StringIO__doc__},
Guido van Rossum55702f81997-01-06 22:57:52 +0000681 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000682};
683
684
685/* Initialization function for the module (*must* be called initcStringIO) */
686
Guido van Rossum154417e1997-04-09 17:35:33 +0000687static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000688 IO_cread,
689 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000690 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000691 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000692 newOobject,
693 newIobject,
694 &Itype,
695 &Otype,
696};
697
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000698#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
699#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000700#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000701PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000702initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000703 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000704
Guido van Rossum154417e1997-04-09 17:35:33 +0000705
Guido van Rossum049cd901996-12-05 23:30:48 +0000706 /* Create the module and add the functions */
707 m = Py_InitModule4("cStringIO", IO_methods,
708 cStringIO_module_documentation,
709 (PyObject*)NULL,PYTHON_API_VERSION);
710
711 /* Add some symbolic constants to the module */
712 d = PyModule_GetDict(m);
Guido van Rossum049cd901996-12-05 23:30:48 +0000713
Guido van Rossum55702f81997-01-06 22:57:52 +0000714 /* Export C API */
Guido van Rossum154417e1997-04-09 17:35:33 +0000715 Itype.ob_type=&PyType_Type;
716 Otype.ob_type=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000717 if (PyType_Ready(&Otype) < 0) return;
718 if (PyType_Ready(&Itype) < 0) return;
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000719 PyDict_SetItemString(d,"cStringIO_CAPI",
720 v = PyCObject_FromVoidPtr(&CAPI,NULL));
721 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000722
723 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000724 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
725 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000726
727 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000728 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000729}