blob: ddf369901a57a602f0e0280e7f8943299290f8ec [file] [log] [blame]
Guido van Rossum049cd901996-12-05 23:30:48 +00001/*
Guido van Rossum17d53ec1999-06-15 14:35:48 +00002 * cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp
Guido van Rossum7d9b4131998-11-25 16:17:32 +00003 *
4 * Copyright (c) 1996-1998, Digital Creations, Fredericksburg, VA, USA.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 *
11 * o Redistributions of source code must retain the above copyright
12 * notice, this list of conditions, and the disclaimer that follows.
13 *
14 * o Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions, and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
18 *
19 * o All advertising materials mentioning features or use of this
20 * software must display the following acknowledgement:
21 *
22 * This product includes software developed by Digital Creations
23 * and its contributors.
24 *
25 * o Neither the name of Digital Creations nor the names of its
26 * contributors may be used to endorse or promote products derived
27 * from this software without specific prior written permission.
28 *
29 *
30 * THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS AND CONTRIBUTORS *AS
31 * IS* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
32 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
33 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL
34 * CREATIONS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
35 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
36 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
37 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
38 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
39 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
40 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
41 * DAMAGE.
42 *
43 #
44 # If you have questions regarding this software, contact:
45 #
46 # Digital Creations, L.C.
47 # 910 Princess Ann Street
48 # Fredericksburge, Virginia 22401
49 #
50 # info@digicool.com
51 #
52 # (540) 371-6909
53 */
Guido van Rossum049cd901996-12-05 23:30:48 +000054static char cStringIO_module_documentation[] =
55"A simple fast partial StringIO replacement.\n"
56"\n"
57"This module provides a simple useful replacement for\n"
58"the StringIO module that is written in C. It does not provide the\n"
Fred Drakeaef10002000-06-19 13:17:41 +000059"full generality of StringIO, but it provides enough for most\n"
Thomas Wouters7e474022000-07-16 12:04:32 +000060"applications and is especially useful in conjunction with the\n"
Guido van Rossum049cd901996-12-05 23:30:48 +000061"pickle module.\n"
62"\n"
63"Usage:\n"
64"\n"
65" from cStringIO import StringIO\n"
66"\n"
67" an_output_stream=StringIO()\n"
68" an_output_stream.write(some_stuff)\n"
69" ...\n"
70" value=an_output_stream.getvalue() # str(an_output_stream) works too!\n"
71"\n"
72" an_input_stream=StringIO(a_string)\n"
73" spam=an_input_stream.readline()\n"
74" spam=an_input_stream.read(5)\n"
Guido van Rossum7d9b4131998-11-25 16:17:32 +000075" an_input_stream.seek(0) # OK, start over\n"
Guido van Rossum049cd901996-12-05 23:30:48 +000076" spam=an_input_stream.read() # and read it all\n"
77" \n"
78"If someone else wants to provide a more complete implementation,\n"
79"go for it. :-) \n"
Guido van Rossum142eeb81997-08-13 03:14:41 +000080"\n"
Guido van Rossum17d53ec1999-06-15 14:35:48 +000081"cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n"
Guido van Rossum049cd901996-12-05 23:30:48 +000082;
83
84#include "Python.h"
85#include "import.h"
Guido van Rossum154417e1997-04-09 17:35:33 +000086#include "cStringIO.h"
Guido van Rossum049cd901996-12-05 23:30:48 +000087
Jim Fultone60de4d2000-10-06 19:24:23 +000088#define UNLESS(E) if (!(E))
Guido van Rossum049cd901996-12-05 23:30:48 +000089
Guido van Rossum049cd901996-12-05 23:30:48 +000090
Jim Fultone60de4d2000-10-06 19:24:23 +000091/* Declaration for file-like objects that manage data as strings
Guido van Rossum049cd901996-12-05 23:30:48 +000092
Jim Fultone60de4d2000-10-06 19:24:23 +000093 The IOobject type should be though of as a common base type for
94 Iobjects, which provide input (read-only) StringIO objects and
95 Oobjects, which provide read-write objects. Most of the methods
96 depend only on common data.
97*/
Guido van Rossum049cd901996-12-05 23:30:48 +000098
99typedef struct {
100 PyObject_HEAD
101 char *buf;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000102 int pos, string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +0000103} IOobject;
104
105#define IOOOBJECT(O) ((IOobject*)(O))
106
107/* Declarations for objects of type StringO */
108
109typedef struct { /* Subtype of IOobject */
110 PyObject_HEAD
111 char *buf;
112 int pos, string_size;
113
114 int buf_size, softspace;
115} Oobject;
116
117/* Declarations for objects of type StringI */
118
119typedef struct { /* Subtype of IOobject */
120 PyObject_HEAD
121 char *buf;
122 int pos, string_size;
123
Guido van Rossum049cd901996-12-05 23:30:48 +0000124 PyObject *pbuf;
125} Iobject;
126
Jim Fultone60de4d2000-10-06 19:24:23 +0000127/* IOobject (common) methods */
128
129static char IO_flush__doc__[] = "flush(): does nothing.";
130
131static int
132IO__opencheck(IOobject *self) {
133 UNLESS (self->buf) {
134 PyErr_SetString(PyExc_ValueError,
135 "I/O operation on closed file");
136 return 0;
137 }
138 return 1;
139}
140
141static PyObject *
142IO_flush(IOobject *self, PyObject *args) {
143
144 UNLESS (IO__opencheck(self)) return NULL;
145 UNLESS (PyArg_ParseTuple(args, ":flush")) return NULL;
146
147 Py_INCREF(Py_None);
148 return Py_None;
149}
150
151static char IO_getval__doc__[] =
152 "getvalue([use_pos]) -- Get the string value."
153 "\n"
154 "If use_pos is specified and is a true value, then the string returned\n"
155 "will include only the text up to the current file position.\n"
Guido van Rossum049cd901996-12-05 23:30:48 +0000156;
157
158static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000159IO_cgetval(PyObject *self) {
160 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
161 return PyString_FromStringAndSize(((IOobject*)self)->buf,
162 ((IOobject*)self)->pos);
Guido van Rossum049cd901996-12-05 23:30:48 +0000163}
164
Guido van Rossum049cd901996-12-05 23:30:48 +0000165static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000166IO_getval(IOobject *self, PyObject *args) {
167 PyObject *use_pos=Py_None;
168 int s;
169
170 UNLESS (IO__opencheck(self)) return NULL;
171 UNLESS (PyArg_ParseTuple(args,"|O:getval",&use_pos)) return NULL;
172
173 if (PyObject_IsTrue(use_pos)) {
174 s=self->pos;
175 if (s > self->string_size) s=self->string_size;
176 }
177 else
178 s=self->string_size;
179 return PyString_FromStringAndSize(self->buf, s);
Guido van Rossum049cd901996-12-05 23:30:48 +0000180}
181
Jim Fultone60de4d2000-10-06 19:24:23 +0000182static char IO_isatty__doc__[] = "isatty(): always returns 0";
Guido van Rossum049cd901996-12-05 23:30:48 +0000183
184static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000185IO_isatty(IOobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000186
Jim Fultone60de4d2000-10-06 19:24:23 +0000187 UNLESS (PyArg_ParseTuple(args, ":isatty")) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000188
Jim Fultone60de4d2000-10-06 19:24:23 +0000189 return PyInt_FromLong(0);
Guido van Rossum049cd901996-12-05 23:30:48 +0000190}
191
Jim Fultone60de4d2000-10-06 19:24:23 +0000192static char IO_read__doc__[] =
Guido van Rossum049cd901996-12-05 23:30:48 +0000193"read([s]) -- Read s characters, or the rest of the string"
194;
195
196static int
Jim Fultone60de4d2000-10-06 19:24:23 +0000197IO_cread(PyObject *self, char **output, int n) {
198 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000199
Jim Fultone60de4d2000-10-06 19:24:23 +0000200 UNLESS (IO__opencheck(IOOOBJECT(self))) return -1;
201 l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos;
202 if (n < 0 || n > l) {
203 n = l;
204 if (n < 0) n=0;
205 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000206
Jim Fultone60de4d2000-10-06 19:24:23 +0000207 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
208 ((IOobject*)self)->pos += n;
209 return n;
Guido van Rossum049cd901996-12-05 23:30:48 +0000210}
211
212static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000213IO_read(IOobject *self, PyObject *args) {
214 int n = -1;
215 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000216
Jim Fultone60de4d2000-10-06 19:24:23 +0000217 UNLESS (PyArg_ParseTuple(args, "|i:read", &n)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000218
Jim Fultone60de4d2000-10-06 19:24:23 +0000219 if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000220
Jim Fultone60de4d2000-10-06 19:24:23 +0000221 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000222}
223
Jim Fultone60de4d2000-10-06 19:24:23 +0000224static char IO_readline__doc__[] =
Guido van Rossum049cd901996-12-05 23:30:48 +0000225"readline() -- Read one line"
226;
227
228static int
Jim Fultone60de4d2000-10-06 19:24:23 +0000229IO_creadline(PyObject *self, char **output) {
230 char *n, *s;
231 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000232
Jim Fultone60de4d2000-10-06 19:24:23 +0000233 UNLESS (IO__opencheck(IOOOBJECT(self))) return -1;
234
235 for (n = ((IOobject*)self)->buf + ((IOobject*)self)->pos,
236 s = ((IOobject*)self)->buf + ((IOobject*)self)->string_size;
237 n < s && *n != '\n'; n++);
238 if (n < s) n++;
239
240 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
241 l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos;
242 ((IOobject*)self)->pos += l;
243 return l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000244}
245
246static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000247IO_readline(IOobject *self, PyObject *args) {
248 int n, m=-1;
249 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000250
Jim Fultone60de4d2000-10-06 19:24:23 +0000251 UNLESS (PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;
252
253 if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL;
254 if (m >= 0 && m < n) {
255 m = n - m;
256 n -= m;
257 self->pos -= m;
258 }
259 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000260}
261
Jim Fultone60de4d2000-10-06 19:24:23 +0000262static char IO_readlines__doc__[] =
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000263"readlines() -- Read all lines"
264;
265
266static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000267IO_readlines(IOobject *self, PyObject *args) {
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000268 int n;
269 char *output;
270 PyObject *result, *line;
271 int hint = 0, length = 0;
272
Jim Fultone60de4d2000-10-06 19:24:23 +0000273 UNLESS (PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL;
274
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000275 result = PyList_New(0);
276 if (!result)
277 return NULL;
278
Jim Fultone60de4d2000-10-06 19:24:23 +0000279 while (1){
280 if ( (n = IO_creadline((PyObject*)self,&output)) < 0)
281 goto err;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000282 if (n == 0)
283 break;
284 line = PyString_FromStringAndSize (output, n);
Jim Fultone60de4d2000-10-06 19:24:23 +0000285 if (!line)
286 goto err;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000287 PyList_Append (result, line);
288 Py_DECREF (line);
289 length += n;
290 if (hint > 0 && length >= hint)
291 break;
292 }
293 return result;
Jim Fultone60de4d2000-10-06 19:24:23 +0000294 err:
295 Py_DECREF(result);
296 return NULL;
297}
298
299static char IO_reset__doc__[] =
300"reset() -- Reset the file position to the beginning"
301;
302
303static PyObject *
304IO_reset(IOobject *self, PyObject *args) {
305
306 UNLESS (IO__opencheck(self)) return NULL;
307 UNLESS (PyArg_ParseTuple(args, ":reset")) return NULL;
308
309 self->pos = 0;
310
311 Py_INCREF(Py_None);
312 return Py_None;
313}
314
315static char IO_tell__doc__[] =
316"tell() -- get the current position.";
317
318static PyObject *
319IO_tell(IOobject *self, PyObject *args) {
320
321 UNLESS (IO__opencheck(self)) return NULL;
322 UNLESS (PyArg_ParseTuple(args, ":tell")) return NULL;
323
324 return PyInt_FromLong(self->pos);
325}
326
327static char IO_truncate__doc__[] =
328"truncate(): truncate the file at the current position.";
329
330static PyObject *
331IO_truncate(IOobject *self, PyObject *args) {
332 int pos = -1;
333
334 UNLESS (IO__opencheck(self)) return NULL;
335 UNLESS (PyArg_ParseTuple(args, "|i:truncate", &pos)) return NULL;
336 if (pos < 0) pos = self->pos;
337
338 if (self->string_size > pos) self->string_size = pos;
339
340 Py_INCREF(Py_None);
341 return Py_None;
342}
343
344
345
346
347/* Read-write object methods */
348
349static char O_seek__doc__[] =
350"seek(position) -- set the current position\n"
351"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF";
352
353static PyObject *
354O_seek(Oobject *self, PyObject *args) {
355 int position, mode = 0;
356
357 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
358 UNLESS (PyArg_ParseTuple(args, "i|i:seek", &position, &mode))
359 return NULL;
360
361 if (mode == 2) {
362 position += self->string_size;
363 }
364 else if (mode == 1) {
365 position += self->pos;
366 }
367
368 if (position > self->buf_size) {
369 self->buf_size*=2;
370 if (self->buf_size <= position) self->buf_size=position+1;
371 UNLESS (self->buf=(char*)
372 realloc(self->buf,self->buf_size*sizeof(char))) {
373 self->buf_size=self->pos=0;
374 return PyErr_NoMemory();
375 }
376 }
377 else if (position < 0) position=0;
378
379 self->pos=position;
380
381 while (--position >= self->string_size) self->buf[position]=0;
382
383 Py_INCREF(Py_None);
384 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000385}
386
Guido van Rossum049cd901996-12-05 23:30:48 +0000387static char O_write__doc__[] =
388"write(s) -- Write a string to the file"
389"\n\nNote (hack:) writing None resets the buffer"
390;
391
392
393static int
Guido van Rossum154417e1997-04-09 17:35:33 +0000394O_cwrite(PyObject *self, char *c, int l) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000395 int newl;
Guido van Rossum55702f81997-01-06 22:57:52 +0000396
Jim Fultone60de4d2000-10-06 19:24:23 +0000397 UNLESS (IO__opencheck(IOOOBJECT(self))) return -1;
Guido van Rossum049cd901996-12-05 23:30:48 +0000398
Jim Fultone60de4d2000-10-06 19:24:23 +0000399 newl=((Oobject*)self)->pos+l;
400 if (newl >= ((Oobject*)self)->buf_size) {
401 ((Oobject*)self)->buf_size*=2;
402 if (((Oobject*)self)->buf_size <= newl)
403 ((Oobject*)self)->buf_size=newl+1;
404 UNLESS (((Oobject*)self)->buf=
405 (char*)realloc(
406 ((Oobject*)self)->buf,
407 (((Oobject*)self)->buf_size) *sizeof(char))) {
408 PyErr_SetString(PyExc_MemoryError,"out of memory");
409 ((Oobject*)self)->buf_size=((Oobject*)self)->pos=0;
410 return -1;
411 }
412 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000413
Jim Fultone60de4d2000-10-06 19:24:23 +0000414 memcpy(((Oobject*)((Oobject*)self))->buf+((Oobject*)self)->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000415
Jim Fultone60de4d2000-10-06 19:24:23 +0000416 ((Oobject*)self)->pos += l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000417
Jim Fultone60de4d2000-10-06 19:24:23 +0000418 if (((Oobject*)self)->string_size < ((Oobject*)self)->pos) {
419 ((Oobject*)self)->string_size = ((Oobject*)self)->pos;
420 }
421
422 return l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000423}
424
425static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000426O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000427 PyObject *s;
428 char *c;
429 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000430
Jim Fultone60de4d2000-10-06 19:24:23 +0000431 UNLESS (PyArg_ParseTuple(args, "O:write", &s)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000432
Jim Fultone60de4d2000-10-06 19:24:23 +0000433 UNLESS (-1 != (l=PyString_Size(s))) return NULL;
434 UNLESS (c=PyString_AsString(s)) return NULL;
435 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000436
Jim Fultone60de4d2000-10-06 19:24:23 +0000437 Py_INCREF(Py_None);
438 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000439}
440
441static char O_close__doc__[] = "close(): explicitly release resources held.";
442
443static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000444O_close(Oobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000445
Jim Fultone60de4d2000-10-06 19:24:23 +0000446 UNLESS (PyArg_ParseTuple(args, ":close")) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000447
Jim Fultone60de4d2000-10-06 19:24:23 +0000448 if (self->buf != NULL) free(self->buf);
449 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000450
Jim Fultone60de4d2000-10-06 19:24:23 +0000451 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000452
Jim Fultone60de4d2000-10-06 19:24:23 +0000453 Py_INCREF(Py_None);
454 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000455}
456
457
Guido van Rossum68de0641999-02-08 17:03:27 +0000458static char O_writelines__doc__[] =
459"writelines(sequence_of_strings): write each string";
Guido van Rossum049cd901996-12-05 23:30:48 +0000460static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000461O_writelines(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000462 PyObject *tmp = 0;
Jeremy Hyltoncafd4952001-02-09 23:44:22 +0000463 static PyObject *joiner = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000464
Jim Fultone60de4d2000-10-06 19:24:23 +0000465 UNLESS (PyArg_ParseTuple(args, "O:writelines", &args)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000466
Jeremy Hyltoncafd4952001-02-09 23:44:22 +0000467 if (!joiner) {
468 PyObject *empty_string = PyString_FromString("");
469 if (empty_string == NULL)
470 return NULL;
471 joiner = PyObject_GetAttrString(empty_string, "join");
472 Py_DECREF(empty_string);
473 if (joiner == NULL)
474 return NULL;
475 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000476
Jim Fultone60de4d2000-10-06 19:24:23 +0000477 if (PyObject_Size(args) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000478
Jeremy Hyltoncafd4952001-02-09 23:44:22 +0000479 tmp = PyObject_CallFunction(joiner, "O", args);
Jim Fultone60de4d2000-10-06 19:24:23 +0000480 UNLESS (tmp) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000481
Jim Fultone60de4d2000-10-06 19:24:23 +0000482 args = Py_BuildValue("(O)", tmp);
483 Py_DECREF(tmp);
484 UNLESS (args) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000485
Jim Fultone60de4d2000-10-06 19:24:23 +0000486 tmp = O_write(self, args);
487 Py_DECREF(args);
488 return tmp;
Guido van Rossum049cd901996-12-05 23:30:48 +0000489}
490
491static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000492 /* Common methods: */
493 {"flush", (PyCFunction)IO_flush, METH_VARARGS, IO_flush__doc__},
494 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
495 {"isatty", (PyCFunction)IO_isatty, METH_VARARGS, IO_isatty__doc__},
496 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
497 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
498 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
499 {"reset", (PyCFunction)IO_reset, METH_VARARGS, IO_reset__doc__},
500 {"tell", (PyCFunction)IO_tell, METH_VARARGS, IO_tell__doc__},
501 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
502
503 /* Read-write StringIO specific methods: */
Guido van Rossum476e49f1998-12-15 21:43:15 +0000504 {"close", (PyCFunction)O_close, METH_VARARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000505 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
506 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000507 {"writelines", (PyCFunction)O_writelines, METH_VARARGS, O_writelines__doc__},
508 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000509};
510
Guido van Rossum049cd901996-12-05 23:30:48 +0000511static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000512O_dealloc(Oobject *self) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000513 if (self->buf != NULL)
514 free(self->buf);
515 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000516}
517
518static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000519O_getattr(Oobject *self, char *name) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000520 if (strcmp(name, "softspace") == 0) {
521 return PyInt_FromLong(self->softspace);
522 }
523 return Py_FindMethod(O_methods, (PyObject *)self, name);
Guido van Rossum049cd901996-12-05 23:30:48 +0000524}
525
Guido van Rossum3dc35b01997-04-11 19:56:06 +0000526static int
527O_setattr(Oobject *self, char *name, PyObject *value) {
528 long x;
529 if (strcmp(name, "softspace") != 0) {
530 PyErr_SetString(PyExc_AttributeError, name);
531 return -1;
532 }
533 x = PyInt_AsLong(value);
Jim Fultone60de4d2000-10-06 19:24:23 +0000534 if (x < 0 && PyErr_Occurred())
Guido van Rossum3dc35b01997-04-11 19:56:06 +0000535 return -1;
536 self->softspace = x;
537 return 0;
538}
539
Guido van Rossum049cd901996-12-05 23:30:48 +0000540static char Otype__doc__[] =
541"Simple type for output to strings."
542;
543
544static PyTypeObject Otype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000545 PyObject_HEAD_INIT(NULL)
546 0, /*ob_size*/
547 "StringO", /*tp_name*/
548 sizeof(Oobject), /*tp_basicsize*/
549 0, /*tp_itemsize*/
550 /* methods */
551 (destructor)O_dealloc, /*tp_dealloc*/
552 (printfunc)0, /*tp_print*/
553 (getattrfunc)O_getattr, /*tp_getattr*/
Guido van Rossum3dc35b01997-04-11 19:56:06 +0000554 (setattrfunc)O_setattr, /*tp_setattr*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000555 (cmpfunc)0, /*tp_compare*/
556 (reprfunc)0, /*tp_repr*/
557 0, /*tp_as_number*/
558 0, /*tp_as_sequence*/
559 0, /*tp_as_mapping*/
560 (hashfunc)0, /*tp_hash*/
561 (ternaryfunc)0, /*tp_call*/
562 (reprfunc)0, /*tp_str*/
563
564 /* Space for future expansion */
565 0L,0L,0L,0L,
566 Otype__doc__ /* Documentation string */
Guido van Rossum049cd901996-12-05 23:30:48 +0000567};
568
Guido van Rossum142eeb81997-08-13 03:14:41 +0000569static PyObject *
570newOobject(int size) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000571 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000572
Jim Fultone60de4d2000-10-06 19:24:23 +0000573 self = PyObject_New(Oobject, &Otype);
574 if (self == NULL)
575 return NULL;
576 self->pos=0;
577 self->string_size = 0;
578 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000579
Jim Fultone60de4d2000-10-06 19:24:23 +0000580 UNLESS (self->buf=malloc(size*sizeof(char))) {
581 PyErr_SetString(PyExc_MemoryError,"out of memory");
582 self->buf_size = 0;
583 return NULL;
584 }
585
586 self->buf_size=size;
587 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000588}
589
Guido van Rossum049cd901996-12-05 23:30:48 +0000590/* End of code for StringO objects */
591/* -------------------------------------------------------- */
592
593static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000594I_close(Iobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000595
Jim Fultone60de4d2000-10-06 19:24:23 +0000596 UNLESS (PyArg_ParseTuple(args, ":close")) return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000597
Jim Fultone60de4d2000-10-06 19:24:23 +0000598 Py_XDECREF(self->pbuf);
599 self->pbuf = NULL;
600 self->buf = NULL;
601
602 self->pos = self->string_size = 0;
603
604 Py_INCREF(Py_None);
605 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000606}
607
608static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000609I_seek(Iobject *self, PyObject *args) {
610 int position, mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000611
Jim Fultone60de4d2000-10-06 19:24:23 +0000612 UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL;
613 UNLESS (PyArg_ParseTuple(args, "i|i:seek", &position, &mode))
614 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000615
Jim Fultone60de4d2000-10-06 19:24:23 +0000616 if (mode == 2) position += self->string_size;
617 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000618
Jim Fultone60de4d2000-10-06 19:24:23 +0000619 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000620
Jim Fultone60de4d2000-10-06 19:24:23 +0000621 self->pos=position;
622
623 Py_INCREF(Py_None);
624 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000625}
626
627static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000628 /* Common methods: */
629 {"flush", (PyCFunction)IO_flush, METH_VARARGS, IO_flush__doc__},
630 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
631 {"isatty", (PyCFunction)IO_isatty, METH_VARARGS, IO_isatty__doc__},
632 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
633 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
634 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
635 {"reset", (PyCFunction)IO_reset, METH_VARARGS, IO_reset__doc__},
636 {"tell", (PyCFunction)IO_tell, METH_VARARGS, IO_tell__doc__},
637 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
638
639 /* Read-only StringIO specific methods: */
Guido van Rossum476e49f1998-12-15 21:43:15 +0000640 {"close", (PyCFunction)I_close, METH_VARARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000641 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000642 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000643};
644
Guido van Rossum049cd901996-12-05 23:30:48 +0000645static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000646I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000647 Py_XDECREF(self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000648 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000649}
650
651static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000652I_getattr(Iobject *self, char *name) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000653 return Py_FindMethod(I_methods, (PyObject *)self, name);
654}
655
656static char Itype__doc__[] =
657"Simple type for treating strings as input file streams"
658;
659
660static PyTypeObject Itype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000661 PyObject_HEAD_INIT(NULL)
662 0, /*ob_size*/
663 "StringI", /*tp_name*/
664 sizeof(Iobject), /*tp_basicsize*/
665 0, /*tp_itemsize*/
666 /* methods */
667 (destructor)I_dealloc, /*tp_dealloc*/
668 (printfunc)0, /*tp_print*/
669 (getattrfunc)I_getattr, /*tp_getattr*/
670 (setattrfunc)0, /*tp_setattr*/
671 (cmpfunc)0, /*tp_compare*/
672 (reprfunc)0, /*tp_repr*/
673 0, /*tp_as_number*/
674 0, /*tp_as_sequence*/
675 0, /*tp_as_mapping*/
676 (hashfunc)0, /*tp_hash*/
677 (ternaryfunc)0, /*tp_call*/
678 (reprfunc)0, /*tp_str*/
679
680 /* Space for future expansion */
681 0L,0L,0L,0L,
682 Itype__doc__ /* Documentation string */
Guido van Rossum049cd901996-12-05 23:30:48 +0000683};
684
Guido van Rossum142eeb81997-08-13 03:14:41 +0000685static PyObject *
686newIobject(PyObject *s) {
687 Iobject *self;
688 char *buf;
689 int size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000690
691 if (!PyString_Check(s)) {
692 PyErr_Format(PyExc_TypeError, "expected string, %.200s found",
693 s->ob_type->tp_name);
694 return NULL;
695 }
696 buf = PyString_AS_STRING(s);
697 size = PyString_GET_SIZE(s);
Jim Fultone60de4d2000-10-06 19:24:23 +0000698 UNLESS (self = PyObject_New(Iobject, &Itype)) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000699 Py_INCREF(s);
700 self->buf=buf;
701 self->string_size=size;
702 self->pbuf=s;
703 self->pos=0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000704
705 return (PyObject*)self;
706}
707
Guido van Rossum049cd901996-12-05 23:30:48 +0000708/* End of code for StringI objects */
709/* -------------------------------------------------------- */
710
711
712static char IO_StringIO__doc__[] =
713"StringIO([s]) -- Return a StringIO-like stream for reading or writing"
714;
715
716static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000717IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000718 PyObject *s=0;
719
Jim Fultone60de4d2000-10-06 19:24:23 +0000720 if (!PyArg_ParseTuple(args, "|O:StringIO", &s)) return NULL;
721
722 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000723 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000724}
725
726/* List of methods defined in the module */
727
728static struct PyMethodDef IO_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000729 {"StringIO", (PyCFunction)IO_StringIO,
730 METH_VARARGS, IO_StringIO__doc__},
Guido van Rossum55702f81997-01-06 22:57:52 +0000731 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000732};
733
734
735/* Initialization function for the module (*must* be called initcStringIO) */
736
Guido van Rossum154417e1997-04-09 17:35:33 +0000737static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000738 IO_cread,
739 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000740 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000741 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000742 newOobject,
743 newIobject,
744 &Itype,
745 &Otype,
746};
747
Guido van Rossum476e49f1998-12-15 21:43:15 +0000748#ifndef DL_EXPORT /* declarations for DLL import/export */
749#define DL_EXPORT(RTYPE) RTYPE
750#endif
Guido van Rossum3886bb61998-12-04 18:50:17 +0000751DL_EXPORT(void)
Thomas Wouters58d05102000-07-24 14:43:35 +0000752initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000753 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000754
Guido van Rossum154417e1997-04-09 17:35:33 +0000755
Guido van Rossum049cd901996-12-05 23:30:48 +0000756 /* Create the module and add the functions */
757 m = Py_InitModule4("cStringIO", IO_methods,
758 cStringIO_module_documentation,
759 (PyObject*)NULL,PYTHON_API_VERSION);
760
761 /* Add some symbolic constants to the module */
762 d = PyModule_GetDict(m);
Guido van Rossum049cd901996-12-05 23:30:48 +0000763
Guido van Rossum55702f81997-01-06 22:57:52 +0000764 /* Export C API */
Guido van Rossum154417e1997-04-09 17:35:33 +0000765 Itype.ob_type=&PyType_Type;
766 Otype.ob_type=&PyType_Type;
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000767 PyDict_SetItemString(d,"cStringIO_CAPI",
768 v = PyCObject_FromVoidPtr(&CAPI,NULL));
769 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000770
771 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000772 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
773 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000774
775 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000776 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000777}