blob: 618b88c69a1c9f7f880f1f64afd953b96e73d411 [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#define UNLESS(E) if (!(E))
Guido van Rossum049cd901996-12-05 23:30:48 +000037
Guido van Rossum049cd901996-12-05 23:30:48 +000038
Jim Fultone60de4d2000-10-06 19:24:23 +000039/* Declaration for file-like objects that manage data as strings
Guido van Rossum049cd901996-12-05 23:30:48 +000040
Jim Fultone60de4d2000-10-06 19:24:23 +000041 The IOobject type should be though of as a common base type for
42 Iobjects, which provide input (read-only) StringIO objects and
43 Oobjects, which provide read-write objects. Most of the methods
44 depend only on common data.
45*/
Guido van Rossum049cd901996-12-05 23:30:48 +000046
47typedef struct {
48 PyObject_HEAD
49 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000050 Py_ssize_t pos, string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +000051} IOobject;
52
53#define IOOOBJECT(O) ((IOobject*)(O))
54
Skip Montanaroe1388282003-08-11 13:15:11 +000055/* Declarations for objects of type StringO */
Jim Fultone60de4d2000-10-06 19:24:23 +000056
57typedef struct { /* Subtype of IOobject */
58 PyObject_HEAD
59 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000060 Py_ssize_t pos, string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +000061
Martin v. Löwis18e16552006-02-15 17:27:45 +000062 Py_ssize_t buf_size;
63 int softspace;
Jim Fultone60de4d2000-10-06 19:24:23 +000064} Oobject;
65
66/* Declarations for objects of type StringI */
67
68typedef struct { /* Subtype of IOobject */
69 PyObject_HEAD
70 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000071 Py_ssize_t pos, string_size;
Marc-André Lemburge47df7a2001-09-24 17:34:52 +000072 /* We store a reference to the object here in order to keep
73 the buffer alive during the lifetime of the Iobject. */
Guido van Rossum049cd901996-12-05 23:30:48 +000074 PyObject *pbuf;
75} Iobject;
76
Jim Fultone60de4d2000-10-06 19:24:23 +000077/* IOobject (common) methods */
78
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000079PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing.");
Jim Fultone60de4d2000-10-06 19:24:23 +000080
81static int
82IO__opencheck(IOobject *self) {
83 UNLESS (self->buf) {
84 PyErr_SetString(PyExc_ValueError,
85 "I/O operation on closed file");
86 return 0;
87 }
88 return 1;
89}
90
91static PyObject *
Raymond Hettinger5475f232003-08-08 12:20:03 +000092IO_get_closed(IOobject *self, void *closure)
93{
94 PyObject *result = Py_False;
95
96 if (self->buf == NULL)
97 result = Py_True;
98 Py_INCREF(result);
99 return result;
100}
101
102static PyGetSetDef file_getsetlist[] = {
103 {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"},
104 {0},
105};
106
107static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000108IO_flush(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000109
110 UNLESS (IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000111
112 Py_INCREF(Py_None);
113 return Py_None;
114}
115
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000116PyDoc_STRVAR(IO_getval__doc__,
117"getvalue([use_pos]) -- Get the string value."
118"\n"
119"If use_pos is specified and is a true value, then the string returned\n"
120"will include only the text up to the current file position.\n");
Guido van Rossum049cd901996-12-05 23:30:48 +0000121
122static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000123IO_cgetval(PyObject *self) {
124 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
125 return PyString_FromStringAndSize(((IOobject*)self)->buf,
126 ((IOobject*)self)->pos);
Guido van Rossum049cd901996-12-05 23:30:48 +0000127}
128
Guido van Rossum049cd901996-12-05 23:30:48 +0000129static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000130IO_getval(IOobject *self, PyObject *args) {
131 PyObject *use_pos=Py_None;
132 int s;
133
134 UNLESS (IO__opencheck(self)) return NULL;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000135 UNLESS (PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000136
137 if (PyObject_IsTrue(use_pos)) {
138 s=self->pos;
139 if (s > self->string_size) s=self->string_size;
140 }
141 else
142 s=self->string_size;
143 return PyString_FromStringAndSize(self->buf, s);
Guido van Rossum049cd901996-12-05 23:30:48 +0000144}
145
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000146PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0");
Guido van Rossum049cd901996-12-05 23:30:48 +0000147
148static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000149IO_isatty(IOobject *self, PyObject *unused) {
Guido van Rossum674deb22002-09-01 15:06:28 +0000150 Py_INCREF(Py_False);
151 return Py_False;
Guido van Rossum049cd901996-12-05 23:30:48 +0000152}
153
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000154PyDoc_STRVAR(IO_read__doc__,
155"read([s]) -- Read s characters, or the rest of the string");
Guido van Rossum049cd901996-12-05 23:30:48 +0000156
157static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000158IO_cread(PyObject *self, char **output, Py_ssize_t n) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000159 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000160
Jim Fultone60de4d2000-10-06 19:24:23 +0000161 UNLESS (IO__opencheck(IOOOBJECT(self))) return -1;
162 l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos;
163 if (n < 0 || n > l) {
164 n = l;
165 if (n < 0) n=0;
166 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000167
Jim Fultone60de4d2000-10-06 19:24:23 +0000168 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
169 ((IOobject*)self)->pos += n;
170 return n;
Guido van Rossum049cd901996-12-05 23:30:48 +0000171}
172
173static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000174IO_read(IOobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000175 Py_ssize_t n = -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000176 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000177
Martin v. Löwis18e16552006-02-15 17:27:45 +0000178 UNLESS (PyArg_ParseTuple(args, "|n:read", &n)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000179
Jim Fultone60de4d2000-10-06 19:24:23 +0000180 if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000181
Jim Fultone60de4d2000-10-06 19:24:23 +0000182 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000183}
184
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000185PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");
Guido van Rossum049cd901996-12-05 23:30:48 +0000186
187static int
Jim Fultone60de4d2000-10-06 19:24:23 +0000188IO_creadline(PyObject *self, char **output) {
189 char *n, *s;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000190 Py_ssize_t l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000191
Jim Fultone60de4d2000-10-06 19:24:23 +0000192 UNLESS (IO__opencheck(IOOOBJECT(self))) return -1;
193
194 for (n = ((IOobject*)self)->buf + ((IOobject*)self)->pos,
195 s = ((IOobject*)self)->buf + ((IOobject*)self)->string_size;
196 n < s && *n != '\n'; n++);
197 if (n < s) n++;
198
199 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
200 l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000201 assert(((IOobject*)self)->pos + l < INT_MAX);
202 ((IOobject*)self)->pos += (int)l;
203 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000204}
205
206static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000207IO_readline(IOobject *self, PyObject *args) {
208 int n, m=-1;
209 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000210
Raymond Hettinger352f9472003-04-24 15:50:11 +0000211 if (args)
212 UNLESS (PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000213
214 if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL;
215 if (m >= 0 && m < n) {
216 m = n - m;
217 n -= m;
218 self->pos -= m;
219 }
220 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000221}
222
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000223PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000224
225static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000226IO_readlines(IOobject *self, PyObject *args) {
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000227 int n;
228 char *output;
229 PyObject *result, *line;
230 int hint = 0, length = 0;
231
Jim Fultone60de4d2000-10-06 19:24:23 +0000232 UNLESS (PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL;
233
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000234 result = PyList_New(0);
235 if (!result)
236 return NULL;
237
Jim Fultone60de4d2000-10-06 19:24:23 +0000238 while (1){
239 if ( (n = IO_creadline((PyObject*)self,&output)) < 0)
240 goto err;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000241 if (n == 0)
242 break;
243 line = PyString_FromStringAndSize (output, n);
Jim Fultone60de4d2000-10-06 19:24:23 +0000244 if (!line)
245 goto err;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000246 if (PyList_Append (result, line) == -1) {
247 Py_DECREF (line);
248 goto err;
249 }
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000250 Py_DECREF (line);
251 length += n;
252 if (hint > 0 && length >= hint)
253 break;
254 }
255 return result;
Jim Fultone60de4d2000-10-06 19:24:23 +0000256 err:
257 Py_DECREF(result);
258 return NULL;
259}
260
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000261PyDoc_STRVAR(IO_reset__doc__,
262"reset() -- Reset the file position to the beginning");
Jim Fultone60de4d2000-10-06 19:24:23 +0000263
264static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000265IO_reset(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000266
267 UNLESS (IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000268
269 self->pos = 0;
270
271 Py_INCREF(Py_None);
272 return Py_None;
273}
274
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000275PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000276
277static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000278IO_tell(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000279
280 UNLESS (IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000281
282 return PyInt_FromLong(self->pos);
283}
284
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000285PyDoc_STRVAR(IO_truncate__doc__,
286"truncate(): truncate the file at the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000287
288static PyObject *
289IO_truncate(IOobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000290 Py_ssize_t pos = -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000291
292 UNLESS (IO__opencheck(self)) return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000293 UNLESS (PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000294 if (pos < 0) pos = self->pos;
295
296 if (self->string_size > pos) self->string_size = pos;
Tim Peters037b3ee2004-08-21 06:55:43 +0000297 self->pos = self->string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +0000298
299 Py_INCREF(Py_None);
300 return Py_None;
301}
302
Raymond Hettinger352f9472003-04-24 15:50:11 +0000303static PyObject *
304IO_iternext(Iobject *self)
305{
306 PyObject *next;
307 next = IO_readline((IOobject *)self, NULL);
308 if (!next)
309 return NULL;
310 if (!PyString_GET_SIZE(next)) {
311 Py_DECREF(next);
312 PyErr_SetNone(PyExc_StopIteration);
313 return NULL;
314 }
315 return next;
316}
317
Jim Fultone60de4d2000-10-06 19:24:23 +0000318
319
320
321/* Read-write object methods */
322
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000323PyDoc_STRVAR(O_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000324"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000325"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000326
327static PyObject *
328O_seek(Oobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000329 Py_ssize_t position;
330 int mode = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000331
332 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000333 UNLESS (PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000334 return NULL;
335
336 if (mode == 2) {
337 position += self->string_size;
338 }
339 else if (mode == 1) {
340 position += self->pos;
341 }
342
343 if (position > self->buf_size) {
344 self->buf_size*=2;
345 if (self->buf_size <= position) self->buf_size=position+1;
Tim Peterse7c05322004-06-27 17:24:49 +0000346 UNLESS (self->buf = (char*)
347 realloc(self->buf,self->buf_size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000348 self->buf_size=self->pos=0;
349 return PyErr_NoMemory();
350 }
351 }
352 else if (position < 0) position=0;
353
354 self->pos=position;
355
356 while (--position >= self->string_size) self->buf[position]=0;
357
358 Py_INCREF(Py_None);
359 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000360}
361
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000362PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000363"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000364"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000365
366
367static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000368O_cwrite(PyObject *self, const char *c, Py_ssize_t l) {
369 Py_ssize_t newl;
Guido van Rossum2f098122001-12-07 20:20:28 +0000370 Oobject *oself;
Guido van Rossum55702f81997-01-06 22:57:52 +0000371
Jim Fultone60de4d2000-10-06 19:24:23 +0000372 UNLESS (IO__opencheck(IOOOBJECT(self))) return -1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000373 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000374
Guido van Rossum2f098122001-12-07 20:20:28 +0000375 newl = oself->pos+l;
376 if (newl >= oself->buf_size) {
377 oself->buf_size *= 2;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000378 if (oself->buf_size <= newl) {
379 assert(newl + 1 < INT_MAX);
380 oself->buf_size = (int)(newl+1);
381 }
Guido van Rossum2f098122001-12-07 20:20:28 +0000382 UNLESS (oself->buf =
Tim Peterse7c05322004-06-27 17:24:49 +0000383 (char*)realloc(oself->buf, oself->buf_size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000384 PyErr_SetString(PyExc_MemoryError,"out of memory");
Guido van Rossum2f098122001-12-07 20:20:28 +0000385 oself->buf_size = oself->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000386 return -1;
387 }
388 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000389
Guido van Rossum2f098122001-12-07 20:20:28 +0000390 memcpy(oself->buf+oself->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000391
Martin v. Löwis18e16552006-02-15 17:27:45 +0000392 assert(oself->pos + l < INT_MAX);
393 oself->pos += (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000394
Guido van Rossum2f098122001-12-07 20:20:28 +0000395 if (oself->string_size < oself->pos) {
396 oself->string_size = oself->pos;
397 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000398
Martin v. Löwis18e16552006-02-15 17:27:45 +0000399 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000400}
401
402static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000403O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000404 char *c;
405 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000406
Guido van Rossuma883a3d2002-04-29 13:54:48 +0000407 UNLESS (PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000408
Jim Fultone60de4d2000-10-06 19:24:23 +0000409 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000410
Jim Fultone60de4d2000-10-06 19:24:23 +0000411 Py_INCREF(Py_None);
412 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000413}
414
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000415PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000416
417static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000418O_close(Oobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000419 if (self->buf != NULL) free(self->buf);
420 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000421
Jim Fultone60de4d2000-10-06 19:24:23 +0000422 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000423
Jim Fultone60de4d2000-10-06 19:24:23 +0000424 Py_INCREF(Py_None);
425 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000426}
427
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000428PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000429"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
430"\n"
431"Note that newlines are not added. The sequence can be any iterable object\n"
432"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000433static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000434O_writelines(Oobject *self, PyObject *args) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000435 PyObject *it, *s;
436
437 it = PyObject_GetIter(args);
438 if (it == NULL)
Raymond Hettingerbc72c5a2004-02-27 10:30:49 +0000439 return NULL;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000440 while ((s = PyIter_Next(it)) != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000441 Py_ssize_t n;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000442 char *c;
443 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
444 Py_DECREF(it);
445 Py_DECREF(s);
446 return NULL;
447 }
448 if (O_cwrite((PyObject *)self, c, n) == -1) {
449 Py_DECREF(it);
450 Py_DECREF(s);
451 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000452 }
453 Py_DECREF(s);
454 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000455
Michael W. Hudson10402a32005-09-22 09:19:01 +0000456 Py_DECREF(it);
457
458 /* See if PyIter_Next failed */
459 if (PyErr_Occurred())
460 return NULL;
461
462 Py_RETURN_NONE;
463}
Guido van Rossum049cd901996-12-05 23:30:48 +0000464static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000465 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000466 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000467 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000468 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000469 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
470 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
471 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000472 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
473 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000474 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
475
476 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000477 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000478 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
479 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000480 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000481 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000482};
483
Raymond Hettinger352f9472003-04-24 15:50:11 +0000484static PyMemberDef O_memberlist[] = {
485 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
486 "flag indicating that a space needs to be printed; used by print"},
Raymond Hettinger5475f232003-08-08 12:20:03 +0000487 /* getattr(f, "closed") is implemented without this table */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000488 {NULL} /* Sentinel */
489};
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*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000508 (printfunc)0, /*tp_print*/
509 0, /*tp_getattr */
510 0, /*tp_setattr */
511 (cmpfunc)0, /*tp_compare*/
512 (reprfunc)0, /*tp_repr*/
513 0, /*tp_as_number*/
514 0, /*tp_as_sequence*/
515 0, /*tp_as_mapping*/
516 (hashfunc)0, /*tp_hash*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000517 (ternaryfunc)0, /*tp_call*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000518 (reprfunc)0, /*tp_str*/
519 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 */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000531 O_memberlist, /*tp_members */
532 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;
544 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000545
Tim Peterse7c05322004-06-27 17:24:49 +0000546 UNLESS (self->buf = (char *)malloc(size)) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000547 PyErr_SetString(PyExc_MemoryError,"out of memory");
548 self->buf_size = 0;
549 return NULL;
550 }
551
552 self->buf_size=size;
553 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000554}
555
Skip Montanaroe1388282003-08-11 13:15:11 +0000556/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000557/* -------------------------------------------------------- */
558
559static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000560I_close(Iobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000561 Py_XDECREF(self->pbuf);
562 self->pbuf = NULL;
563 self->buf = NULL;
564
565 self->pos = self->string_size = 0;
566
567 Py_INCREF(Py_None);
568 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000569}
570
571static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000572I_seek(Iobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000573 Py_ssize_t position;
574 int mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000575
Jim Fultone60de4d2000-10-06 19:24:23 +0000576 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000577 UNLESS (PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000578 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000579
Jim Fultone60de4d2000-10-06 19:24:23 +0000580 if (mode == 2) position += self->string_size;
581 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000582
Jim Fultone60de4d2000-10-06 19:24:23 +0000583 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000584
Jim Fultone60de4d2000-10-06 19:24:23 +0000585 self->pos=position;
586
587 Py_INCREF(Py_None);
588 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000589}
590
591static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000592 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000593 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000594 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000595 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000596 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
597 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
598 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000599 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
600 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000601 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
602
603 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000604 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000605 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000606 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000607};
608
Guido van Rossum049cd901996-12-05 23:30:48 +0000609static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000610I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000611 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000612 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000613}
614
Barry Warsaw3e8be722001-09-22 04:36:49 +0000615
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000616PyDoc_STRVAR(Itype__doc__,
617"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000618
619static PyTypeObject Itype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000620 PyObject_HEAD_INIT(NULL)
Barry Warsaw3e8be722001-09-22 04:36:49 +0000621 0, /*ob_size*/
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000622 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000623 sizeof(Iobject), /*tp_basicsize*/
624 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000625 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000626 (destructor)I_dealloc, /*tp_dealloc*/
627 (printfunc)0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000628 0, /* tp_getattr */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000629 (setattrfunc)0, /*tp_setattr*/
630 (cmpfunc)0, /*tp_compare*/
631 (reprfunc)0, /*tp_repr*/
632 0, /*tp_as_number*/
633 0, /*tp_as_sequence*/
634 0, /*tp_as_mapping*/
635 (hashfunc)0, /*tp_hash*/
636 (ternaryfunc)0, /*tp_call*/
637 (reprfunc)0, /*tp_str*/
638 0, /* tp_getattro */
639 0, /* tp_setattro */
640 0, /* tp_as_buffer */
641 Py_TPFLAGS_DEFAULT, /* tp_flags */
642 Itype__doc__, /* tp_doc */
643 0, /* tp_traverse */
644 0, /* tp_clear */
645 0, /* tp_richcompare */
646 0, /* tp_weaklistoffset */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000647 PyObject_SelfIter, /* tp_iter */
648 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000649 I_methods, /* tp_methods */
650 0, /* tp_members */
651 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000652};
653
Guido van Rossum142eeb81997-08-13 03:14:41 +0000654static PyObject *
655newIobject(PyObject *s) {
656 Iobject *self;
657 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000658 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000659
Marc-André Lemburge47df7a2001-09-24 17:34:52 +0000660 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
661 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000662 s->ob_type->tp_name);
663 return NULL;
664 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000665 UNLESS (self = PyObject_New(Iobject, &Itype)) 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}