blob: 576a17622d4a886f09682ab094d16ce4448cb14f [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/* Declaration for file-like objects that manage data as strings
Guido van Rossum049cd901996-12-05 23:30:48 +000037
Jim Fultone60de4d2000-10-06 19:24:23 +000038 The IOobject type should be though of as a common base type for
39 Iobjects, which provide input (read-only) StringIO objects and
40 Oobjects, which provide read-write objects. Most of the methods
41 depend only on common data.
42*/
Guido van Rossum049cd901996-12-05 23:30:48 +000043
44typedef struct {
45 PyObject_HEAD
46 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000047 Py_ssize_t pos, string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +000048} IOobject;
49
50#define IOOOBJECT(O) ((IOobject*)(O))
51
Skip Montanaroe1388282003-08-11 13:15:11 +000052/* Declarations for objects of type StringO */
Jim Fultone60de4d2000-10-06 19:24:23 +000053
54typedef struct { /* Subtype of IOobject */
55 PyObject_HEAD
56 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000057 Py_ssize_t pos, string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +000058
Martin v. Löwis18e16552006-02-15 17:27:45 +000059 Py_ssize_t buf_size;
60 int softspace;
Jim Fultone60de4d2000-10-06 19:24:23 +000061} Oobject;
62
63/* Declarations for objects of type StringI */
64
65typedef struct { /* Subtype of IOobject */
66 PyObject_HEAD
67 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000068 Py_ssize_t pos, string_size;
Marc-André Lemburge47df7a2001-09-24 17:34:52 +000069 /* We store a reference to the object here in order to keep
70 the buffer alive during the lifetime of the Iobject. */
Guido van Rossum049cd901996-12-05 23:30:48 +000071 PyObject *pbuf;
72} Iobject;
73
Jim Fultone60de4d2000-10-06 19:24:23 +000074/* IOobject (common) methods */
75
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000076PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing.");
Jim Fultone60de4d2000-10-06 19:24:23 +000077
78static int
79IO__opencheck(IOobject *self) {
Martin v. Löwis5df2e612006-03-01 23:10:49 +000080 if (!self->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +000081 PyErr_SetString(PyExc_ValueError,
82 "I/O operation on closed file");
83 return 0;
84 }
85 return 1;
86}
87
88static PyObject *
Raymond Hettinger5475f232003-08-08 12:20:03 +000089IO_get_closed(IOobject *self, void *closure)
90{
91 PyObject *result = Py_False;
92
93 if (self->buf == NULL)
94 result = Py_True;
95 Py_INCREF(result);
96 return result;
97}
98
99static PyGetSetDef file_getsetlist[] = {
100 {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"},
101 {0},
102};
103
104static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000105IO_flush(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000106
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000107 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000108
109 Py_INCREF(Py_None);
110 return Py_None;
111}
112
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000113PyDoc_STRVAR(IO_getval__doc__,
114"getvalue([use_pos]) -- Get the string value."
115"\n"
116"If use_pos is specified and is a true value, then the string returned\n"
117"will include only the text up to the current file position.\n");
Guido van Rossum049cd901996-12-05 23:30:48 +0000118
119static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000120IO_cgetval(PyObject *self) {
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000121 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
Christian Heimes593daf52008-05-26 12:51:38 +0000122 return PyBytes_FromStringAndSize(((IOobject*)self)->buf,
Jim Fultone60de4d2000-10-06 19:24:23 +0000123 ((IOobject*)self)->pos);
Guido van Rossum049cd901996-12-05 23:30:48 +0000124}
125
Guido van Rossum049cd901996-12-05 23:30:48 +0000126static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000127IO_getval(IOobject *self, PyObject *args) {
128 PyObject *use_pos=Py_None;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000129 Py_ssize_t s;
Jim Fultone60de4d2000-10-06 19:24:23 +0000130
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000131 if (!IO__opencheck(self)) return NULL;
132 if (!PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000133
134 if (PyObject_IsTrue(use_pos)) {
135 s=self->pos;
136 if (s > self->string_size) s=self->string_size;
137 }
138 else
139 s=self->string_size;
Christian Heimes593daf52008-05-26 12:51:38 +0000140 return PyBytes_FromStringAndSize(self->buf, s);
Guido van Rossum049cd901996-12-05 23:30:48 +0000141}
142
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000143PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0");
Guido van Rossum049cd901996-12-05 23:30:48 +0000144
145static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000146IO_isatty(IOobject *self, PyObject *unused) {
Walter Dörwald197e8322006-03-15 22:13:13 +0000147 if (!IO__opencheck(self)) return NULL;
148 Py_INCREF(Py_False);
Guido van Rossum674deb22002-09-01 15:06:28 +0000149 return Py_False;
Guido van Rossum049cd901996-12-05 23:30:48 +0000150}
151
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000152PyDoc_STRVAR(IO_read__doc__,
153"read([s]) -- Read s characters, or the rest of the string");
Guido van Rossum049cd901996-12-05 23:30:48 +0000154
155static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000156IO_cread(PyObject *self, char **output, Py_ssize_t n) {
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000157 Py_ssize_t l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000158
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000159 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000160 l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos;
161 if (n < 0 || n > l) {
162 n = l;
163 if (n < 0) n=0;
164 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000165
Jim Fultone60de4d2000-10-06 19:24:23 +0000166 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
167 ((IOobject*)self)->pos += n;
168 return n;
Guido van Rossum049cd901996-12-05 23:30:48 +0000169}
170
171static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000172IO_read(IOobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000173 Py_ssize_t n = -1;
Thomas Woutersf86d1e82006-03-01 22:15:15 +0000174 char *output = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000175
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000176 if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000177
Jim Fultone60de4d2000-10-06 19:24:23 +0000178 if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000179
Christian Heimes593daf52008-05-26 12:51:38 +0000180 return PyBytes_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000181}
182
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000183PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");
Guido van Rossum049cd901996-12-05 23:30:48 +0000184
185static int
Jim Fultone60de4d2000-10-06 19:24:23 +0000186IO_creadline(PyObject *self, char **output) {
187 char *n, *s;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000188 Py_ssize_t l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000189
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000190 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000191
192 for (n = ((IOobject*)self)->buf + ((IOobject*)self)->pos,
193 s = ((IOobject*)self)->buf + ((IOobject*)self)->string_size;
194 n < s && *n != '\n'; n++);
195 if (n < s) n++;
196
197 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
198 l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000199 assert(((IOobject*)self)->pos + l < INT_MAX);
200 ((IOobject*)self)->pos += (int)l;
201 return (int)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)
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000210 if (!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 }
Christian Heimes593daf52008-05-26 12:51:38 +0000218 return PyBytes_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
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000230 if (!PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000231
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;
Christian Heimes593daf52008-05-26 12:51:38 +0000241 line = PyBytes_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
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000265 if (!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
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000278 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000279
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000280 return PyInt_FromSsize_t(self->pos);
Jim Fultone60de4d2000-10-06 19:24:23 +0000281}
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) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000288 Py_ssize_t pos = -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000289
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000290 if (!IO__opencheck(self)) return NULL;
291 if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;
Martin v. Löwiscffcc8b2006-11-19 10:41:41 +0000292
293 if (PyTuple_Size(args) == 0) {
294 /* No argument passed, truncate to current position */
295 pos = self->pos;
296 }
297
298 if (pos < 0) {
299 errno = EINVAL;
300 PyErr_SetFromErrno(PyExc_IOError);
301 return NULL;
302 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000303
304 if (self->string_size > pos) self->string_size = pos;
Tim Peters037b3ee2004-08-21 06:55:43 +0000305 self->pos = self->string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +0000306
307 Py_INCREF(Py_None);
308 return Py_None;
309}
310
Raymond Hettinger352f9472003-04-24 15:50:11 +0000311static PyObject *
312IO_iternext(Iobject *self)
313{
314 PyObject *next;
315 next = IO_readline((IOobject *)self, NULL);
316 if (!next)
317 return NULL;
Christian Heimes593daf52008-05-26 12:51:38 +0000318 if (!PyBytes_GET_SIZE(next)) {
Raymond Hettinger352f9472003-04-24 15:50:11 +0000319 Py_DECREF(next);
320 PyErr_SetNone(PyExc_StopIteration);
321 return NULL;
322 }
323 return next;
324}
325
Jim Fultone60de4d2000-10-06 19:24:23 +0000326
327
328
329/* Read-write object methods */
330
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000331PyDoc_STRVAR(O_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000332"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000333"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000334
335static PyObject *
336O_seek(Oobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000337 Py_ssize_t position;
338 int mode = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000339
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000340 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
341 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000342 return NULL;
343
344 if (mode == 2) {
345 position += self->string_size;
346 }
347 else if (mode == 1) {
348 position += self->pos;
349 }
350
351 if (position > self->buf_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000352 char *newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000353 self->buf_size*=2;
354 if (self->buf_size <= position) self->buf_size=position+1;
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000355 newbuf = (char*) realloc(self->buf,self->buf_size);
356 if (!newbuf) {
357 free(self->buf);
358 self->buf = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000359 self->buf_size=self->pos=0;
360 return PyErr_NoMemory();
361 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000362 self->buf = newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000363 }
364 else if (position < 0) position=0;
365
366 self->pos=position;
367
368 while (--position >= self->string_size) self->buf[position]=0;
369
370 Py_INCREF(Py_None);
371 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000372}
373
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000374PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000375"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000376"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000377
378
379static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000380O_cwrite(PyObject *self, const char *c, Py_ssize_t l) {
381 Py_ssize_t newl;
Guido van Rossum2f098122001-12-07 20:20:28 +0000382 Oobject *oself;
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000383 char *newbuf;
Guido van Rossum55702f81997-01-06 22:57:52 +0000384
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000385 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000386 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000387
Guido van Rossum2f098122001-12-07 20:20:28 +0000388 newl = oself->pos+l;
389 if (newl >= oself->buf_size) {
390 oself->buf_size *= 2;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000391 if (oself->buf_size <= newl) {
392 assert(newl + 1 < INT_MAX);
393 oself->buf_size = (int)(newl+1);
394 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000395 newbuf = (char*)realloc(oself->buf, oself->buf_size);
396 if (!newbuf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000397 PyErr_SetString(PyExc_MemoryError,"out of memory");
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000398 free(oself->buf);
399 oself->buf = 0;
Guido van Rossum2f098122001-12-07 20:20:28 +0000400 oself->buf_size = oself->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000401 return -1;
402 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000403 oself->buf = newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000404 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000405
Guido van Rossum2f098122001-12-07 20:20:28 +0000406 memcpy(oself->buf+oself->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000407
Martin v. Löwis18e16552006-02-15 17:27:45 +0000408 assert(oself->pos + l < INT_MAX);
409 oself->pos += (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000410
Guido van Rossum2f098122001-12-07 20:20:28 +0000411 if (oself->string_size < oself->pos) {
412 oself->string_size = oself->pos;
413 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000414
Martin v. Löwis18e16552006-02-15 17:27:45 +0000415 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000416}
417
418static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000419O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000420 char *c;
421 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000422
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000423 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000424
Jim Fultone60de4d2000-10-06 19:24:23 +0000425 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000426
Jim Fultone60de4d2000-10-06 19:24:23 +0000427 Py_INCREF(Py_None);
428 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000429}
430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000431PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000432
433static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000434O_close(Oobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000435 if (self->buf != NULL) free(self->buf);
436 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000437
Jim Fultone60de4d2000-10-06 19:24:23 +0000438 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000439
Jim Fultone60de4d2000-10-06 19:24:23 +0000440 Py_INCREF(Py_None);
441 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000442}
443
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000444PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000445"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
446"\n"
447"Note that newlines are not added. The sequence can be any iterable object\n"
448"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000449static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000450O_writelines(Oobject *self, PyObject *args) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000451 PyObject *it, *s;
452
453 it = PyObject_GetIter(args);
454 if (it == NULL)
Raymond Hettingerbc72c5a2004-02-27 10:30:49 +0000455 return NULL;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000456 while ((s = PyIter_Next(it)) != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000457 Py_ssize_t n;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000458 char *c;
Christian Heimes593daf52008-05-26 12:51:38 +0000459 if (PyBytes_AsStringAndSize(s, &c, &n) == -1) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000460 Py_DECREF(it);
461 Py_DECREF(s);
462 return NULL;
463 }
464 if (O_cwrite((PyObject *)self, c, n) == -1) {
465 Py_DECREF(it);
466 Py_DECREF(s);
467 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000468 }
469 Py_DECREF(s);
470 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000471
Michael W. Hudson10402a32005-09-22 09:19:01 +0000472 Py_DECREF(it);
473
474 /* See if PyIter_Next failed */
475 if (PyErr_Occurred())
476 return NULL;
477
478 Py_RETURN_NONE;
479}
Guido van Rossum049cd901996-12-05 23:30:48 +0000480static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000481 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000482 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000483 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000484 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000485 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
486 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
487 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000488 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
489 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000490 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
491
492 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000493 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000494 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
495 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000496 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000497 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000498};
499
Raymond Hettinger352f9472003-04-24 15:50:11 +0000500static PyMemberDef O_memberlist[] = {
501 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
502 "flag indicating that a space needs to be printed; used by print"},
Raymond Hettinger5475f232003-08-08 12:20:03 +0000503 /* getattr(f, "closed") is implemented without this table */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000504 {NULL} /* Sentinel */
505};
506
Guido van Rossum049cd901996-12-05 23:30:48 +0000507static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000508O_dealloc(Oobject *self) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000509 if (self->buf != NULL)
510 free(self->buf);
511 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000512}
513
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000514PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000515
516static PyTypeObject Otype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000517 PyVarObject_HEAD_INIT(NULL, 0)
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000518 "cStringIO.StringO", /*tp_name*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000519 sizeof(Oobject), /*tp_basicsize*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000520 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000521 /* methods */
522 (destructor)O_dealloc, /*tp_dealloc*/
Georg Brandld37ac692006-03-30 11:58:57 +0000523 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000524 0, /*tp_getattr */
525 0, /*tp_setattr */
Georg Brandld37ac692006-03-30 11:58:57 +0000526 0, /*tp_compare*/
527 0, /*tp_repr*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000528 0, /*tp_as_number*/
529 0, /*tp_as_sequence*/
530 0, /*tp_as_mapping*/
Georg Brandld37ac692006-03-30 11:58:57 +0000531 0, /*tp_hash*/
532 0 , /*tp_call*/
533 0, /*tp_str*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000534 0, /*tp_getattro */
535 0, /*tp_setattro */
536 0, /*tp_as_buffer */
537 Py_TPFLAGS_DEFAULT, /*tp_flags*/
538 Otype__doc__, /*tp_doc */
539 0, /*tp_traverse */
540 0, /*tp_clear */
541 0, /*tp_richcompare */
542 0, /*tp_weaklistoffset */
543 PyObject_SelfIter, /*tp_iter */
544 (iternextfunc)IO_iternext, /*tp_iternext */
545 O_methods, /*tp_methods */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000546 O_memberlist, /*tp_members */
547 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000548};
549
Guido van Rossum142eeb81997-08-13 03:14:41 +0000550static PyObject *
551newOobject(int size) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000552 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000553
Jim Fultone60de4d2000-10-06 19:24:23 +0000554 self = PyObject_New(Oobject, &Otype);
555 if (self == NULL)
556 return NULL;
557 self->pos=0;
558 self->string_size = 0;
559 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000560
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000561 self->buf = (char *)malloc(size);
562 if (!self->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000563 PyErr_SetString(PyExc_MemoryError,"out of memory");
564 self->buf_size = 0;
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +0000565 Py_DECREF(self);
Jim Fultone60de4d2000-10-06 19:24:23 +0000566 return NULL;
567 }
568
569 self->buf_size=size;
570 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000571}
572
Skip Montanaroe1388282003-08-11 13:15:11 +0000573/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000574/* -------------------------------------------------------- */
575
576static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000577I_close(Iobject *self, PyObject *unused) {
Amaury Forgeot d'Arc588ff932008-02-16 14:34:57 +0000578 Py_CLEAR(self->pbuf);
Jim Fultone60de4d2000-10-06 19:24:23 +0000579 self->buf = NULL;
580
581 self->pos = self->string_size = 0;
582
583 Py_INCREF(Py_None);
584 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000585}
586
587static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000588I_seek(Iobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000589 Py_ssize_t position;
590 int mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000591
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000592 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
593 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000594 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000595
Jim Fultone60de4d2000-10-06 19:24:23 +0000596 if (mode == 2) position += self->string_size;
597 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000598
Jim Fultone60de4d2000-10-06 19:24:23 +0000599 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000600
Jim Fultone60de4d2000-10-06 19:24:23 +0000601 self->pos=position;
602
603 Py_INCREF(Py_None);
604 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000605}
606
607static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000608 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000609 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000610 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000611 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000612 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
613 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
614 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000615 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
616 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000617 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
618
619 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000620 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000621 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000622 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000623};
624
Guido van Rossum049cd901996-12-05 23:30:48 +0000625static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000626I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000627 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000628 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000629}
630
Barry Warsaw3e8be722001-09-22 04:36:49 +0000631
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000632PyDoc_STRVAR(Itype__doc__,
633"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000634
635static PyTypeObject Itype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000636 PyVarObject_HEAD_INIT(NULL, 0)
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000637 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000638 sizeof(Iobject), /*tp_basicsize*/
639 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000640 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000641 (destructor)I_dealloc, /*tp_dealloc*/
Georg Brandld37ac692006-03-30 11:58:57 +0000642 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000643 0, /* tp_getattr */
Georg Brandld37ac692006-03-30 11:58:57 +0000644 0, /*tp_setattr*/
645 0, /*tp_compare*/
646 0, /*tp_repr*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000647 0, /*tp_as_number*/
648 0, /*tp_as_sequence*/
649 0, /*tp_as_mapping*/
Georg Brandld37ac692006-03-30 11:58:57 +0000650 0, /*tp_hash*/
651 0, /*tp_call*/
652 0, /*tp_str*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000653 0, /* tp_getattro */
654 0, /* tp_setattro */
655 0, /* tp_as_buffer */
656 Py_TPFLAGS_DEFAULT, /* tp_flags */
657 Itype__doc__, /* tp_doc */
658 0, /* tp_traverse */
659 0, /* tp_clear */
660 0, /* tp_richcompare */
661 0, /* tp_weaklistoffset */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000662 PyObject_SelfIter, /* tp_iter */
663 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000664 I_methods, /* tp_methods */
665 0, /* tp_members */
666 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000667};
668
Guido van Rossum142eeb81997-08-13 03:14:41 +0000669static PyObject *
670newIobject(PyObject *s) {
671 Iobject *self;
672 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000673 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000674
Georg Brandl95d94942007-08-08 13:50:02 +0000675 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
Georg Brandl96164442007-08-08 13:03:41 +0000676 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
677 s->ob_type->tp_name);
678 return NULL;
679 }
Georg Brandl5597e262006-10-12 09:47:12 +0000680
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000681 self = PyObject_New(Iobject, &Itype);
682 if (!self) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000683 Py_INCREF(s);
684 self->buf=buf;
685 self->string_size=size;
686 self->pbuf=s;
687 self->pos=0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000688
689 return (PyObject*)self;
690}
691
Guido van Rossum049cd901996-12-05 23:30:48 +0000692/* End of code for StringI objects */
693/* -------------------------------------------------------- */
694
695
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000696PyDoc_STRVAR(IO_StringIO__doc__,
697"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000698
699static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000700IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000701 PyObject *s=0;
702
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000703 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000704
705 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000706 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000707}
708
709/* List of methods defined in the module */
710
711static struct PyMethodDef IO_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000712 {"StringIO", (PyCFunction)IO_StringIO,
713 METH_VARARGS, IO_StringIO__doc__},
Guido van Rossum55702f81997-01-06 22:57:52 +0000714 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000715};
716
717
718/* Initialization function for the module (*must* be called initcStringIO) */
719
Guido van Rossum154417e1997-04-09 17:35:33 +0000720static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000721 IO_cread,
722 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000723 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000724 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000725 newOobject,
726 newIobject,
727 &Itype,
728 &Otype,
729};
730
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000731#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
732#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000733#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000734PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000735initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000736 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000737
Guido van Rossum154417e1997-04-09 17:35:33 +0000738
Guido van Rossum049cd901996-12-05 23:30:48 +0000739 /* Create the module and add the functions */
740 m = Py_InitModule4("cStringIO", IO_methods,
741 cStringIO_module_documentation,
742 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000743 if (m == NULL) return;
Guido van Rossum049cd901996-12-05 23:30:48 +0000744
745 /* Add some symbolic constants to the module */
746 d = PyModule_GetDict(m);
Guido van Rossum049cd901996-12-05 23:30:48 +0000747
Guido van Rossum55702f81997-01-06 22:57:52 +0000748 /* Export C API */
Christian Heimese93237d2007-12-19 02:37:44 +0000749 Py_TYPE(&Itype)=&PyType_Type;
750 Py_TYPE(&Otype)=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000751 if (PyType_Ready(&Otype) < 0) return;
752 if (PyType_Ready(&Itype) < 0) return;
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000753 PyDict_SetItemString(d,"cStringIO_CAPI",
754 v = PyCObject_FromVoidPtr(&CAPI,NULL));
755 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000756
757 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000758 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
759 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000760
761 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000762 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000763}