blob: a6fad9cbf37908e59cdb972325d1e9aa7912b8b2 [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) {
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
Jim Fultone60de4d2000-10-06 19:24:23 +0000180 return PyString_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 }
218 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000219}
220
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000221PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000222
223static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000224IO_readlines(IOobject *self, PyObject *args) {
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000225 int n;
226 char *output;
227 PyObject *result, *line;
228 int hint = 0, length = 0;
229
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;
241 line = PyString_FromStringAndSize (output, n);
Jim Fultone60de4d2000-10-06 19:24:23 +0000242 if (!line)
243 goto err;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000244 if (PyList_Append (result, line) == -1) {
245 Py_DECREF (line);
246 goto err;
247 }
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000248 Py_DECREF (line);
249 length += n;
250 if (hint > 0 && length >= hint)
251 break;
252 }
253 return result;
Jim Fultone60de4d2000-10-06 19:24:23 +0000254 err:
255 Py_DECREF(result);
256 return NULL;
257}
258
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000259PyDoc_STRVAR(IO_reset__doc__,
260"reset() -- Reset the file position to the beginning");
Jim Fultone60de4d2000-10-06 19:24:23 +0000261
262static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000263IO_reset(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000264
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;
Jim Fultone60de4d2000-10-06 19:24:23 +0000292 if (pos < 0) pos = self->pos;
293
294 if (self->string_size > pos) self->string_size = pos;
Tim Peters037b3ee2004-08-21 06:55:43 +0000295 self->pos = self->string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +0000296
297 Py_INCREF(Py_None);
298 return Py_None;
299}
300
Raymond Hettinger352f9472003-04-24 15:50:11 +0000301static PyObject *
302IO_iternext(Iobject *self)
303{
304 PyObject *next;
305 next = IO_readline((IOobject *)self, NULL);
306 if (!next)
307 return NULL;
308 if (!PyString_GET_SIZE(next)) {
309 Py_DECREF(next);
310 PyErr_SetNone(PyExc_StopIteration);
311 return NULL;
312 }
313 return next;
314}
315
Jim Fultone60de4d2000-10-06 19:24:23 +0000316
317
318
319/* Read-write object methods */
320
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000321PyDoc_STRVAR(O_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000322"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000323"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000324
325static PyObject *
326O_seek(Oobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000327 Py_ssize_t position;
328 int mode = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000329
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000330 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
331 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000332 return NULL;
333
334 if (mode == 2) {
335 position += self->string_size;
336 }
337 else if (mode == 1) {
338 position += self->pos;
339 }
340
341 if (position > self->buf_size) {
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000342 char *newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000343 self->buf_size*=2;
344 if (self->buf_size <= position) self->buf_size=position+1;
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000345 newbuf = (char*) realloc(self->buf,self->buf_size);
346 if (!newbuf) {
347 free(self->buf);
348 self->buf = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000349 self->buf_size=self->pos=0;
350 return PyErr_NoMemory();
351 }
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000352 self->buf = newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000353 }
354 else if (position < 0) position=0;
355
356 self->pos=position;
357
358 while (--position >= self->string_size) self->buf[position]=0;
359
360 Py_INCREF(Py_None);
361 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000362}
363
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000364PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000365"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000366"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000367
368
369static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000370O_cwrite(PyObject *self, const char *c, Py_ssize_t l) {
371 Py_ssize_t newl;
Guido van Rossum2f098122001-12-07 20:20:28 +0000372 Oobject *oself;
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000373 char *newbuf;
Guido van Rossum55702f81997-01-06 22:57:52 +0000374
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000375 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000376 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000377
Guido van Rossum2f098122001-12-07 20:20:28 +0000378 newl = oself->pos+l;
379 if (newl >= oself->buf_size) {
380 oself->buf_size *= 2;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000381 if (oself->buf_size <= newl) {
382 assert(newl + 1 < INT_MAX);
383 oself->buf_size = (int)(newl+1);
384 }
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000385 newbuf = (char*)realloc(oself->buf, oself->buf_size);
386 if (!newbuf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000387 PyErr_SetString(PyExc_MemoryError,"out of memory");
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000388 free(oself->buf);
389 oself->buf = 0;
Guido van Rossum2f098122001-12-07 20:20:28 +0000390 oself->buf_size = oself->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000391 return -1;
392 }
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000393 oself->buf = newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000394 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000395
Guido van Rossum2f098122001-12-07 20:20:28 +0000396 memcpy(oself->buf+oself->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000397
Martin v. Löwis18e16552006-02-15 17:27:45 +0000398 assert(oself->pos + l < INT_MAX);
399 oself->pos += (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000400
Guido van Rossum2f098122001-12-07 20:20:28 +0000401 if (oself->string_size < oself->pos) {
402 oself->string_size = oself->pos;
403 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000404
Martin v. Löwis18e16552006-02-15 17:27:45 +0000405 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000406}
407
408static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000409O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000410 char *c;
411 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000412
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000413 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000414
Jim Fultone60de4d2000-10-06 19:24:23 +0000415 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000416
Jim Fultone60de4d2000-10-06 19:24:23 +0000417 Py_INCREF(Py_None);
418 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000419}
420
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000421PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000422
423static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000424O_close(Oobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000425 if (self->buf != NULL) free(self->buf);
426 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000427
Jim Fultone60de4d2000-10-06 19:24:23 +0000428 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000429
Jim Fultone60de4d2000-10-06 19:24:23 +0000430 Py_INCREF(Py_None);
431 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000432}
433
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000434PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000435"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
436"\n"
437"Note that newlines are not added. The sequence can be any iterable object\n"
438"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000439static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000440O_writelines(Oobject *self, PyObject *args) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000441 PyObject *it, *s;
442
443 it = PyObject_GetIter(args);
444 if (it == NULL)
Raymond Hettingerbc72c5a2004-02-27 10:30:49 +0000445 return NULL;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000446 while ((s = PyIter_Next(it)) != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000447 Py_ssize_t n;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000448 char *c;
449 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
450 Py_DECREF(it);
451 Py_DECREF(s);
452 return NULL;
453 }
454 if (O_cwrite((PyObject *)self, c, n) == -1) {
455 Py_DECREF(it);
456 Py_DECREF(s);
457 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000458 }
459 Py_DECREF(s);
460 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000461
Michael W. Hudson10402a32005-09-22 09:19:01 +0000462 Py_DECREF(it);
463
464 /* See if PyIter_Next failed */
465 if (PyErr_Occurred())
466 return NULL;
467
468 Py_RETURN_NONE;
469}
Guido van Rossum049cd901996-12-05 23:30:48 +0000470static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000471 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000472 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000473 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000474 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000475 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
476 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
477 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000478 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
479 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000480 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
481
482 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000483 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000484 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
485 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000486 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000487 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000488};
489
Raymond Hettinger352f9472003-04-24 15:50:11 +0000490static PyMemberDef O_memberlist[] = {
491 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
492 "flag indicating that a space needs to be printed; used by print"},
Raymond Hettinger5475f232003-08-08 12:20:03 +0000493 /* getattr(f, "closed") is implemented without this table */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000494 {NULL} /* Sentinel */
495};
496
Guido van Rossum049cd901996-12-05 23:30:48 +0000497static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000498O_dealloc(Oobject *self) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000499 if (self->buf != NULL)
500 free(self->buf);
501 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000502}
503
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000504PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000505
506static PyTypeObject Otype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000507 PyObject_HEAD_INIT(NULL)
Raymond Hettinger352f9472003-04-24 15:50:11 +0000508 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000509 "cStringIO.StringO", /*tp_name*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000510 sizeof(Oobject), /*tp_basicsize*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000511 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000512 /* methods */
513 (destructor)O_dealloc, /*tp_dealloc*/
Georg Brandld37ac692006-03-30 11:58:57 +0000514 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000515 0, /*tp_getattr */
516 0, /*tp_setattr */
Georg Brandld37ac692006-03-30 11:58:57 +0000517 0, /*tp_compare*/
518 0, /*tp_repr*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000519 0, /*tp_as_number*/
520 0, /*tp_as_sequence*/
521 0, /*tp_as_mapping*/
Georg Brandld37ac692006-03-30 11:58:57 +0000522 0, /*tp_hash*/
523 0 , /*tp_call*/
524 0, /*tp_str*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000525 0, /*tp_getattro */
526 0, /*tp_setattro */
527 0, /*tp_as_buffer */
528 Py_TPFLAGS_DEFAULT, /*tp_flags*/
529 Otype__doc__, /*tp_doc */
530 0, /*tp_traverse */
531 0, /*tp_clear */
532 0, /*tp_richcompare */
533 0, /*tp_weaklistoffset */
534 PyObject_SelfIter, /*tp_iter */
535 (iternextfunc)IO_iternext, /*tp_iternext */
536 O_methods, /*tp_methods */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000537 O_memberlist, /*tp_members */
538 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000539};
540
Guido van Rossum142eeb81997-08-13 03:14:41 +0000541static PyObject *
542newOobject(int size) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000543 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000544
Jim Fultone60de4d2000-10-06 19:24:23 +0000545 self = PyObject_New(Oobject, &Otype);
546 if (self == NULL)
547 return NULL;
548 self->pos=0;
549 self->string_size = 0;
550 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000551
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000552 self->buf = (char *)malloc(size);
553 if (!self->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000554 PyErr_SetString(PyExc_MemoryError,"out of memory");
555 self->buf_size = 0;
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +0000556 Py_DECREF(self);
Jim Fultone60de4d2000-10-06 19:24:23 +0000557 return NULL;
558 }
559
560 self->buf_size=size;
561 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000562}
563
Skip Montanaroe1388282003-08-11 13:15:11 +0000564/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000565/* -------------------------------------------------------- */
566
567static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000568I_close(Iobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000569 Py_XDECREF(self->pbuf);
570 self->pbuf = NULL;
571 self->buf = NULL;
572
573 self->pos = self->string_size = 0;
574
575 Py_INCREF(Py_None);
576 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000577}
578
579static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000580I_seek(Iobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000581 Py_ssize_t position;
582 int mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000583
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000584 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
585 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000586 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000587
Jim Fultone60de4d2000-10-06 19:24:23 +0000588 if (mode == 2) position += self->string_size;
589 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000590
Jim Fultone60de4d2000-10-06 19:24:23 +0000591 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000592
Jim Fultone60de4d2000-10-06 19:24:23 +0000593 self->pos=position;
594
595 Py_INCREF(Py_None);
596 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000597}
598
599static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000600 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000601 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000602 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000603 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000604 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
605 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
606 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000607 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
608 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000609 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
610
611 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000612 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000613 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000614 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000615};
616
Guido van Rossum049cd901996-12-05 23:30:48 +0000617static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000618I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000619 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000620 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000621}
622
Barry Warsaw3e8be722001-09-22 04:36:49 +0000623
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000624PyDoc_STRVAR(Itype__doc__,
625"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000626
627static PyTypeObject Itype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000628 PyObject_HEAD_INIT(NULL)
Barry Warsaw3e8be722001-09-22 04:36:49 +0000629 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000630 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000631 sizeof(Iobject), /*tp_basicsize*/
632 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000633 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000634 (destructor)I_dealloc, /*tp_dealloc*/
Georg Brandld37ac692006-03-30 11:58:57 +0000635 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000636 0, /* tp_getattr */
Georg Brandld37ac692006-03-30 11:58:57 +0000637 0, /*tp_setattr*/
638 0, /*tp_compare*/
639 0, /*tp_repr*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000640 0, /*tp_as_number*/
641 0, /*tp_as_sequence*/
642 0, /*tp_as_mapping*/
Georg Brandld37ac692006-03-30 11:58:57 +0000643 0, /*tp_hash*/
644 0, /*tp_call*/
645 0, /*tp_str*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000646 0, /* tp_getattro */
647 0, /* tp_setattro */
648 0, /* tp_as_buffer */
649 Py_TPFLAGS_DEFAULT, /* tp_flags */
650 Itype__doc__, /* tp_doc */
651 0, /* tp_traverse */
652 0, /* tp_clear */
653 0, /* tp_richcompare */
654 0, /* tp_weaklistoffset */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000655 PyObject_SelfIter, /* tp_iter */
656 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000657 I_methods, /* tp_methods */
658 0, /* tp_members */
659 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000660};
661
Guido van Rossum142eeb81997-08-13 03:14:41 +0000662static PyObject *
663newIobject(PyObject *s) {
664 Iobject *self;
665 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000666 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000667
Georg Brandlde469d62007-08-08 13:50:04 +0000668 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
Georg Brandleb4b7382007-08-08 13:03:45 +0000669 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
670 s->ob_type->tp_name);
671 return NULL;
672 }
Georg Brandl3c487092006-10-12 09:47:17 +0000673
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000674 self = PyObject_New(Iobject, &Itype);
675 if (!self) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000676 Py_INCREF(s);
677 self->buf=buf;
678 self->string_size=size;
679 self->pbuf=s;
680 self->pos=0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000681
682 return (PyObject*)self;
683}
684
Guido van Rossum049cd901996-12-05 23:30:48 +0000685/* End of code for StringI objects */
686/* -------------------------------------------------------- */
687
688
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000689PyDoc_STRVAR(IO_StringIO__doc__,
690"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000691
692static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000693IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000694 PyObject *s=0;
695
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000696 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000697
698 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000699 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000700}
701
702/* List of methods defined in the module */
703
704static struct PyMethodDef IO_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000705 {"StringIO", (PyCFunction)IO_StringIO,
706 METH_VARARGS, IO_StringIO__doc__},
Guido van Rossum55702f81997-01-06 22:57:52 +0000707 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000708};
709
710
711/* Initialization function for the module (*must* be called initcStringIO) */
712
Guido van Rossum154417e1997-04-09 17:35:33 +0000713static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000714 IO_cread,
715 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000716 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000717 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000718 newOobject,
719 newIobject,
720 &Itype,
721 &Otype,
722};
723
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000724#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
725#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000726#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000727PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000728initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000729 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000730
Guido van Rossum154417e1997-04-09 17:35:33 +0000731
Guido van Rossum049cd901996-12-05 23:30:48 +0000732 /* Create the module and add the functions */
733 m = Py_InitModule4("cStringIO", IO_methods,
734 cStringIO_module_documentation,
735 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000736 if (m == NULL) return;
Guido van Rossum049cd901996-12-05 23:30:48 +0000737
738 /* Add some symbolic constants to the module */
739 d = PyModule_GetDict(m);
Guido van Rossum049cd901996-12-05 23:30:48 +0000740
Guido van Rossum55702f81997-01-06 22:57:52 +0000741 /* Export C API */
Guido van Rossum154417e1997-04-09 17:35:33 +0000742 Itype.ob_type=&PyType_Type;
743 Otype.ob_type=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000744 if (PyType_Ready(&Otype) < 0) return;
745 if (PyType_Ready(&Itype) < 0) return;
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000746 PyDict_SetItemString(d,"cStringIO_CAPI",
747 v = PyCObject_FromVoidPtr(&CAPI,NULL));
748 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000749
750 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000751 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
752 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000753
754 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000755 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000756}