blob: 5b78789d5af903b9b8aceb62bdd20667ef6a8254 [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
Antoine Pitrouc83ea132010-05-09 14:46:46 +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;
Kristján Valur Jónsson9795ca42013-03-19 17:17:47 -070069 Py_buffer pbuf;
Guido van Rossum049cd901996-12-05 23:30:48 +000070} Iobject;
71
Jim Fultone60de4d2000-10-06 19:24:23 +000072/* IOobject (common) methods */
73
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000074PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing.");
Jim Fultone60de4d2000-10-06 19:24:23 +000075
76static int
77IO__opencheck(IOobject *self) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000078 if (!self->buf) {
79 PyErr_SetString(PyExc_ValueError,
80 "I/O operation on closed file");
81 return 0;
82 }
83 return 1;
Jim Fultone60de4d2000-10-06 19:24:23 +000084}
85
86static PyObject *
Raymond Hettinger5475f232003-08-08 12:20:03 +000087IO_get_closed(IOobject *self, void *closure)
88{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000089 PyObject *result = Py_False;
Raymond Hettinger5475f232003-08-08 12:20:03 +000090
Antoine Pitrouc83ea132010-05-09 14:46:46 +000091 if (self->buf == NULL)
92 result = Py_True;
93 Py_INCREF(result);
94 return result;
Raymond Hettinger5475f232003-08-08 12:20:03 +000095}
96
97static PyGetSetDef file_getsetlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000098 {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"},
99 {0},
Raymond Hettinger5475f232003-08-08 12:20:03 +0000100};
101
102static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000103IO_flush(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000104
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000105 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000106
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000107 Py_INCREF(Py_None);
108 return Py_None;
Jim Fultone60de4d2000-10-06 19:24:23 +0000109}
110
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000111PyDoc_STRVAR(IO_getval__doc__,
112"getvalue([use_pos]) -- Get the string value."
113"\n"
114"If use_pos is specified and is a true value, then the string returned\n"
115"will include only the text up to the current file position.\n");
Guido van Rossum049cd901996-12-05 23:30:48 +0000116
117static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000118IO_cgetval(PyObject *self) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000119 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
120 assert(IOOOBJECT(self)->pos >= 0);
121 return PyString_FromStringAndSize(((IOobject*)self)->buf,
122 ((IOobject*)self)->pos);
Guido van Rossum049cd901996-12-05 23:30:48 +0000123}
124
Guido van Rossum049cd901996-12-05 23:30:48 +0000125static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000126IO_getval(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000127 PyObject *use_pos=Py_None;
Antoine Pitrouc5bef752012-08-15 23:16:51 +0200128 int b;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000129 Py_ssize_t s;
Jim Fultone60de4d2000-10-06 19:24:23 +0000130
Antoine Pitrouc83ea132010-05-09 14:46:46 +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
Antoine Pitrouc5bef752012-08-15 23:16:51 +0200134 b = PyObject_IsTrue(use_pos);
135 if (b < 0)
136 return NULL;
137 if (b) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000138 s=self->pos;
139 if (s > self->string_size) s=self->string_size;
140 }
141 else
142 s=self->string_size;
143 assert(self->pos >= 0);
144 return PyString_FromStringAndSize(self->buf, s);
Guido van Rossum049cd901996-12-05 23:30:48 +0000145}
146
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000147PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0");
Guido van Rossum049cd901996-12-05 23:30:48 +0000148
149static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000150IO_isatty(IOobject *self, PyObject *unused) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000151 if (!IO__opencheck(self)) return NULL;
152 Py_INCREF(Py_False);
153 return Py_False;
Guido van Rossum049cd901996-12-05 23:30:48 +0000154}
155
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000156PyDoc_STRVAR(IO_read__doc__,
157"read([s]) -- Read s characters, or the rest of the string");
Guido van Rossum049cd901996-12-05 23:30:48 +0000158
159static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000160IO_cread(PyObject *self, char **output, Py_ssize_t n) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000161 Py_ssize_t l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000162
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000163 if (!IO__opencheck(IOOOBJECT(self))) return -1;
164 assert(IOOOBJECT(self)->pos >= 0);
165 assert(IOOOBJECT(self)->string_size >= 0);
166 l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos;
167 if (n < 0 || n > l) {
168 n = l;
169 if (n < 0) n=0;
170 }
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200171 if (n > INT_MAX) {
172 PyErr_SetString(PyExc_OverflowError,
173 "length too large");
174 return -1;
175 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000176
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000177 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
178 ((IOobject*)self)->pos += n;
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200179 return (int)n;
Guido van Rossum049cd901996-12-05 23:30:48 +0000180}
181
182static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000183IO_read(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000184 Py_ssize_t n = -1;
185 char *output = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000186
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000187 if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000188
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000189 if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000190
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000191 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000192}
193
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000194PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");
Guido van Rossum049cd901996-12-05 23:30:48 +0000195
196static int
Jim Fultone60de4d2000-10-06 19:24:23 +0000197IO_creadline(PyObject *self, char **output) {
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200198 char *n, *start, *end;
199 Py_ssize_t len;
Guido van Rossum049cd901996-12-05 23:30:48 +0000200
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000201 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000202
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200203 n = start = ((IOobject*)self)->buf + ((IOobject*)self)->pos;
204 end = ((IOobject*)self)->buf + ((IOobject*)self)->string_size;
205 while (n < end && *n != '\n')
206 n++;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000207
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200208 if (n < end) n++;
Jim Fultone60de4d2000-10-06 19:24:23 +0000209
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200210 len = n - start;
Serhiy Storchakacdc7a912013-02-12 21:36:47 +0200211 if (len > INT_MAX)
212 len = INT_MAX;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000213
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200214 *output=start;
215
216 assert(IOOOBJECT(self)->pos <= PY_SSIZE_T_MAX - len);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000217 assert(IOOOBJECT(self)->pos >= 0);
218 assert(IOOOBJECT(self)->string_size >= 0);
Gregory P. Smith9d534572008-06-11 07:41:16 +0000219
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200220 ((IOobject*)self)->pos += len;
221 return (int)len;
Guido van Rossum049cd901996-12-05 23:30:48 +0000222}
223
224static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000225IO_readline(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000226 int n, m=-1;
227 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000228
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000229 if (args)
230 if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000231
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000232 if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL;
233 if (m >= 0 && m < n) {
234 m = n - m;
235 n -= m;
236 self->pos -= m;
237 }
238 assert(IOOOBJECT(self)->pos >= 0);
239 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000240}
241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000242PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000243
244static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000245IO_readlines(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000246 int n;
247 char *output;
248 PyObject *result, *line;
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200249 Py_ssize_t hint = 0, length = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000250
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200251 if (!PyArg_ParseTuple(args, "|n:readlines", &hint)) return NULL;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000252
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000253 result = PyList_New(0);
254 if (!result)
Jim Fultone60de4d2000-10-06 19:24:23 +0000255 return NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000256
257 while (1){
258 if ( (n = IO_creadline((PyObject*)self,&output)) < 0)
259 goto err;
260 if (n == 0)
261 break;
262 line = PyString_FromStringAndSize (output, n);
263 if (!line)
264 goto err;
265 if (PyList_Append (result, line) == -1) {
266 Py_DECREF (line);
267 goto err;
268 }
269 Py_DECREF (line);
270 length += n;
271 if (hint > 0 && length >= hint)
272 break;
273 }
274 return result;
275 err:
276 Py_DECREF(result);
277 return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000278}
279
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000280PyDoc_STRVAR(IO_reset__doc__,
281"reset() -- Reset the file position to the beginning");
Jim Fultone60de4d2000-10-06 19:24:23 +0000282
283static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000284IO_reset(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000285
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000286 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000287
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000288 self->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000289
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000290 Py_INCREF(Py_None);
291 return Py_None;
Jim Fultone60de4d2000-10-06 19:24:23 +0000292}
293
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000294PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000295
296static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000297IO_tell(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000298
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000299 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000300
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000301 assert(self->pos >= 0);
302 return PyInt_FromSsize_t(self->pos);
Jim Fultone60de4d2000-10-06 19:24:23 +0000303}
304
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000305PyDoc_STRVAR(IO_truncate__doc__,
306"truncate(): truncate the file at the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000307
308static PyObject *
309IO_truncate(IOobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000310 Py_ssize_t pos = -1;
Martin v. Löwiscffcc8b2006-11-19 10:41:41 +0000311
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000312 if (!IO__opencheck(self)) return NULL;
313 if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;
Martin v. Löwiscffcc8b2006-11-19 10:41:41 +0000314
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000315 if (PyTuple_Size(args) == 0) {
316 /* No argument passed, truncate to current position */
317 pos = self->pos;
318 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000319
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000320 if (pos < 0) {
321 errno = EINVAL;
322 PyErr_SetFromErrno(PyExc_IOError);
323 return NULL;
324 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000325
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000326 if (self->string_size > pos) self->string_size = pos;
327 self->pos = self->string_size;
328
329 Py_INCREF(Py_None);
330 return Py_None;
Jim Fultone60de4d2000-10-06 19:24:23 +0000331}
332
Raymond Hettinger352f9472003-04-24 15:50:11 +0000333static PyObject *
334IO_iternext(Iobject *self)
335{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000336 PyObject *next;
337 next = IO_readline((IOobject *)self, NULL);
338 if (!next)
339 return NULL;
340 if (!PyString_GET_SIZE(next)) {
341 Py_DECREF(next);
342 PyErr_SetNone(PyExc_StopIteration);
343 return NULL;
344 }
345 return next;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000346}
347
Jim Fultone60de4d2000-10-06 19:24:23 +0000348
349
350
351/* Read-write object methods */
352
Fred Drake577acb42010-10-11 19:13:04 +0000353PyDoc_STRVAR(IO_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000354"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000355"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000356
357static PyObject *
Fred Drake577acb42010-10-11 19:13:04 +0000358IO_seek(Iobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000359 Py_ssize_t position;
360 int mode = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000361
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000362 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
363 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
364 return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000365
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000366 if (mode == 2) {
367 position += self->string_size;
368 }
369 else if (mode == 1) {
370 position += self->pos;
371 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000372
Fred Drake577acb42010-10-11 19:13:04 +0000373 if (position < 0) position=0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000374
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000375 self->pos=position;
Jim Fultone60de4d2000-10-06 19:24:23 +0000376
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000377 Py_INCREF(Py_None);
378 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000379}
380
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000381PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000382"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000383"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000384
385
386static int
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200387O_cwrite(PyObject *self, const char *c, Py_ssize_t len) {
388 Py_ssize_t newpos;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000389 Oobject *oself;
390 char *newbuf;
Guido van Rossum55702f81997-01-06 22:57:52 +0000391
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000392 if (!IO__opencheck(IOOOBJECT(self))) return -1;
393 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000394
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200395 if (len > INT_MAX) {
396 PyErr_SetString(PyExc_OverflowError,
397 "length too large");
398 return -1;
399 }
400 assert(len >= 0);
401 if (oself->pos >= PY_SSIZE_T_MAX - len) {
402 PyErr_SetString(PyExc_OverflowError,
403 "new position too large");
404 return -1;
405 }
406 newpos = oself->pos + len;
407 if (newpos >= oself->buf_size) {
408 size_t newsize = oself->buf_size;
409 newsize *= 2;
410 if (newsize <= (size_t)newpos || newsize > PY_SSIZE_T_MAX) {
411 assert(newpos < PY_SSIZE_T_MAX - 1);
412 newsize = newpos + 1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000413 }
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200414 newbuf = (char*)realloc(oself->buf, newsize);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000415 if (!newbuf) {
416 PyErr_SetString(PyExc_MemoryError,"out of memory");
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000417 return -1;
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200418 }
419 oself->buf_size = (Py_ssize_t)newsize;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000420 oself->buf = newbuf;
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200421 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000422
Fred Drake577acb42010-10-11 19:13:04 +0000423 if (oself->string_size < oself->pos) {
424 /* In case of overseek, pad with null bytes the buffer region between
425 the end of stream and the current position.
426
427 0 lo string_size hi
428 | |<---used--->|<----------available----------->|
429 | | <--to pad-->|<---to write---> |
430 0 buf position
431 */
432 memset(oself->buf + oself->string_size, '\0',
433 (oself->pos - oself->string_size) * sizeof(char));
434 }
435
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200436 memcpy(oself->buf + oself->pos, c, len);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000437
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200438 oself->pos = newpos;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000439
440 if (oself->string_size < oself->pos) {
441 oself->string_size = oself->pos;
442 }
443
Serhiy Storchaka276f1d52013-02-09 13:47:43 +0200444 return (int)len;
Guido van Rossum049cd901996-12-05 23:30:48 +0000445}
446
447static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000448O_write(Oobject *self, PyObject *args) {
Kristján Valur Jónsson9795ca42013-03-19 17:17:47 -0700449 Py_buffer buf;
450 int result;
Guido van Rossum049cd901996-12-05 23:30:48 +0000451
Kristján Valur Jónsson9795ca42013-03-19 17:17:47 -0700452 if (!PyArg_ParseTuple(args, "s*:write", &buf)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000453
Kristján Valur Jónsson9795ca42013-03-19 17:17:47 -0700454 result = O_cwrite((PyObject*)self, buf.buf, buf.len);
455 PyBuffer_Release(&buf);
456 if (result < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000457
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000458 Py_INCREF(Py_None);
459 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000460}
461
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000462PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000463
464static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000465O_close(Oobject *self, PyObject *unused) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000466 if (self->buf != NULL) free(self->buf);
467 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000468
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000469 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000470
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000471 Py_INCREF(Py_None);
472 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000473}
474
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000475PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000476"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
477"\n"
478"Note that newlines are not added. The sequence can be any iterable object\n"
479"producing strings. This is equivalent to calling write() for each string.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000480static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000481O_writelines(Oobject *self, PyObject *args) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000482 PyObject *it, *s;
483
484 it = PyObject_GetIter(args);
485 if (it == NULL)
486 return NULL;
487 while ((s = PyIter_Next(it)) != NULL) {
488 Py_ssize_t n;
489 char *c;
490 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
491 Py_DECREF(it);
492 Py_DECREF(s);
493 return NULL;
494 }
495 if (O_cwrite((PyObject *)self, c, n) == -1) {
496 Py_DECREF(it);
497 Py_DECREF(s);
498 return NULL;
499 }
500 Py_DECREF(s);
Michael W. Hudson10402a32005-09-22 09:19:01 +0000501 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000502
Michael W. Hudson10402a32005-09-22 09:19:01 +0000503 Py_DECREF(it);
504
505 /* See if PyIter_Next failed */
506 if (PyErr_Occurred())
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000507 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000508
509 Py_RETURN_NONE;
510}
Guido van Rossum049cd901996-12-05 23:30:48 +0000511static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000512 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000513 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000514 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000515 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000516 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
517 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
518 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
519 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
Fred Drake577acb42010-10-11 19:13:04 +0000520 {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000521 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000522 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
523
524 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000525 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000526 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
527 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
528 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000529};
530
Raymond Hettinger352f9472003-04-24 15:50:11 +0000531static PyMemberDef O_memberlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000532 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
533 "flag indicating that a space needs to be printed; used by print"},
534 /* getattr(f, "closed") is implemented without this table */
535 {NULL} /* Sentinel */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000536};
537
Guido van Rossum049cd901996-12-05 23:30:48 +0000538static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000539O_dealloc(Oobject *self) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000540 if (self->buf != NULL)
541 free(self->buf);
542 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000543}
544
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000545PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000546
547static PyTypeObject Otype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000548 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000549 "cStringIO.StringO", /*tp_name*/
550 sizeof(Oobject), /*tp_basicsize*/
551 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000552 /* methods */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000553 (destructor)O_dealloc, /*tp_dealloc*/
554 0, /*tp_print*/
555 0, /*tp_getattr */
556 0, /*tp_setattr */
557 0, /*tp_compare*/
558 0, /*tp_repr*/
559 0, /*tp_as_number*/
560 0, /*tp_as_sequence*/
561 0, /*tp_as_mapping*/
562 0, /*tp_hash*/
563 0 , /*tp_call*/
564 0, /*tp_str*/
565 0, /*tp_getattro */
566 0, /*tp_setattro */
567 0, /*tp_as_buffer */
568 Py_TPFLAGS_DEFAULT, /*tp_flags*/
569 Otype__doc__, /*tp_doc */
570 0, /*tp_traverse */
571 0, /*tp_clear */
572 0, /*tp_richcompare */
573 0, /*tp_weaklistoffset */
574 PyObject_SelfIter, /*tp_iter */
575 (iternextfunc)IO_iternext, /*tp_iternext */
576 O_methods, /*tp_methods */
577 O_memberlist, /*tp_members */
578 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000579};
580
Guido van Rossum142eeb81997-08-13 03:14:41 +0000581static PyObject *
582newOobject(int size) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000583 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000584
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000585 self = PyObject_New(Oobject, &Otype);
586 if (self == NULL)
587 return NULL;
588 self->pos=0;
589 self->string_size = 0;
590 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000591
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000592 self->buf = (char *)malloc(size);
593 if (!self->buf) {
594 PyErr_SetString(PyExc_MemoryError,"out of memory");
595 self->buf_size = 0;
596 Py_DECREF(self);
597 return NULL;
598 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000599
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000600 self->buf_size=size;
601 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000602}
603
Skip Montanaroe1388282003-08-11 13:15:11 +0000604/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000605/* -------------------------------------------------------- */
606
607static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000608I_close(Iobject *self, PyObject *unused) {
Kristján Valur Jónsson9795ca42013-03-19 17:17:47 -0700609 PyBuffer_Release(&self->pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000610 self->buf = NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000611
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000612 self->pos = self->string_size = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000613
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000614 Py_INCREF(Py_None);
615 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000616}
617
Guido van Rossum049cd901996-12-05 23:30:48 +0000618static struct PyMethodDef I_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000619 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000620 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000621 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000622 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000623 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
624 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
625 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
626 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
Fred Drake577acb42010-10-11 19:13:04 +0000627 {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000628 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000629 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
630
631 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000632 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000633 {NULL, NULL}
Guido van Rossum049cd901996-12-05 23:30:48 +0000634};
635
Guido van Rossum049cd901996-12-05 23:30:48 +0000636static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000637I_dealloc(Iobject *self) {
Kristján Valur Jónsson9795ca42013-03-19 17:17:47 -0700638 PyBuffer_Release(&self->pbuf);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000639 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000640}
641
Barry Warsaw3e8be722001-09-22 04:36:49 +0000642
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000643PyDoc_STRVAR(Itype__doc__,
644"Simple type for treating strings as input file streams");
Guido van Rossum049cd901996-12-05 23:30:48 +0000645
646static PyTypeObject Itype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000647 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000648 "cStringIO.StringI", /*tp_name*/
649 sizeof(Iobject), /*tp_basicsize*/
650 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000651 /* methods */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000652 (destructor)I_dealloc, /*tp_dealloc*/
653 0, /*tp_print*/
654 0, /* tp_getattr */
655 0, /*tp_setattr*/
656 0, /*tp_compare*/
657 0, /*tp_repr*/
658 0, /*tp_as_number*/
659 0, /*tp_as_sequence*/
660 0, /*tp_as_mapping*/
661 0, /*tp_hash*/
662 0, /*tp_call*/
663 0, /*tp_str*/
664 0, /* tp_getattro */
665 0, /* tp_setattro */
666 0, /* tp_as_buffer */
667 Py_TPFLAGS_DEFAULT, /* tp_flags */
668 Itype__doc__, /* tp_doc */
669 0, /* tp_traverse */
670 0, /* tp_clear */
671 0, /* tp_richcompare */
672 0, /* tp_weaklistoffset */
673 PyObject_SelfIter, /* tp_iter */
674 (iternextfunc)IO_iternext, /* tp_iternext */
675 I_methods, /* tp_methods */
676 0, /* tp_members */
677 file_getsetlist, /* tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000678};
679
Guido van Rossum142eeb81997-08-13 03:14:41 +0000680static PyObject *
681newIobject(PyObject *s) {
682 Iobject *self;
Kristján Valur Jónsson9795ca42013-03-19 17:17:47 -0700683 Py_buffer buf;
684 PyObject *args;
685 int result;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000686
Kristján Valur Jónsson9795ca42013-03-19 17:17:47 -0700687 args = Py_BuildValue("(O)", s);
688 if (args == NULL)
Antoine Pitrou5a77fe92011-10-22 21:26:01 +0200689 return NULL;
Kristján Valur Jónsson9795ca42013-03-19 17:17:47 -0700690 result = PyArg_ParseTuple(args, "s*:StringIO", &buf);
691 Py_DECREF(args);
692 if (!result)
693 return NULL;
Georg Brandl5597e262006-10-12 09:47:12 +0000694
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000695 self = PyObject_New(Iobject, &Itype);
Kristján Valur Jónsson9795ca42013-03-19 17:17:47 -0700696 if (!self) {
697 PyBuffer_Release(&buf);
698 return NULL;
699 }
700 self->buf=buf.buf;
701 self->string_size=buf.len;
702 self->pbuf=buf;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000703 self->pos=0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000704
Guido van Rossum142eeb81997-08-13 03:14:41 +0000705 return (PyObject*)self;
706}
707
Guido van Rossum049cd901996-12-05 23:30:48 +0000708/* End of code for StringI objects */
709/* -------------------------------------------------------- */
710
711
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000712PyDoc_STRVAR(IO_StringIO__doc__,
713"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000714
715static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000716IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000717 PyObject *s=0;
718
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000719 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000720
721 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000722 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000723}
724
725/* List of methods defined in the module */
726
727static struct PyMethodDef IO_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000728 {"StringIO", (PyCFunction)IO_StringIO,
729 METH_VARARGS, IO_StringIO__doc__},
730 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000731};
732
733
734/* Initialization function for the module (*must* be called initcStringIO) */
735
Guido van Rossum154417e1997-04-09 17:35:33 +0000736static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000737 IO_cread,
738 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000739 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000740 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000741 newOobject,
742 newIobject,
743 &Itype,
744 &Otype,
745};
746
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000747#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000748#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000749#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000750PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000751initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000752 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000753
Guido van Rossum154417e1997-04-09 17:35:33 +0000754
Guido van Rossum049cd901996-12-05 23:30:48 +0000755 /* Create the module and add the functions */
756 m = Py_InitModule4("cStringIO", IO_methods,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000757 cStringIO_module_documentation,
758 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000759 if (m == NULL) return;
Guido van Rossum049cd901996-12-05 23:30:48 +0000760
761 /* Add some symbolic constants to the module */
762 d = PyModule_GetDict(m);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000763
Guido van Rossum55702f81997-01-06 22:57:52 +0000764 /* Export C API */
Christian Heimese93237d2007-12-19 02:37:44 +0000765 Py_TYPE(&Itype)=&PyType_Type;
766 Py_TYPE(&Otype)=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000767 if (PyType_Ready(&Otype) < 0) return;
768 if (PyType_Ready(&Itype) < 0) return;
Larry Hastings402b73f2010-03-25 00:54:54 +0000769 v = PyCapsule_New(&CAPI, PycStringIO_CAPSULE_NAME, NULL);
770 PyDict_SetItemString(d,"cStringIO_CAPI", v);
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000771 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000772
773 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000774 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
775 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000776
777 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000778 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000779}