blob: ad2f36b9b399eba3b1aa781e901b72352fe79d71 [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;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000244 if (PyList_Append (result, line) == -1) {
245 Py_DECREF (line);
246 goto err;
247 }
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000248 Py_DECREF (line);
249 length += n;
250 if (hint > 0 && length >= hint)
251 break;
252 }
253 return result;
Jim Fultone60de4d2000-10-06 19:24:23 +0000254 err:
255 Py_DECREF(result);
256 return NULL;
257}
258
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000259PyDoc_STRVAR(IO_reset__doc__,
260"reset() -- Reset the file position to the beginning");
Jim Fultone60de4d2000-10-06 19:24:23 +0000261
262static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000263IO_reset(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000264
265 UNLESS (IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000266
267 self->pos = 0;
268
269 Py_INCREF(Py_None);
270 return Py_None;
271}
272
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000273PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000274
275static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000276IO_tell(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000277
278 UNLESS (IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000279
280 return PyInt_FromLong(self->pos);
281}
282
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000283PyDoc_STRVAR(IO_truncate__doc__,
284"truncate(): truncate the file at the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000285
286static PyObject *
287IO_truncate(IOobject *self, PyObject *args) {
288 int pos = -1;
289
290 UNLESS (IO__opencheck(self)) return NULL;
291 UNLESS (PyArg_ParseTuple(args, "|i:truncate", &pos)) return NULL;
292 if (pos < 0) pos = self->pos;
293
294 if (self->string_size > pos) self->string_size = pos;
Tim Peters037b3ee2004-08-21 06:55:43 +0000295 self->pos = self->string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +0000296
297 Py_INCREF(Py_None);
298 return Py_None;
299}
300
Raymond Hettinger352f9472003-04-24 15:50:11 +0000301static PyObject *
302IO_iternext(Iobject *self)
303{
304 PyObject *next;
305 next = IO_readline((IOobject *)self, NULL);
306 if (!next)
307 return NULL;
308 if (!PyString_GET_SIZE(next)) {
309 Py_DECREF(next);
310 PyErr_SetNone(PyExc_StopIteration);
311 return NULL;
312 }
313 return next;
314}
315
Jim Fultone60de4d2000-10-06 19:24:23 +0000316
317
318
319/* Read-write object methods */
320
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000321PyDoc_STRVAR(O_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000322"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000323"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000324
325static PyObject *
326O_seek(Oobject *self, PyObject *args) {
327 int position, mode = 0;
328
329 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
330 UNLESS (PyArg_ParseTuple(args, "i|i:seek", &position, &mode))
331 return NULL;
332
333 if (mode == 2) {
334 position += self->string_size;
335 }
336 else if (mode == 1) {
337 position += self->pos;
338 }
339
340 if (position > self->buf_size) {
341 self->buf_size*=2;
342 if (self->buf_size <= position) self->buf_size=position+1;
Tim Peterse7c05322004-06-27 17:24:49 +0000343 UNLESS (self->buf = (char*)
344 realloc(self->buf,self->buf_size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000345 self->buf_size=self->pos=0;
346 return PyErr_NoMemory();
347 }
348 }
349 else if (position < 0) position=0;
350
351 self->pos=position;
352
353 while (--position >= self->string_size) self->buf[position]=0;
354
355 Py_INCREF(Py_None);
356 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000357}
358
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000359PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000360"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000361"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000362
363
364static int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000365O_cwrite(PyObject *self, const char *c, int l) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000366 int newl;
Guido van Rossum2f098122001-12-07 20:20:28 +0000367 Oobject *oself;
Guido van Rossum55702f81997-01-06 22:57:52 +0000368
Jim Fultone60de4d2000-10-06 19:24:23 +0000369 UNLESS (IO__opencheck(IOOOBJECT(self))) return -1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000370 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000371
Guido van Rossum2f098122001-12-07 20:20:28 +0000372 newl = oself->pos+l;
373 if (newl >= oself->buf_size) {
374 oself->buf_size *= 2;
375 if (oself->buf_size <= newl)
376 oself->buf_size = newl+1;
377 UNLESS (oself->buf =
Tim Peterse7c05322004-06-27 17:24:49 +0000378 (char*)realloc(oself->buf, oself->buf_size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000379 PyErr_SetString(PyExc_MemoryError,"out of memory");
Guido van Rossum2f098122001-12-07 20:20:28 +0000380 oself->buf_size = oself->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000381 return -1;
382 }
383 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000384
Guido van Rossum2f098122001-12-07 20:20:28 +0000385 memcpy(oself->buf+oself->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000386
Guido van Rossum2f098122001-12-07 20:20:28 +0000387 oself->pos += l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000388
Guido van Rossum2f098122001-12-07 20:20:28 +0000389 if (oself->string_size < oself->pos) {
390 oself->string_size = oself->pos;
391 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000392
393 return l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000394}
395
396static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000397O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000398 char *c;
399 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000400
Guido van Rossuma883a3d2002-04-29 13:54:48 +0000401 UNLESS (PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000402
Jim Fultone60de4d2000-10-06 19:24:23 +0000403 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000404
Jim Fultone60de4d2000-10-06 19:24:23 +0000405 Py_INCREF(Py_None);
406 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000407}
408
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000409PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000410
411static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000412O_close(Oobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000413 if (self->buf != NULL) free(self->buf);
414 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000415
Jim Fultone60de4d2000-10-06 19:24:23 +0000416 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000417
Jim Fultone60de4d2000-10-06 19:24:23 +0000418 Py_INCREF(Py_None);
419 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000420}
421
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000422PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000423"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
424"\n"
425"Note that newlines are not added. The sequence can be any iterable object\n"
426"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000427static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000428O_writelines(Oobject *self, PyObject *args) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000429 PyObject *it, *s;
430
431 it = PyObject_GetIter(args);
432 if (it == NULL)
Raymond Hettingerbc72c5a2004-02-27 10:30:49 +0000433 return NULL;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000434 while ((s = PyIter_Next(it)) != NULL) {
435 int n;
436 char *c;
437 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
438 Py_DECREF(it);
439 Py_DECREF(s);
440 return NULL;
441 }
442 if (O_cwrite((PyObject *)self, c, n) == -1) {
443 Py_DECREF(it);
444 Py_DECREF(s);
445 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000446 }
447 Py_DECREF(s);
448 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000449
Michael W. Hudson10402a32005-09-22 09:19:01 +0000450 Py_DECREF(it);
451
452 /* See if PyIter_Next failed */
453 if (PyErr_Occurred())
454 return NULL;
455
456 Py_RETURN_NONE;
457}
Guido van Rossum049cd901996-12-05 23:30:48 +0000458static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000459 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000460 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000461 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000462 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000463 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
464 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
465 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000466 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
467 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000468 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
469
470 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000471 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000472 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
473 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000474 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000475 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000476};
477
Raymond Hettinger352f9472003-04-24 15:50:11 +0000478static PyMemberDef O_memberlist[] = {
479 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
480 "flag indicating that a space needs to be printed; used by print"},
Raymond Hettinger5475f232003-08-08 12:20:03 +0000481 /* getattr(f, "closed") is implemented without this table */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000482 {NULL} /* Sentinel */
483};
484
Guido van Rossum049cd901996-12-05 23:30:48 +0000485static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000486O_dealloc(Oobject *self) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000487 if (self->buf != NULL)
488 free(self->buf);
489 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000490}
491
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000492PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000493
494static PyTypeObject Otype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000495 PyObject_HEAD_INIT(NULL)
Raymond Hettinger352f9472003-04-24 15:50:11 +0000496 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000497 "cStringIO.StringO", /*tp_name*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000498 sizeof(Oobject), /*tp_basicsize*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000499 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000500 /* methods */
501 (destructor)O_dealloc, /*tp_dealloc*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000502 (printfunc)0, /*tp_print*/
503 0, /*tp_getattr */
504 0, /*tp_setattr */
505 (cmpfunc)0, /*tp_compare*/
506 (reprfunc)0, /*tp_repr*/
507 0, /*tp_as_number*/
508 0, /*tp_as_sequence*/
509 0, /*tp_as_mapping*/
510 (hashfunc)0, /*tp_hash*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000511 (ternaryfunc)0, /*tp_call*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000512 (reprfunc)0, /*tp_str*/
513 0, /*tp_getattro */
514 0, /*tp_setattro */
515 0, /*tp_as_buffer */
516 Py_TPFLAGS_DEFAULT, /*tp_flags*/
517 Otype__doc__, /*tp_doc */
518 0, /*tp_traverse */
519 0, /*tp_clear */
520 0, /*tp_richcompare */
521 0, /*tp_weaklistoffset */
522 PyObject_SelfIter, /*tp_iter */
523 (iternextfunc)IO_iternext, /*tp_iternext */
524 O_methods, /*tp_methods */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000525 O_memberlist, /*tp_members */
526 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000527};
528
Guido van Rossum142eeb81997-08-13 03:14:41 +0000529static PyObject *
530newOobject(int size) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000531 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000532
Jim Fultone60de4d2000-10-06 19:24:23 +0000533 self = PyObject_New(Oobject, &Otype);
534 if (self == NULL)
535 return NULL;
536 self->pos=0;
537 self->string_size = 0;
538 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000539
Tim Peterse7c05322004-06-27 17:24:49 +0000540 UNLESS (self->buf = (char *)malloc(size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000541 PyErr_SetString(PyExc_MemoryError,"out of memory");
542 self->buf_size = 0;
543 return NULL;
544 }
545
546 self->buf_size=size;
547 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000548}
549
Skip Montanaroe1388282003-08-11 13:15:11 +0000550/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000551/* -------------------------------------------------------- */
552
553static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000554I_close(Iobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000555 Py_XDECREF(self->pbuf);
556 self->pbuf = NULL;
557 self->buf = NULL;
558
559 self->pos = self->string_size = 0;
560
561 Py_INCREF(Py_None);
562 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000563}
564
565static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000566I_seek(Iobject *self, PyObject *args) {
567 int position, mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000568
Jim Fultone60de4d2000-10-06 19:24:23 +0000569 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
570 UNLESS (PyArg_ParseTuple(args, "i|i:seek", &position, &mode))
571 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000572
Jim Fultone60de4d2000-10-06 19:24:23 +0000573 if (mode == 2) position += self->string_size;
574 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000575
Jim Fultone60de4d2000-10-06 19:24:23 +0000576 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000577
Jim Fultone60de4d2000-10-06 19:24:23 +0000578 self->pos=position;
579
580 Py_INCREF(Py_None);
581 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000582}
583
584static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000585 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000586 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000587 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000588 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000589 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
590 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
591 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000592 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
593 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000594 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
595
596 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000597 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000598 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000599 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000600};
601
Guido van Rossum049cd901996-12-05 23:30:48 +0000602static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000603I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000604 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000605 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000606}
607
Barry Warsaw3e8be722001-09-22 04:36:49 +0000608
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000609PyDoc_STRVAR(Itype__doc__,
610"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000611
612static PyTypeObject Itype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000613 PyObject_HEAD_INIT(NULL)
Barry Warsaw3e8be722001-09-22 04:36:49 +0000614 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000615 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000616 sizeof(Iobject), /*tp_basicsize*/
617 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000618 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000619 (destructor)I_dealloc, /*tp_dealloc*/
620 (printfunc)0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000621 0, /* tp_getattr */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000622 (setattrfunc)0, /*tp_setattr*/
623 (cmpfunc)0, /*tp_compare*/
624 (reprfunc)0, /*tp_repr*/
625 0, /*tp_as_number*/
626 0, /*tp_as_sequence*/
627 0, /*tp_as_mapping*/
628 (hashfunc)0, /*tp_hash*/
629 (ternaryfunc)0, /*tp_call*/
630 (reprfunc)0, /*tp_str*/
631 0, /* tp_getattro */
632 0, /* tp_setattro */
633 0, /* tp_as_buffer */
634 Py_TPFLAGS_DEFAULT, /* tp_flags */
635 Itype__doc__, /* tp_doc */
636 0, /* tp_traverse */
637 0, /* tp_clear */
638 0, /* tp_richcompare */
639 0, /* tp_weaklistoffset */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000640 PyObject_SelfIter, /* tp_iter */
641 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000642 I_methods, /* tp_methods */
643 0, /* tp_members */
644 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000645};
646
Guido van Rossum142eeb81997-08-13 03:14:41 +0000647static PyObject *
648newIobject(PyObject *s) {
649 Iobject *self;
650 char *buf;
651 int size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000652
Marc-André Lemburge47df7a2001-09-24 17:34:52 +0000653 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
654 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000655 s->ob_type->tp_name);
656 return NULL;
657 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000658 UNLESS (self = PyObject_New(Iobject, &Itype)) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000659 Py_INCREF(s);
660 self->buf=buf;
661 self->string_size=size;
662 self->pbuf=s;
663 self->pos=0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000664
665 return (PyObject*)self;
666}
667
Guido van Rossum049cd901996-12-05 23:30:48 +0000668/* End of code for StringI objects */
669/* -------------------------------------------------------- */
670
671
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000672PyDoc_STRVAR(IO_StringIO__doc__,
673"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000674
675static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000676IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000677 PyObject *s=0;
678
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000679 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000680
681 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000682 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000683}
684
685/* List of methods defined in the module */
686
687static struct PyMethodDef IO_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000688 {"StringIO", (PyCFunction)IO_StringIO,
689 METH_VARARGS, IO_StringIO__doc__},
Guido van Rossum55702f81997-01-06 22:57:52 +0000690 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000691};
692
693
694/* Initialization function for the module (*must* be called initcStringIO) */
695
Guido van Rossum154417e1997-04-09 17:35:33 +0000696static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000697 IO_cread,
698 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000699 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000700 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000701 newOobject,
702 newIobject,
703 &Itype,
704 &Otype,
705};
706
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000707#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
708#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000709#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000710PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000711initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000712 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000713
Guido van Rossum154417e1997-04-09 17:35:33 +0000714
Guido van Rossum049cd901996-12-05 23:30:48 +0000715 /* Create the module and add the functions */
716 m = Py_InitModule4("cStringIO", IO_methods,
717 cStringIO_module_documentation,
718 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000719 if (m == NULL) return;
Guido van Rossum049cd901996-12-05 23:30:48 +0000720
721 /* Add some symbolic constants to the module */
722 d = PyModule_GetDict(m);
Guido van Rossum049cd901996-12-05 23:30:48 +0000723
Guido van Rossum55702f81997-01-06 22:57:52 +0000724 /* Export C API */
Guido van Rossum154417e1997-04-09 17:35:33 +0000725 Itype.ob_type=&PyType_Type;
726 Otype.ob_type=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000727 if (PyType_Ready(&Otype) < 0) return;
728 if (PyType_Ready(&Itype) < 0) return;
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000729 PyDict_SetItemString(d,"cStringIO_CAPI",
730 v = PyCObject_FromVoidPtr(&CAPI,NULL));
731 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000732
733 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000734 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
735 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000736
737 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000738 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000739}