blob: fd28aa9324dee17cce77eb5612b653f9a7fc401d [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;
Jim Fultone60de4d2000-10-06 19:24:23 +0000122 return PyString_FromStringAndSize(((IOobject*)self)->buf,
123 ((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;
140 return PyString_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) {
Guido van Rossum674deb22002-09-01 15:06:28 +0000147 Py_INCREF(Py_False);
148 return Py_False;
Guido van Rossum049cd901996-12-05 23:30:48 +0000149}
150
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000151PyDoc_STRVAR(IO_read__doc__,
152"read([s]) -- Read s characters, or the rest of the string");
Guido van Rossum049cd901996-12-05 23:30:48 +0000153
154static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000155IO_cread(PyObject *self, char **output, Py_ssize_t n) {
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000156 Py_ssize_t l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000157
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000158 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000159 l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos;
160 if (n < 0 || n > l) {
161 n = l;
162 if (n < 0) n=0;
163 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000164
Jim Fultone60de4d2000-10-06 19:24:23 +0000165 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
166 ((IOobject*)self)->pos += n;
167 return n;
Guido van Rossum049cd901996-12-05 23:30:48 +0000168}
169
170static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000171IO_read(IOobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000172 Py_ssize_t n = -1;
Thomas Woutersf86d1e82006-03-01 22:15:15 +0000173 char *output = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000174
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000175 if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000176
Jim Fultone60de4d2000-10-06 19:24:23 +0000177 if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000178
Jim Fultone60de4d2000-10-06 19:24:23 +0000179 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000180}
181
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000182PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");
Guido van Rossum049cd901996-12-05 23:30:48 +0000183
184static int
Jim Fultone60de4d2000-10-06 19:24:23 +0000185IO_creadline(PyObject *self, char **output) {
186 char *n, *s;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000187 Py_ssize_t l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000188
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000189 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000190
191 for (n = ((IOobject*)self)->buf + ((IOobject*)self)->pos,
192 s = ((IOobject*)self)->buf + ((IOobject*)self)->string_size;
193 n < s && *n != '\n'; n++);
194 if (n < s) n++;
195
196 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
197 l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000198 assert(((IOobject*)self)->pos + l < INT_MAX);
199 ((IOobject*)self)->pos += (int)l;
200 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000201}
202
203static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000204IO_readline(IOobject *self, PyObject *args) {
205 int n, m=-1;
206 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000207
Raymond Hettinger352f9472003-04-24 15:50:11 +0000208 if (args)
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000209 if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000210
211 if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL;
212 if (m >= 0 && m < n) {
213 m = n - m;
214 n -= m;
215 self->pos -= m;
216 }
217 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000218}
219
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000220PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000221
222static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000223IO_readlines(IOobject *self, PyObject *args) {
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000224 int n;
225 char *output;
226 PyObject *result, *line;
227 int hint = 0, length = 0;
228
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000229 if (!PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000230
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000231 result = PyList_New(0);
232 if (!result)
233 return NULL;
234
Jim Fultone60de4d2000-10-06 19:24:23 +0000235 while (1){
236 if ( (n = IO_creadline((PyObject*)self,&output)) < 0)
237 goto err;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000238 if (n == 0)
239 break;
240 line = PyString_FromStringAndSize (output, n);
Jim Fultone60de4d2000-10-06 19:24:23 +0000241 if (!line)
242 goto err;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000243 if (PyList_Append (result, line) == -1) {
244 Py_DECREF (line);
245 goto err;
246 }
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000247 Py_DECREF (line);
248 length += n;
249 if (hint > 0 && length >= hint)
250 break;
251 }
252 return result;
Jim Fultone60de4d2000-10-06 19:24:23 +0000253 err:
254 Py_DECREF(result);
255 return NULL;
256}
257
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000258PyDoc_STRVAR(IO_reset__doc__,
259"reset() -- Reset the file position to the beginning");
Jim Fultone60de4d2000-10-06 19:24:23 +0000260
261static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000262IO_reset(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000263
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000264 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000265
266 self->pos = 0;
267
268 Py_INCREF(Py_None);
269 return Py_None;
270}
271
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000272PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000273
274static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000275IO_tell(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000276
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000277 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000278
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000279 return PyInt_FromSsize_t(self->pos);
Jim Fultone60de4d2000-10-06 19:24:23 +0000280}
281
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000282PyDoc_STRVAR(IO_truncate__doc__,
283"truncate(): truncate the file at the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000284
285static PyObject *
286IO_truncate(IOobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000287 Py_ssize_t pos = -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000288
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000289 if (!IO__opencheck(self)) return NULL;
290 if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000291 if (pos < 0) pos = self->pos;
292
293 if (self->string_size > pos) self->string_size = pos;
Tim Peters037b3ee2004-08-21 06:55:43 +0000294 self->pos = self->string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +0000295
296 Py_INCREF(Py_None);
297 return Py_None;
298}
299
Raymond Hettinger352f9472003-04-24 15:50:11 +0000300static PyObject *
301IO_iternext(Iobject *self)
302{
303 PyObject *next;
304 next = IO_readline((IOobject *)self, NULL);
305 if (!next)
306 return NULL;
307 if (!PyString_GET_SIZE(next)) {
308 Py_DECREF(next);
309 PyErr_SetNone(PyExc_StopIteration);
310 return NULL;
311 }
312 return next;
313}
314
Jim Fultone60de4d2000-10-06 19:24:23 +0000315
316
317
318/* Read-write object methods */
319
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000320PyDoc_STRVAR(O_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000321"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000322"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000323
324static PyObject *
325O_seek(Oobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000326 Py_ssize_t position;
327 int mode = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000328
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000329 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
330 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000331 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;
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000343 self->buf = (char*) realloc(self->buf,self->buf_size);
344 if (!self->buf) {
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
Martin v. Löwis18e16552006-02-15 17:27:45 +0000365O_cwrite(PyObject *self, const char *c, Py_ssize_t l) {
366 Py_ssize_t newl;
Guido van Rossum2f098122001-12-07 20:20:28 +0000367 Oobject *oself;
Guido van Rossum55702f81997-01-06 22:57:52 +0000368
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000369 if (!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;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000375 if (oself->buf_size <= newl) {
376 assert(newl + 1 < INT_MAX);
377 oself->buf_size = (int)(newl+1);
378 }
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000379 oself->buf = (char*)realloc(oself->buf, oself->buf_size);
380 if (!oself->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000381 PyErr_SetString(PyExc_MemoryError,"out of memory");
Guido van Rossum2f098122001-12-07 20:20:28 +0000382 oself->buf_size = oself->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000383 return -1;
384 }
385 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000386
Guido van Rossum2f098122001-12-07 20:20:28 +0000387 memcpy(oself->buf+oself->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000388
Martin v. Löwis18e16552006-02-15 17:27:45 +0000389 assert(oself->pos + l < INT_MAX);
390 oself->pos += (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000391
Guido van Rossum2f098122001-12-07 20:20:28 +0000392 if (oself->string_size < oself->pos) {
393 oself->string_size = oself->pos;
394 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000395
Martin v. Löwis18e16552006-02-15 17:27:45 +0000396 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000397}
398
399static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000400O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000401 char *c;
402 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000403
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000404 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000405
Jim Fultone60de4d2000-10-06 19:24:23 +0000406 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000407
Jim Fultone60de4d2000-10-06 19:24:23 +0000408 Py_INCREF(Py_None);
409 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000410}
411
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000412PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000413
414static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000415O_close(Oobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000416 if (self->buf != NULL) free(self->buf);
417 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000418
Jim Fultone60de4d2000-10-06 19:24:23 +0000419 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000420
Jim Fultone60de4d2000-10-06 19:24:23 +0000421 Py_INCREF(Py_None);
422 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000423}
424
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000425PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000426"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
427"\n"
428"Note that newlines are not added. The sequence can be any iterable object\n"
429"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000430static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000431O_writelines(Oobject *self, PyObject *args) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000432 PyObject *it, *s;
433
434 it = PyObject_GetIter(args);
435 if (it == NULL)
Raymond Hettingerbc72c5a2004-02-27 10:30:49 +0000436 return NULL;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000437 while ((s = PyIter_Next(it)) != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000438 Py_ssize_t n;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000439 char *c;
440 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
441 Py_DECREF(it);
442 Py_DECREF(s);
443 return NULL;
444 }
445 if (O_cwrite((PyObject *)self, c, n) == -1) {
446 Py_DECREF(it);
447 Py_DECREF(s);
448 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000449 }
450 Py_DECREF(s);
451 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000452
Michael W. Hudson10402a32005-09-22 09:19:01 +0000453 Py_DECREF(it);
454
455 /* See if PyIter_Next failed */
456 if (PyErr_Occurred())
457 return NULL;
458
459 Py_RETURN_NONE;
460}
Guido van Rossum049cd901996-12-05 23:30:48 +0000461static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000462 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000463 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000464 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000465 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000466 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
467 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
468 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000469 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
470 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000471 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
472
473 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000474 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000475 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
476 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000477 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000478 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000479};
480
Raymond Hettinger352f9472003-04-24 15:50:11 +0000481static PyMemberDef O_memberlist[] = {
482 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
483 "flag indicating that a space needs to be printed; used by print"},
Raymond Hettinger5475f232003-08-08 12:20:03 +0000484 /* getattr(f, "closed") is implemented without this table */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000485 {NULL} /* Sentinel */
486};
487
Guido van Rossum049cd901996-12-05 23:30:48 +0000488static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000489O_dealloc(Oobject *self) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000490 if (self->buf != NULL)
491 free(self->buf);
492 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000493}
494
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000495PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000496
497static PyTypeObject Otype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000498 PyObject_HEAD_INIT(NULL)
Raymond Hettinger352f9472003-04-24 15:50:11 +0000499 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000500 "cStringIO.StringO", /*tp_name*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000501 sizeof(Oobject), /*tp_basicsize*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000502 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000503 /* methods */
504 (destructor)O_dealloc, /*tp_dealloc*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000505 (printfunc)0, /*tp_print*/
506 0, /*tp_getattr */
507 0, /*tp_setattr */
508 (cmpfunc)0, /*tp_compare*/
509 (reprfunc)0, /*tp_repr*/
510 0, /*tp_as_number*/
511 0, /*tp_as_sequence*/
512 0, /*tp_as_mapping*/
513 (hashfunc)0, /*tp_hash*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000514 (ternaryfunc)0, /*tp_call*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000515 (reprfunc)0, /*tp_str*/
516 0, /*tp_getattro */
517 0, /*tp_setattro */
518 0, /*tp_as_buffer */
519 Py_TPFLAGS_DEFAULT, /*tp_flags*/
520 Otype__doc__, /*tp_doc */
521 0, /*tp_traverse */
522 0, /*tp_clear */
523 0, /*tp_richcompare */
524 0, /*tp_weaklistoffset */
525 PyObject_SelfIter, /*tp_iter */
526 (iternextfunc)IO_iternext, /*tp_iternext */
527 O_methods, /*tp_methods */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000528 O_memberlist, /*tp_members */
529 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000530};
531
Guido van Rossum142eeb81997-08-13 03:14:41 +0000532static PyObject *
533newOobject(int size) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000534 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000535
Jim Fultone60de4d2000-10-06 19:24:23 +0000536 self = PyObject_New(Oobject, &Otype);
537 if (self == NULL)
538 return NULL;
539 self->pos=0;
540 self->string_size = 0;
541 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000542
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000543 self->buf = (char *)malloc(size);
544 if (!self->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000545 PyErr_SetString(PyExc_MemoryError,"out of memory");
546 self->buf_size = 0;
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +0000547 Py_DECREF(self);
Jim Fultone60de4d2000-10-06 19:24:23 +0000548 return NULL;
549 }
550
551 self->buf_size=size;
552 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000553}
554
Skip Montanaroe1388282003-08-11 13:15:11 +0000555/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000556/* -------------------------------------------------------- */
557
558static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000559I_close(Iobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000560 Py_XDECREF(self->pbuf);
561 self->pbuf = NULL;
562 self->buf = NULL;
563
564 self->pos = self->string_size = 0;
565
566 Py_INCREF(Py_None);
567 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000568}
569
570static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000571I_seek(Iobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000572 Py_ssize_t position;
573 int mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000574
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000575 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
576 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000577 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000578
Jim Fultone60de4d2000-10-06 19:24:23 +0000579 if (mode == 2) position += self->string_size;
580 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000581
Jim Fultone60de4d2000-10-06 19:24:23 +0000582 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000583
Jim Fultone60de4d2000-10-06 19:24:23 +0000584 self->pos=position;
585
586 Py_INCREF(Py_None);
587 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000588}
589
590static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000591 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000592 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000593 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000594 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000595 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
596 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
597 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000598 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
599 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000600 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
601
602 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000603 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000604 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000605 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000606};
607
Guido van Rossum049cd901996-12-05 23:30:48 +0000608static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000609I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000610 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000611 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000612}
613
Barry Warsaw3e8be722001-09-22 04:36:49 +0000614
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000615PyDoc_STRVAR(Itype__doc__,
616"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000617
618static PyTypeObject Itype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000619 PyObject_HEAD_INIT(NULL)
Barry Warsaw3e8be722001-09-22 04:36:49 +0000620 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000621 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000622 sizeof(Iobject), /*tp_basicsize*/
623 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000624 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000625 (destructor)I_dealloc, /*tp_dealloc*/
626 (printfunc)0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000627 0, /* tp_getattr */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000628 (setattrfunc)0, /*tp_setattr*/
629 (cmpfunc)0, /*tp_compare*/
630 (reprfunc)0, /*tp_repr*/
631 0, /*tp_as_number*/
632 0, /*tp_as_sequence*/
633 0, /*tp_as_mapping*/
634 (hashfunc)0, /*tp_hash*/
635 (ternaryfunc)0, /*tp_call*/
636 (reprfunc)0, /*tp_str*/
637 0, /* tp_getattro */
638 0, /* tp_setattro */
639 0, /* tp_as_buffer */
640 Py_TPFLAGS_DEFAULT, /* tp_flags */
641 Itype__doc__, /* tp_doc */
642 0, /* tp_traverse */
643 0, /* tp_clear */
644 0, /* tp_richcompare */
645 0, /* tp_weaklistoffset */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000646 PyObject_SelfIter, /* tp_iter */
647 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000648 I_methods, /* tp_methods */
649 0, /* tp_members */
650 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000651};
652
Guido van Rossum142eeb81997-08-13 03:14:41 +0000653static PyObject *
654newIobject(PyObject *s) {
655 Iobject *self;
656 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000657 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000658
Marc-André Lemburge47df7a2001-09-24 17:34:52 +0000659 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
660 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000661 s->ob_type->tp_name);
662 return NULL;
663 }
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000664 self = PyObject_New(Iobject, &Itype);
665 if (!self) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000666 Py_INCREF(s);
667 self->buf=buf;
668 self->string_size=size;
669 self->pbuf=s;
670 self->pos=0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000671
672 return (PyObject*)self;
673}
674
Guido van Rossum049cd901996-12-05 23:30:48 +0000675/* End of code for StringI objects */
676/* -------------------------------------------------------- */
677
678
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000679PyDoc_STRVAR(IO_StringIO__doc__,
680"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000681
682static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000683IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000684 PyObject *s=0;
685
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000686 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000687
688 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000689 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000690}
691
692/* List of methods defined in the module */
693
694static struct PyMethodDef IO_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000695 {"StringIO", (PyCFunction)IO_StringIO,
696 METH_VARARGS, IO_StringIO__doc__},
Guido van Rossum55702f81997-01-06 22:57:52 +0000697 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000698};
699
700
701/* Initialization function for the module (*must* be called initcStringIO) */
702
Guido van Rossum154417e1997-04-09 17:35:33 +0000703static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000704 IO_cread,
705 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000706 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000707 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000708 newOobject,
709 newIobject,
710 &Itype,
711 &Otype,
712};
713
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000714#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
715#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000716#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000717PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000718initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000719 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000720
Guido van Rossum154417e1997-04-09 17:35:33 +0000721
Guido van Rossum049cd901996-12-05 23:30:48 +0000722 /* Create the module and add the functions */
723 m = Py_InitModule4("cStringIO", IO_methods,
724 cStringIO_module_documentation,
725 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000726 if (m == NULL) return;
Guido van Rossum049cd901996-12-05 23:30:48 +0000727
728 /* Add some symbolic constants to the module */
729 d = PyModule_GetDict(m);
Guido van Rossum049cd901996-12-05 23:30:48 +0000730
Guido van Rossum55702f81997-01-06 22:57:52 +0000731 /* Export C API */
Guido van Rossum154417e1997-04-09 17:35:33 +0000732 Itype.ob_type=&PyType_Type;
733 Otype.ob_type=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000734 if (PyType_Ready(&Otype) < 0) return;
735 if (PyType_Ready(&Itype) < 0) return;
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000736 PyDict_SetItemString(d,"cStringIO_CAPI",
737 v = PyCObject_FromVoidPtr(&CAPI,NULL));
738 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000739
740 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000741 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
742 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000743
744 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000745 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000746}