blob: 3f762b09fb02692a388bdd805e3e99fc32370c34 [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) {
Thomas Woutersa9773292006-04-21 09:43:23 +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;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000292
293 if (PyTuple_Size(args) == 0) {
294 /* No argument passed, truncate to current position */
295 pos = self->pos;
296 }
297
298 if (pos < 0) {
299 errno = EINVAL;
300 PyErr_SetFromErrno(PyExc_IOError);
301 return NULL;
302 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000303
304 if (self->string_size > pos) self->string_size = pos;
Tim Peters037b3ee2004-08-21 06:55:43 +0000305 self->pos = self->string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +0000306
307 Py_INCREF(Py_None);
308 return Py_None;
309}
310
Raymond Hettinger352f9472003-04-24 15:50:11 +0000311static PyObject *
312IO_iternext(Iobject *self)
313{
314 PyObject *next;
315 next = IO_readline((IOobject *)self, NULL);
316 if (!next)
317 return NULL;
318 if (!PyString_GET_SIZE(next)) {
319 Py_DECREF(next);
320 PyErr_SetNone(PyExc_StopIteration);
321 return NULL;
322 }
323 return next;
324}
325
Jim Fultone60de4d2000-10-06 19:24:23 +0000326
327
328
329/* Read-write object methods */
330
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000331PyDoc_STRVAR(O_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000332"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000333"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000334
335static PyObject *
336O_seek(Oobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000337 Py_ssize_t position;
338 int mode = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000339
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000340 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
341 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000342 return NULL;
343
344 if (mode == 2) {
345 position += self->string_size;
346 }
347 else if (mode == 1) {
348 position += self->pos;
349 }
350
351 if (position > self->buf_size) {
352 self->buf_size*=2;
353 if (self->buf_size <= position) self->buf_size=position+1;
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000354 self->buf = (char*) realloc(self->buf,self->buf_size);
355 if (!self->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000356 self->buf_size=self->pos=0;
357 return PyErr_NoMemory();
358 }
359 }
360 else if (position < 0) position=0;
361
362 self->pos=position;
363
364 while (--position >= self->string_size) self->buf[position]=0;
365
366 Py_INCREF(Py_None);
367 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000368}
369
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000370PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000371"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000372"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000373
374
375static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000376O_cwrite(PyObject *self, const char *c, Py_ssize_t l) {
377 Py_ssize_t newl;
Guido van Rossum2f098122001-12-07 20:20:28 +0000378 Oobject *oself;
Guido van Rossum55702f81997-01-06 22:57:52 +0000379
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000380 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000381 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000382
Guido van Rossum2f098122001-12-07 20:20:28 +0000383 newl = oself->pos+l;
384 if (newl >= oself->buf_size) {
385 oself->buf_size *= 2;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000386 if (oself->buf_size <= newl) {
387 assert(newl + 1 < INT_MAX);
388 oself->buf_size = (int)(newl+1);
389 }
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000390 oself->buf = (char*)realloc(oself->buf, oself->buf_size);
391 if (!oself->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000392 PyErr_SetString(PyExc_MemoryError,"out of memory");
Guido van Rossum2f098122001-12-07 20:20:28 +0000393 oself->buf_size = oself->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000394 return -1;
395 }
396 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000397
Guido van Rossum2f098122001-12-07 20:20:28 +0000398 memcpy(oself->buf+oself->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000399
Martin v. Löwis18e16552006-02-15 17:27:45 +0000400 assert(oself->pos + l < INT_MAX);
401 oself->pos += (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000402
Guido van Rossum2f098122001-12-07 20:20:28 +0000403 if (oself->string_size < oself->pos) {
404 oself->string_size = oself->pos;
405 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000406
Martin v. Löwis18e16552006-02-15 17:27:45 +0000407 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000408}
409
410static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000411O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000412 char *c;
413 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000414
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000415 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000416
Jim Fultone60de4d2000-10-06 19:24:23 +0000417 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000418
Jim Fultone60de4d2000-10-06 19:24:23 +0000419 Py_INCREF(Py_None);
420 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000421}
422
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000423PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000424
425static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000426O_close(Oobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000427 if (self->buf != NULL) free(self->buf);
428 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000429
Jim Fultone60de4d2000-10-06 19:24:23 +0000430 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000431
Jim Fultone60de4d2000-10-06 19:24:23 +0000432 Py_INCREF(Py_None);
433 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000434}
435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000436PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000437"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
438"\n"
439"Note that newlines are not added. The sequence can be any iterable object\n"
440"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000441static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000442O_writelines(Oobject *self, PyObject *args) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000443 PyObject *it, *s;
444
445 it = PyObject_GetIter(args);
446 if (it == NULL)
Raymond Hettingerbc72c5a2004-02-27 10:30:49 +0000447 return NULL;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000448 while ((s = PyIter_Next(it)) != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000449 Py_ssize_t n;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000450 char *c;
451 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
452 Py_DECREF(it);
453 Py_DECREF(s);
454 return NULL;
455 }
456 if (O_cwrite((PyObject *)self, c, n) == -1) {
457 Py_DECREF(it);
458 Py_DECREF(s);
459 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000460 }
461 Py_DECREF(s);
462 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000463
Michael W. Hudson10402a32005-09-22 09:19:01 +0000464 Py_DECREF(it);
465
466 /* See if PyIter_Next failed */
467 if (PyErr_Occurred())
468 return NULL;
469
470 Py_RETURN_NONE;
471}
Guido van Rossum049cd901996-12-05 23:30:48 +0000472static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000473 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000474 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000475 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000476 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000477 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
478 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
479 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000480 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
481 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000482 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
483
484 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000485 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000486 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
487 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000488 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000489 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000490};
491
Raymond Hettinger352f9472003-04-24 15:50:11 +0000492static PyMemberDef O_memberlist[] = {
493 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
494 "flag indicating that a space needs to be printed; used by print"},
Raymond Hettinger5475f232003-08-08 12:20:03 +0000495 /* getattr(f, "closed") is implemented without this table */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000496 {NULL} /* Sentinel */
497};
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 = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000509 PyObject_HEAD_INIT(NULL)
Raymond Hettinger352f9472003-04-24 15:50:11 +0000510 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000511 "cStringIO.StringO", /*tp_name*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000512 sizeof(Oobject), /*tp_basicsize*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000513 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000514 /* methods */
515 (destructor)O_dealloc, /*tp_dealloc*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000516 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000517 0, /*tp_getattr */
518 0, /*tp_setattr */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000519 0, /*tp_compare*/
520 0, /*tp_repr*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000521 0, /*tp_as_number*/
522 0, /*tp_as_sequence*/
523 0, /*tp_as_mapping*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000524 0, /*tp_hash*/
525 0 , /*tp_call*/
526 0, /*tp_str*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000527 0, /*tp_getattro */
528 0, /*tp_setattro */
529 0, /*tp_as_buffer */
530 Py_TPFLAGS_DEFAULT, /*tp_flags*/
531 Otype__doc__, /*tp_doc */
532 0, /*tp_traverse */
533 0, /*tp_clear */
534 0, /*tp_richcompare */
535 0, /*tp_weaklistoffset */
536 PyObject_SelfIter, /*tp_iter */
537 (iternextfunc)IO_iternext, /*tp_iternext */
538 O_methods, /*tp_methods */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000539 O_memberlist, /*tp_members */
540 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000541};
542
Guido van Rossum142eeb81997-08-13 03:14:41 +0000543static PyObject *
544newOobject(int size) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000545 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000546
Jim Fultone60de4d2000-10-06 19:24:23 +0000547 self = PyObject_New(Oobject, &Otype);
548 if (self == NULL)
549 return NULL;
550 self->pos=0;
551 self->string_size = 0;
552 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000553
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000554 self->buf = (char *)malloc(size);
555 if (!self->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000556 PyErr_SetString(PyExc_MemoryError,"out of memory");
557 self->buf_size = 0;
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +0000558 Py_DECREF(self);
Jim Fultone60de4d2000-10-06 19:24:23 +0000559 return NULL;
560 }
561
562 self->buf_size=size;
563 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000564}
565
Skip Montanaroe1388282003-08-11 13:15:11 +0000566/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000567/* -------------------------------------------------------- */
568
569static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000570I_close(Iobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000571 Py_XDECREF(self->pbuf);
572 self->pbuf = NULL;
573 self->buf = NULL;
574
575 self->pos = self->string_size = 0;
576
577 Py_INCREF(Py_None);
578 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000579}
580
581static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000582I_seek(Iobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000583 Py_ssize_t position;
584 int mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000585
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000586 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
587 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000588 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000589
Jim Fultone60de4d2000-10-06 19:24:23 +0000590 if (mode == 2) position += self->string_size;
591 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000592
Jim Fultone60de4d2000-10-06 19:24:23 +0000593 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000594
Jim Fultone60de4d2000-10-06 19:24:23 +0000595 self->pos=position;
596
597 Py_INCREF(Py_None);
598 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000599}
600
601static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000602 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000603 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000604 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000605 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000606 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
607 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
608 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000609 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
610 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000611 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
612
613 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000614 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000615 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000616 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000617};
618
Guido van Rossum049cd901996-12-05 23:30:48 +0000619static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000620I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000621 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000622 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000623}
624
Barry Warsaw3e8be722001-09-22 04:36:49 +0000625
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000626PyDoc_STRVAR(Itype__doc__,
627"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000628
629static PyTypeObject Itype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000630 PyObject_HEAD_INIT(NULL)
Barry Warsaw3e8be722001-09-22 04:36:49 +0000631 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000632 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000633 sizeof(Iobject), /*tp_basicsize*/
634 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000635 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000636 (destructor)I_dealloc, /*tp_dealloc*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000637 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000638 0, /* tp_getattr */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000639 0, /*tp_setattr*/
640 0, /*tp_compare*/
641 0, /*tp_repr*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000642 0, /*tp_as_number*/
643 0, /*tp_as_sequence*/
644 0, /*tp_as_mapping*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000645 0, /*tp_hash*/
646 0, /*tp_call*/
647 0, /*tp_str*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000648 0, /* tp_getattro */
649 0, /* tp_setattro */
650 0, /* tp_as_buffer */
651 Py_TPFLAGS_DEFAULT, /* tp_flags */
652 Itype__doc__, /* tp_doc */
653 0, /* tp_traverse */
654 0, /* tp_clear */
655 0, /* tp_richcompare */
656 0, /* tp_weaklistoffset */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000657 PyObject_SelfIter, /* tp_iter */
658 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000659 I_methods, /* tp_methods */
660 0, /* tp_members */
661 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000662};
663
Guido van Rossum142eeb81997-08-13 03:14:41 +0000664static PyObject *
665newIobject(PyObject *s) {
666 Iobject *self;
667 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000668 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000669
Thomas Wouters89f507f2006-12-13 04:49:30 +0000670 if (PyObject_AsCharBuffer(s, (const char **)&buf, &size) != 0)
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000671 return NULL;
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 */
Guido van Rossum154417e1997-04-09 17:35:33 +0000741 Itype.ob_type=&PyType_Type;
742 Otype.ob_type=&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}