blob: 14e35f366e0c30da90028e623b327b38d54a72f8 [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;
547 return NULL;
548 }
549
550 self->buf_size=size;
551 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000552}
553
Skip Montanaroe1388282003-08-11 13:15:11 +0000554/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000555/* -------------------------------------------------------- */
556
557static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000558I_close(Iobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000559 Py_XDECREF(self->pbuf);
560 self->pbuf = NULL;
561 self->buf = NULL;
562
563 self->pos = self->string_size = 0;
564
565 Py_INCREF(Py_None);
566 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000567}
568
569static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000570I_seek(Iobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000571 Py_ssize_t position;
572 int mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000573
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000574 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
575 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000576 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000577
Jim Fultone60de4d2000-10-06 19:24:23 +0000578 if (mode == 2) position += self->string_size;
579 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000580
Jim Fultone60de4d2000-10-06 19:24:23 +0000581 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000582
Jim Fultone60de4d2000-10-06 19:24:23 +0000583 self->pos=position;
584
585 Py_INCREF(Py_None);
586 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000587}
588
589static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000590 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000591 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000592 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000593 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000594 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
595 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
596 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000597 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
598 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000599 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
600
601 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000602 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000603 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000604 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000605};
606
Guido van Rossum049cd901996-12-05 23:30:48 +0000607static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000608I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000609 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000610 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000611}
612
Barry Warsaw3e8be722001-09-22 04:36:49 +0000613
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000614PyDoc_STRVAR(Itype__doc__,
615"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000616
617static PyTypeObject Itype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000618 PyObject_HEAD_INIT(NULL)
Barry Warsaw3e8be722001-09-22 04:36:49 +0000619 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000620 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000621 sizeof(Iobject), /*tp_basicsize*/
622 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000623 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000624 (destructor)I_dealloc, /*tp_dealloc*/
625 (printfunc)0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000626 0, /* tp_getattr */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000627 (setattrfunc)0, /*tp_setattr*/
628 (cmpfunc)0, /*tp_compare*/
629 (reprfunc)0, /*tp_repr*/
630 0, /*tp_as_number*/
631 0, /*tp_as_sequence*/
632 0, /*tp_as_mapping*/
633 (hashfunc)0, /*tp_hash*/
634 (ternaryfunc)0, /*tp_call*/
635 (reprfunc)0, /*tp_str*/
636 0, /* tp_getattro */
637 0, /* tp_setattro */
638 0, /* tp_as_buffer */
639 Py_TPFLAGS_DEFAULT, /* tp_flags */
640 Itype__doc__, /* tp_doc */
641 0, /* tp_traverse */
642 0, /* tp_clear */
643 0, /* tp_richcompare */
644 0, /* tp_weaklistoffset */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000645 PyObject_SelfIter, /* tp_iter */
646 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000647 I_methods, /* tp_methods */
648 0, /* tp_members */
649 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000650};
651
Guido van Rossum142eeb81997-08-13 03:14:41 +0000652static PyObject *
653newIobject(PyObject *s) {
654 Iobject *self;
655 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000656 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000657
Marc-André Lemburge47df7a2001-09-24 17:34:52 +0000658 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
659 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000660 s->ob_type->tp_name);
661 return NULL;
662 }
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000663 self = PyObject_New(Iobject, &Itype);
664 if (!self) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000665 Py_INCREF(s);
666 self->buf=buf;
667 self->string_size=size;
668 self->pbuf=s;
669 self->pos=0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000670
671 return (PyObject*)self;
672}
673
Guido van Rossum049cd901996-12-05 23:30:48 +0000674/* End of code for StringI objects */
675/* -------------------------------------------------------- */
676
677
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000678PyDoc_STRVAR(IO_StringIO__doc__,
679"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000680
681static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000682IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000683 PyObject *s=0;
684
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000685 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000686
687 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000688 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000689}
690
691/* List of methods defined in the module */
692
693static struct PyMethodDef IO_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000694 {"StringIO", (PyCFunction)IO_StringIO,
695 METH_VARARGS, IO_StringIO__doc__},
Guido van Rossum55702f81997-01-06 22:57:52 +0000696 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000697};
698
699
700/* Initialization function for the module (*must* be called initcStringIO) */
701
Guido van Rossum154417e1997-04-09 17:35:33 +0000702static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000703 IO_cread,
704 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000705 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000706 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000707 newOobject,
708 newIobject,
709 &Itype,
710 &Otype,
711};
712
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000713#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
714#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000715#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000716PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000717initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000718 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000719
Guido van Rossum154417e1997-04-09 17:35:33 +0000720
Guido van Rossum049cd901996-12-05 23:30:48 +0000721 /* Create the module and add the functions */
722 m = Py_InitModule4("cStringIO", IO_methods,
723 cStringIO_module_documentation,
724 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000725 if (m == NULL) return;
Guido van Rossum049cd901996-12-05 23:30:48 +0000726
727 /* Add some symbolic constants to the module */
728 d = PyModule_GetDict(m);
Guido van Rossum049cd901996-12-05 23:30:48 +0000729
Guido van Rossum55702f81997-01-06 22:57:52 +0000730 /* Export C API */
Guido van Rossum154417e1997-04-09 17:35:33 +0000731 Itype.ob_type=&PyType_Type;
732 Otype.ob_type=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000733 if (PyType_Ready(&Otype) < 0) return;
734 if (PyType_Ready(&Itype) < 0) return;
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000735 PyDict_SetItemString(d,"cStringIO_CAPI",
736 v = PyCObject_FromVoidPtr(&CAPI,NULL));
737 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000738
739 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000740 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
741 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000742
743 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000744 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000745}