blob: 79834f97d3223860ff7f93990e73c4e510c0f437 [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;
Martin v. Löwis1bba9db2007-07-28 17:57:00 +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;
Martin v. Löwis1bba9db2007-07-28 17:57:00 +0000139 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
Martin v. Löwis1bba9db2007-07-28 17:57:00 +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 }
Martin v. Löwis1bba9db2007-07-28 17:57:00 +0000217 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;
Martin v. Löwis1bba9db2007-07-28 17:57:00 +0000240 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
Christian Heimes217cfd12007-12-02 14:31:20 +0000279 return PyLong_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;
Martin v. Löwis1bba9db2007-07-28 17:57:00 +0000317 if (!PyString_GET_SIZE(next)) {
Raymond Hettinger352f9472003-04-24 15:50:11 +0000318 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) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000351 char *newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000352 self->buf_size*=2;
353 if (self->buf_size <= position) self->buf_size=position+1;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000354 newbuf = (char*) realloc(self->buf,self->buf_size);
355 if (!newbuf) {
356 free(self->buf);
357 self->buf = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000358 self->buf_size=self->pos=0;
359 return PyErr_NoMemory();
360 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000361 self->buf = newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000362 }
363 else if (position < 0) position=0;
364
365 self->pos=position;
366
367 while (--position >= self->string_size) self->buf[position]=0;
368
369 Py_INCREF(Py_None);
370 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000371}
372
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000373PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000374"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000375"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000376
377
378static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000379O_cwrite(PyObject *self, const char *c, Py_ssize_t l) {
380 Py_ssize_t newl;
Guido van Rossum2f098122001-12-07 20:20:28 +0000381 Oobject *oself;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000382 char *newbuf;
Guido van Rossum55702f81997-01-06 22:57:52 +0000383
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000384 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000385 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000386
Guido van Rossum2f098122001-12-07 20:20:28 +0000387 newl = oself->pos+l;
388 if (newl >= oself->buf_size) {
389 oself->buf_size *= 2;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000390 if (oself->buf_size <= newl) {
391 assert(newl + 1 < INT_MAX);
392 oself->buf_size = (int)(newl+1);
393 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000394 newbuf = (char*)realloc(oself->buf, oself->buf_size);
395 if (!newbuf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000396 PyErr_SetString(PyExc_MemoryError,"out of memory");
Guido van Rossumd8faa362007-04-27 19:54:29 +0000397 free(oself->buf);
398 oself->buf = 0;
Guido van Rossum2f098122001-12-07 20:20:28 +0000399 oself->buf_size = oself->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000400 return -1;
401 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000402 oself->buf = newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000403 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000404
Guido van Rossum2f098122001-12-07 20:20:28 +0000405 memcpy(oself->buf+oself->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000406
Martin v. Löwis18e16552006-02-15 17:27:45 +0000407 assert(oself->pos + l < INT_MAX);
408 oself->pos += (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000409
Guido van Rossum2f098122001-12-07 20:20:28 +0000410 if (oself->string_size < oself->pos) {
411 oself->string_size = oself->pos;
412 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000413
Martin v. Löwis18e16552006-02-15 17:27:45 +0000414 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000415}
416
417static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000418O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000419 char *c;
420 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000421
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000422 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000423
Jim Fultone60de4d2000-10-06 19:24:23 +0000424 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000425
Jim Fultone60de4d2000-10-06 19:24:23 +0000426 Py_INCREF(Py_None);
427 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000428}
429
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000430PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000431
432static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000433O_close(Oobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000434 if (self->buf != NULL) free(self->buf);
435 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000436
Jim Fultone60de4d2000-10-06 19:24:23 +0000437 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000438
Jim Fultone60de4d2000-10-06 19:24:23 +0000439 Py_INCREF(Py_None);
440 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000441}
442
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000443PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000444"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
445"\n"
446"Note that newlines are not added. The sequence can be any iterable object\n"
447"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000448static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000449O_writelines(Oobject *self, PyObject *args) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000450 PyObject *it, *s;
451
452 it = PyObject_GetIter(args);
453 if (it == NULL)
Raymond Hettingerbc72c5a2004-02-27 10:30:49 +0000454 return NULL;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000455 while ((s = PyIter_Next(it)) != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456 Py_ssize_t n;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000457 char *c;
458 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
459 Py_DECREF(it);
460 Py_DECREF(s);
461 return NULL;
462 }
463 if (O_cwrite((PyObject *)self, c, n) == -1) {
464 Py_DECREF(it);
465 Py_DECREF(s);
466 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000467 }
468 Py_DECREF(s);
469 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000470
Michael W. Hudson10402a32005-09-22 09:19:01 +0000471 Py_DECREF(it);
472
473 /* See if PyIter_Next failed */
474 if (PyErr_Occurred())
475 return NULL;
476
477 Py_RETURN_NONE;
478}
Guido van Rossum049cd901996-12-05 23:30:48 +0000479static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000480 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000481 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000482 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000483 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000484 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
485 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
486 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000487 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
488 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000489 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
490
491 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000492 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000493 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
494 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000495 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000496 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000497};
498
Guido van Rossum049cd901996-12-05 23:30:48 +0000499static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000500O_dealloc(Oobject *self) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000501 if (self->buf != NULL)
502 free(self->buf);
503 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000504}
505
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000506PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000507
508static PyTypeObject Otype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000509 PyVarObject_HEAD_INIT(NULL, 0)
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000510 "cStringIO.StringO", /*tp_name*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000511 sizeof(Oobject), /*tp_basicsize*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000512 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000513 /* methods */
514 (destructor)O_dealloc, /*tp_dealloc*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000515 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000516 0, /*tp_getattr */
517 0, /*tp_setattr */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000518 0, /*tp_compare*/
519 0, /*tp_repr*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000520 0, /*tp_as_number*/
521 0, /*tp_as_sequence*/
522 0, /*tp_as_mapping*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000523 0, /*tp_hash*/
524 0 , /*tp_call*/
525 0, /*tp_str*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000526 0, /*tp_getattro */
527 0, /*tp_setattro */
528 0, /*tp_as_buffer */
529 Py_TPFLAGS_DEFAULT, /*tp_flags*/
530 Otype__doc__, /*tp_doc */
531 0, /*tp_traverse */
532 0, /*tp_clear */
533 0, /*tp_richcompare */
534 0, /*tp_weaklistoffset */
535 PyObject_SelfIter, /*tp_iter */
536 (iternextfunc)IO_iternext, /*tp_iternext */
537 O_methods, /*tp_methods */
Guido van Rossum79139b22007-02-09 23:20:19 +0000538 0, /*tp_members */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000539 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000540};
541
Guido van Rossum142eeb81997-08-13 03:14:41 +0000542static PyObject *
543newOobject(int size) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000544 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000545
Jim Fultone60de4d2000-10-06 19:24:23 +0000546 self = PyObject_New(Oobject, &Otype);
547 if (self == NULL)
548 return NULL;
549 self->pos=0;
550 self->string_size = 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 = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000628 PyVarObject_HEAD_INIT(NULL, 0)
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000629 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000630 sizeof(Iobject), /*tp_basicsize*/
631 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000632 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000633 (destructor)I_dealloc, /*tp_dealloc*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000634 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000635 0, /* tp_getattr */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000636 0, /*tp_setattr*/
637 0, /*tp_compare*/
638 0, /*tp_repr*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000639 0, /*tp_as_number*/
640 0, /*tp_as_sequence*/
641 0, /*tp_as_mapping*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000642 0, /*tp_hash*/
643 0, /*tp_call*/
644 0, /*tp_str*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000645 0, /* tp_getattro */
646 0, /* tp_setattro */
647 0, /* tp_as_buffer */
648 Py_TPFLAGS_DEFAULT, /* tp_flags */
649 Itype__doc__, /* tp_doc */
650 0, /* tp_traverse */
651 0, /* tp_clear */
652 0, /* tp_richcompare */
653 0, /* tp_weaklistoffset */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000654 PyObject_SelfIter, /* tp_iter */
655 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000656 I_methods, /* tp_methods */
657 0, /* tp_members */
658 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000659};
660
Guido van Rossum142eeb81997-08-13 03:14:41 +0000661static PyObject *
662newIobject(PyObject *s) {
663 Iobject *self;
664 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000665 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000666
Guido van Rossumc76a2502007-08-09 14:26:58 +0000667 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
668 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
669 s->ob_type->tp_name);
670 return NULL;
671 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000672
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000673 self = PyObject_New(Iobject, &Itype);
674 if (!self) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000675 Py_INCREF(s);
676 self->buf=buf;
677 self->string_size=size;
678 self->pbuf=s;
679 self->pos=0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000680
681 return (PyObject*)self;
682}
683
Guido van Rossum049cd901996-12-05 23:30:48 +0000684/* End of code for StringI objects */
685/* -------------------------------------------------------- */
686
687
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000688PyDoc_STRVAR(IO_StringIO__doc__,
689"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000690
691static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000692IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000693 PyObject *s=0;
694
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000695 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000696
697 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000698 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000699}
700
701/* List of methods defined in the module */
702
703static struct PyMethodDef IO_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000704 {"StringIO", (PyCFunction)IO_StringIO,
705 METH_VARARGS, IO_StringIO__doc__},
Guido van Rossum55702f81997-01-06 22:57:52 +0000706 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000707};
708
709
710/* Initialization function for the module (*must* be called initcStringIO) */
711
Guido van Rossum154417e1997-04-09 17:35:33 +0000712static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000713 IO_cread,
714 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000715 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000716 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000717 newOobject,
718 newIobject,
719 &Itype,
720 &Otype,
721};
722
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000723#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
724#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000725#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000726PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000727initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000728 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000729
Guido van Rossum154417e1997-04-09 17:35:33 +0000730
Guido van Rossum049cd901996-12-05 23:30:48 +0000731 /* Create the module and add the functions */
732 m = Py_InitModule4("cStringIO", IO_methods,
733 cStringIO_module_documentation,
734 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000735 if (m == NULL) return;
Guido van Rossum049cd901996-12-05 23:30:48 +0000736
737 /* Add some symbolic constants to the module */
738 d = PyModule_GetDict(m);
Guido van Rossum049cd901996-12-05 23:30:48 +0000739
Guido van Rossum55702f81997-01-06 22:57:52 +0000740 /* Export C API */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000741 Py_Type(&Itype)=&PyType_Type;
742 Py_Type(&Otype)=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000743 if (PyType_Ready(&Otype) < 0) return;
744 if (PyType_Ready(&Itype) < 0) return;
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000745 PyDict_SetItemString(d,"cStringIO_CAPI",
746 v = PyCObject_FromVoidPtr(&CAPI,NULL));
747 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000748
749 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000750 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
751 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000752
753 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000754 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000755}