blob: 2ed148576c975e92d438fcbc8523d962500d7637 [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;
Jim Fultone60de4d2000-10-06 19:24:23 +000060} Oobject;
61
62/* Declarations for objects of type StringI */
63
64typedef struct { /* Subtype of IOobject */
65 PyObject_HEAD
66 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000067 Py_ssize_t pos, string_size;
Marc-André Lemburge47df7a2001-09-24 17:34:52 +000068 /* We store a reference to the object here in order to keep
69 the buffer alive during the lifetime of the Iobject. */
Guido van Rossum049cd901996-12-05 23:30:48 +000070 PyObject *pbuf;
71} Iobject;
72
Jim Fultone60de4d2000-10-06 19:24:23 +000073/* IOobject (common) methods */
74
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000075PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing.");
Jim Fultone60de4d2000-10-06 19:24:23 +000076
77static int
78IO__opencheck(IOobject *self) {
Martin v. Löwis5df2e612006-03-01 23:10:49 +000079 if (!self->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +000080 PyErr_SetString(PyExc_ValueError,
81 "I/O operation on closed file");
82 return 0;
83 }
84 return 1;
85}
86
87static PyObject *
Raymond Hettinger5475f232003-08-08 12:20:03 +000088IO_get_closed(IOobject *self, void *closure)
89{
90 PyObject *result = Py_False;
91
92 if (self->buf == NULL)
93 result = Py_True;
94 Py_INCREF(result);
95 return result;
96}
97
98static PyGetSetDef file_getsetlist[] = {
99 {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"},
100 {0},
101};
102
103static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000104IO_flush(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000105
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000106 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000107
108 Py_INCREF(Py_None);
109 return Py_None;
110}
111
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000112PyDoc_STRVAR(IO_getval__doc__,
113"getvalue([use_pos]) -- Get the string value."
114"\n"
115"If use_pos is specified and is a true value, then the string returned\n"
116"will include only the text up to the current file position.\n");
Guido van Rossum049cd901996-12-05 23:30:48 +0000117
118static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000119IO_cgetval(PyObject *self) {
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000120 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000121 return PyString_FromStringAndSize(((IOobject*)self)->buf,
122 ((IOobject*)self)->pos);
Guido van Rossum049cd901996-12-05 23:30:48 +0000123}
124
Guido van Rossum049cd901996-12-05 23:30:48 +0000125static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000126IO_getval(IOobject *self, PyObject *args) {
127 PyObject *use_pos=Py_None;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000128 Py_ssize_t s;
Jim Fultone60de4d2000-10-06 19:24:23 +0000129
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000130 if (!IO__opencheck(self)) return NULL;
131 if (!PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000132
133 if (PyObject_IsTrue(use_pos)) {
134 s=self->pos;
135 if (s > self->string_size) s=self->string_size;
136 }
137 else
138 s=self->string_size;
139 return PyString_FromStringAndSize(self->buf, s);
Guido van Rossum049cd901996-12-05 23:30:48 +0000140}
141
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000142PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0");
Guido van Rossum049cd901996-12-05 23:30:48 +0000143
144static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000145IO_isatty(IOobject *self, PyObject *unused) {
Thomas Woutersa9773292006-04-21 09:43:23 +0000146 if (!IO__opencheck(self)) return NULL;
147 Py_INCREF(Py_False);
Guido van Rossum674deb22002-09-01 15:06:28 +0000148 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;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000291
292 if (PyTuple_Size(args) == 0) {
293 /* No argument passed, truncate to current position */
294 pos = self->pos;
295 }
296
297 if (pos < 0) {
298 errno = EINVAL;
299 PyErr_SetFromErrno(PyExc_IOError);
300 return NULL;
301 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000302
303 if (self->string_size > pos) self->string_size = pos;
Tim Peters037b3ee2004-08-21 06:55:43 +0000304 self->pos = self->string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +0000305
306 Py_INCREF(Py_None);
307 return Py_None;
308}
309
Raymond Hettinger352f9472003-04-24 15:50:11 +0000310static PyObject *
311IO_iternext(Iobject *self)
312{
313 PyObject *next;
314 next = IO_readline((IOobject *)self, NULL);
315 if (!next)
316 return NULL;
317 if (!PyString_GET_SIZE(next)) {
318 Py_DECREF(next);
319 PyErr_SetNone(PyExc_StopIteration);
320 return NULL;
321 }
322 return next;
323}
324
Jim Fultone60de4d2000-10-06 19:24:23 +0000325
326
327
328/* Read-write object methods */
329
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000330PyDoc_STRVAR(O_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000331"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000332"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000333
334static PyObject *
335O_seek(Oobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000336 Py_ssize_t position;
337 int mode = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000338
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000339 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
340 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000341 return NULL;
342
343 if (mode == 2) {
344 position += self->string_size;
345 }
346 else if (mode == 1) {
347 position += self->pos;
348 }
349
350 if (position > self->buf_size) {
351 self->buf_size*=2;
352 if (self->buf_size <= position) self->buf_size=position+1;
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000353 self->buf = (char*) realloc(self->buf,self->buf_size);
354 if (!self->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000355 self->buf_size=self->pos=0;
356 return PyErr_NoMemory();
357 }
358 }
359 else if (position < 0) position=0;
360
361 self->pos=position;
362
363 while (--position >= self->string_size) self->buf[position]=0;
364
365 Py_INCREF(Py_None);
366 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000367}
368
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000369PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000370"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000371"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000372
373
374static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000375O_cwrite(PyObject *self, const char *c, Py_ssize_t l) {
376 Py_ssize_t newl;
Guido van Rossum2f098122001-12-07 20:20:28 +0000377 Oobject *oself;
Guido van Rossum55702f81997-01-06 22:57:52 +0000378
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000379 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000380 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000381
Guido van Rossum2f098122001-12-07 20:20:28 +0000382 newl = oself->pos+l;
383 if (newl >= oself->buf_size) {
384 oself->buf_size *= 2;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000385 if (oself->buf_size <= newl) {
386 assert(newl + 1 < INT_MAX);
387 oself->buf_size = (int)(newl+1);
388 }
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000389 oself->buf = (char*)realloc(oself->buf, oself->buf_size);
390 if (!oself->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000391 PyErr_SetString(PyExc_MemoryError,"out of memory");
Guido van Rossum2f098122001-12-07 20:20:28 +0000392 oself->buf_size = oself->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000393 return -1;
394 }
395 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000396
Guido van Rossum2f098122001-12-07 20:20:28 +0000397 memcpy(oself->buf+oself->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000398
Martin v. Löwis18e16552006-02-15 17:27:45 +0000399 assert(oself->pos + l < INT_MAX);
400 oself->pos += (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000401
Guido van Rossum2f098122001-12-07 20:20:28 +0000402 if (oself->string_size < oself->pos) {
403 oself->string_size = oself->pos;
404 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000405
Martin v. Löwis18e16552006-02-15 17:27:45 +0000406 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000407}
408
409static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000410O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000411 char *c;
412 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000413
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000414 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000415
Jim Fultone60de4d2000-10-06 19:24:23 +0000416 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000417
Jim Fultone60de4d2000-10-06 19:24:23 +0000418 Py_INCREF(Py_None);
419 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000420}
421
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000422PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000423
424static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000425O_close(Oobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000426 if (self->buf != NULL) free(self->buf);
427 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000428
Jim Fultone60de4d2000-10-06 19:24:23 +0000429 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000430
Jim Fultone60de4d2000-10-06 19:24:23 +0000431 Py_INCREF(Py_None);
432 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000433}
434
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000435PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000436"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
437"\n"
438"Note that newlines are not added. The sequence can be any iterable object\n"
439"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000440static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000441O_writelines(Oobject *self, PyObject *args) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000442 PyObject *it, *s;
443
444 it = PyObject_GetIter(args);
445 if (it == NULL)
Raymond Hettingerbc72c5a2004-02-27 10:30:49 +0000446 return NULL;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000447 while ((s = PyIter_Next(it)) != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000448 Py_ssize_t n;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000449 char *c;
450 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
451 Py_DECREF(it);
452 Py_DECREF(s);
453 return NULL;
454 }
455 if (O_cwrite((PyObject *)self, c, n) == -1) {
456 Py_DECREF(it);
457 Py_DECREF(s);
458 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000459 }
460 Py_DECREF(s);
461 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000462
Michael W. Hudson10402a32005-09-22 09:19:01 +0000463 Py_DECREF(it);
464
465 /* See if PyIter_Next failed */
466 if (PyErr_Occurred())
467 return NULL;
468
469 Py_RETURN_NONE;
470}
Guido van Rossum049cd901996-12-05 23:30:48 +0000471static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000472 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000473 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000474 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000475 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000476 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
477 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
478 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000479 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
480 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000481 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
482
483 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000484 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000485 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
486 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000487 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000488 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000489};
490
Guido van Rossum049cd901996-12-05 23:30:48 +0000491static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000492O_dealloc(Oobject *self) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000493 if (self->buf != NULL)
494 free(self->buf);
495 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000496}
497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000498PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000499
500static PyTypeObject Otype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000501 PyObject_HEAD_INIT(NULL)
Raymond Hettinger352f9472003-04-24 15:50:11 +0000502 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000503 "cStringIO.StringO", /*tp_name*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000504 sizeof(Oobject), /*tp_basicsize*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000505 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000506 /* methods */
507 (destructor)O_dealloc, /*tp_dealloc*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000508 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000509 0, /*tp_getattr */
510 0, /*tp_setattr */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000511 0, /*tp_compare*/
512 0, /*tp_repr*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000513 0, /*tp_as_number*/
514 0, /*tp_as_sequence*/
515 0, /*tp_as_mapping*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000516 0, /*tp_hash*/
517 0 , /*tp_call*/
518 0, /*tp_str*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000519 0, /*tp_getattro */
520 0, /*tp_setattro */
521 0, /*tp_as_buffer */
522 Py_TPFLAGS_DEFAULT, /*tp_flags*/
523 Otype__doc__, /*tp_doc */
524 0, /*tp_traverse */
525 0, /*tp_clear */
526 0, /*tp_richcompare */
527 0, /*tp_weaklistoffset */
528 PyObject_SelfIter, /*tp_iter */
529 (iternextfunc)IO_iternext, /*tp_iternext */
530 O_methods, /*tp_methods */
Guido van Rossum79139b22007-02-09 23:20:19 +0000531 0, /*tp_members */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000532 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000533};
534
Guido van Rossum142eeb81997-08-13 03:14:41 +0000535static PyObject *
536newOobject(int size) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000537 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000538
Jim Fultone60de4d2000-10-06 19:24:23 +0000539 self = PyObject_New(Oobject, &Otype);
540 if (self == NULL)
541 return NULL;
542 self->pos=0;
543 self->string_size = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000544
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000545 self->buf = (char *)malloc(size);
546 if (!self->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000547 PyErr_SetString(PyExc_MemoryError,"out of memory");
548 self->buf_size = 0;
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +0000549 Py_DECREF(self);
Jim Fultone60de4d2000-10-06 19:24:23 +0000550 return NULL;
551 }
552
553 self->buf_size=size;
554 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000555}
556
Skip Montanaroe1388282003-08-11 13:15:11 +0000557/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000558/* -------------------------------------------------------- */
559
560static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000561I_close(Iobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000562 Py_XDECREF(self->pbuf);
563 self->pbuf = NULL;
564 self->buf = NULL;
565
566 self->pos = self->string_size = 0;
567
568 Py_INCREF(Py_None);
569 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000570}
571
572static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000573I_seek(Iobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000574 Py_ssize_t position;
575 int mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000576
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000577 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
578 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000579 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000580
Jim Fultone60de4d2000-10-06 19:24:23 +0000581 if (mode == 2) position += self->string_size;
582 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000583
Jim Fultone60de4d2000-10-06 19:24:23 +0000584 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000585
Jim Fultone60de4d2000-10-06 19:24:23 +0000586 self->pos=position;
587
588 Py_INCREF(Py_None);
589 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000590}
591
592static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000593 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000594 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000595 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000596 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000597 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
598 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
599 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000600 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
601 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000602 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
603
604 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000605 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000606 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000607 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000608};
609
Guido van Rossum049cd901996-12-05 23:30:48 +0000610static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000611I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000612 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000613 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000614}
615
Barry Warsaw3e8be722001-09-22 04:36:49 +0000616
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000617PyDoc_STRVAR(Itype__doc__,
618"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000619
620static PyTypeObject Itype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000621 PyObject_HEAD_INIT(NULL)
Barry Warsaw3e8be722001-09-22 04:36:49 +0000622 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000623 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000624 sizeof(Iobject), /*tp_basicsize*/
625 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000626 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000627 (destructor)I_dealloc, /*tp_dealloc*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000628 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000629 0, /* tp_getattr */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000630 0, /*tp_setattr*/
631 0, /*tp_compare*/
632 0, /*tp_repr*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000633 0, /*tp_as_number*/
634 0, /*tp_as_sequence*/
635 0, /*tp_as_mapping*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000636 0, /*tp_hash*/
637 0, /*tp_call*/
638 0, /*tp_str*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000639 0, /* tp_getattro */
640 0, /* tp_setattro */
641 0, /* tp_as_buffer */
642 Py_TPFLAGS_DEFAULT, /* tp_flags */
643 Itype__doc__, /* tp_doc */
644 0, /* tp_traverse */
645 0, /* tp_clear */
646 0, /* tp_richcompare */
647 0, /* tp_weaklistoffset */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000648 PyObject_SelfIter, /* tp_iter */
649 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000650 I_methods, /* tp_methods */
651 0, /* tp_members */
652 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000653};
654
Guido van Rossum142eeb81997-08-13 03:14:41 +0000655static PyObject *
656newIobject(PyObject *s) {
657 Iobject *self;
658 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000659 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000660
Thomas Wouters89f507f2006-12-13 04:49:30 +0000661 if (PyObject_AsCharBuffer(s, (const char **)&buf, &size) != 0)
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000662 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000663
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}