blob: 237d8c2f1f1da271758c1d5d654fe7c2a7cb0220 [file] [log] [blame]
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001
2#include "Python.h"
3#include "import.h"
4#include "cStringIO.h"
Raymond Hettinger352f9472003-04-24 15:50:11 +00005#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006
7PyDoc_STRVAR(cStringIO_module_documentation,
Guido van Rossum049cd901996-12-05 23:30:48 +00008"A simple fast partial StringIO replacement.\n"
9"\n"
10"This module provides a simple useful replacement for\n"
11"the StringIO module that is written in C. It does not provide the\n"
Fred Drakeaef10002000-06-19 13:17:41 +000012"full generality of StringIO, but it provides enough for most\n"
Thomas Wouters7e474022000-07-16 12:04:32 +000013"applications and is especially useful in conjunction with the\n"
Guido van Rossum049cd901996-12-05 23:30:48 +000014"pickle module.\n"
15"\n"
16"Usage:\n"
17"\n"
18" from cStringIO import StringIO\n"
19"\n"
20" an_output_stream=StringIO()\n"
21" an_output_stream.write(some_stuff)\n"
22" ...\n"
Jeremy Hyltonb189b072002-03-08 17:17:33 +000023" value=an_output_stream.getvalue()\n"
Guido van Rossum049cd901996-12-05 23:30:48 +000024"\n"
25" an_input_stream=StringIO(a_string)\n"
26" spam=an_input_stream.readline()\n"
27" spam=an_input_stream.read(5)\n"
Guido van Rossum7d9b4131998-11-25 16:17:32 +000028" an_input_stream.seek(0) # OK, start over\n"
Guido van Rossum049cd901996-12-05 23:30:48 +000029" spam=an_input_stream.read() # and read it all\n"
30" \n"
31"If someone else wants to provide a more complete implementation,\n"
32"go for it. :-) \n"
Guido van Rossum142eeb81997-08-13 03:14:41 +000033"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000034"cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n");
Guido van Rossum049cd901996-12-05 23:30:48 +000035
Jim Fultone60de4d2000-10-06 19:24:23 +000036/* Declaration for file-like objects that manage data as strings
Guido van Rossum049cd901996-12-05 23:30:48 +000037
Jim Fultone60de4d2000-10-06 19:24:23 +000038 The IOobject type should be though of as a common base type for
39 Iobjects, which provide input (read-only) StringIO objects and
40 Oobjects, which provide read-write objects. Most of the methods
41 depend only on common data.
42*/
Guido van Rossum049cd901996-12-05 23:30:48 +000043
44typedef struct {
45 PyObject_HEAD
46 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000047 Py_ssize_t pos, string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +000048} IOobject;
49
50#define IOOOBJECT(O) ((IOobject*)(O))
51
Skip Montanaroe1388282003-08-11 13:15:11 +000052/* Declarations for objects of type StringO */
Jim Fultone60de4d2000-10-06 19:24:23 +000053
54typedef struct { /* Subtype of IOobject */
55 PyObject_HEAD
56 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000057 Py_ssize_t pos, string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +000058
Martin v. Löwis18e16552006-02-15 17:27:45 +000059 Py_ssize_t buf_size;
60 int softspace;
Jim Fultone60de4d2000-10-06 19:24:23 +000061} Oobject;
62
63/* Declarations for objects of type StringI */
64
65typedef struct { /* Subtype of IOobject */
66 PyObject_HEAD
67 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +000068 Py_ssize_t pos, string_size;
Marc-André Lemburge47df7a2001-09-24 17:34:52 +000069 /* We store a reference to the object here in order to keep
70 the buffer alive during the lifetime of the Iobject. */
Guido van Rossum049cd901996-12-05 23:30:48 +000071 PyObject *pbuf;
72} Iobject;
73
Jim Fultone60de4d2000-10-06 19:24:23 +000074/* IOobject (common) methods */
75
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000076PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing.");
Jim Fultone60de4d2000-10-06 19:24:23 +000077
78static int
79IO__opencheck(IOobject *self) {
Martin v. Löwis5df2e612006-03-01 23:10:49 +000080 if (!self->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +000081 PyErr_SetString(PyExc_ValueError,
82 "I/O operation on closed file");
83 return 0;
84 }
85 return 1;
86}
87
88static PyObject *
Raymond Hettinger5475f232003-08-08 12:20:03 +000089IO_get_closed(IOobject *self, void *closure)
90{
91 PyObject *result = Py_False;
92
93 if (self->buf == NULL)
94 result = Py_True;
95 Py_INCREF(result);
96 return result;
97}
98
99static PyGetSetDef file_getsetlist[] = {
100 {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"},
101 {0},
102};
103
104static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000105IO_flush(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000106
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000107 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000108
109 Py_INCREF(Py_None);
110 return Py_None;
111}
112
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000113PyDoc_STRVAR(IO_getval__doc__,
114"getvalue([use_pos]) -- Get the string value."
115"\n"
116"If use_pos is specified and is a true value, then the string returned\n"
117"will include only the text up to the current file position.\n");
Guido van Rossum049cd901996-12-05 23:30:48 +0000118
119static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000120IO_cgetval(PyObject *self) {
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000121 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000122 assert(IOOOBJECT(self)->pos >= 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000123 return PyString_FromStringAndSize(((IOobject*)self)->buf,
Jim Fultone60de4d2000-10-06 19:24:23 +0000124 ((IOobject*)self)->pos);
Guido van Rossum049cd901996-12-05 23:30:48 +0000125}
126
Guido van Rossum049cd901996-12-05 23:30:48 +0000127static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000128IO_getval(IOobject *self, PyObject *args) {
129 PyObject *use_pos=Py_None;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000130 Py_ssize_t s;
Jim Fultone60de4d2000-10-06 19:24:23 +0000131
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000132 if (!IO__opencheck(self)) return NULL;
133 if (!PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000134
135 if (PyObject_IsTrue(use_pos)) {
136 s=self->pos;
137 if (s > self->string_size) s=self->string_size;
138 }
139 else
140 s=self->string_size;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000141 assert(self->pos >= 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000142 return PyString_FromStringAndSize(self->buf, s);
Guido van Rossum049cd901996-12-05 23:30:48 +0000143}
144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000145PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0");
Guido van Rossum049cd901996-12-05 23:30:48 +0000146
147static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000148IO_isatty(IOobject *self, PyObject *unused) {
Walter Dörwald197e8322006-03-15 22:13:13 +0000149 if (!IO__opencheck(self)) return NULL;
150 Py_INCREF(Py_False);
Guido van Rossum674deb22002-09-01 15:06:28 +0000151 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) {
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000159 Py_ssize_t l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000160
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000161 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000162 assert(IOOOBJECT(self)->pos >= 0);
163 assert(IOOOBJECT(self)->string_size >= 0);
Jim Fultone60de4d2000-10-06 19:24:23 +0000164 l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos;
165 if (n < 0 || n > l) {
166 n = l;
167 if (n < 0) n=0;
168 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000169
Jim Fultone60de4d2000-10-06 19:24:23 +0000170 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
171 ((IOobject*)self)->pos += n;
172 return n;
Guido van Rossum049cd901996-12-05 23:30:48 +0000173}
174
175static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000176IO_read(IOobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000177 Py_ssize_t n = -1;
Thomas Woutersf86d1e82006-03-01 22:15:15 +0000178 char *output = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000179
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000180 if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000181
Jim Fultone60de4d2000-10-06 19:24:23 +0000182 if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000183
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000184 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000185}
186
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000187PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");
Guido van Rossum049cd901996-12-05 23:30:48 +0000188
189static int
Jim Fultone60de4d2000-10-06 19:24:23 +0000190IO_creadline(PyObject *self, char **output) {
191 char *n, *s;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000192 Py_ssize_t l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000193
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000194 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000195
196 for (n = ((IOobject*)self)->buf + ((IOobject*)self)->pos,
197 s = ((IOobject*)self)->buf + ((IOobject*)self)->string_size;
198 n < s && *n != '\n'; n++);
Gregory P. Smith9d534572008-06-11 07:41:16 +0000199
Jim Fultone60de4d2000-10-06 19:24:23 +0000200 if (n < s) n++;
201
202 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
203 l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000204
205 assert(IOOOBJECT(self)->pos <= PY_SSIZE_T_MAX - l);
206 assert(IOOOBJECT(self)->pos >= 0);
207 assert(IOOOBJECT(self)->string_size >= 0);
208
209 ((IOobject*)self)->pos += l;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000210 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000211}
212
213static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000214IO_readline(IOobject *self, PyObject *args) {
215 int n, m=-1;
216 char *output;
Guido van Rossum049cd901996-12-05 23:30:48 +0000217
Raymond Hettinger352f9472003-04-24 15:50:11 +0000218 if (args)
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000219 if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000220
221 if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL;
222 if (m >= 0 && m < n) {
223 m = n - m;
224 n -= m;
225 self->pos -= m;
226 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000227 assert(IOOOBJECT(self)->pos >= 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000228 return PyString_FromStringAndSize(output, n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000229}
230
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000231PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000232
233static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000234IO_readlines(IOobject *self, PyObject *args) {
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000235 int n;
236 char *output;
237 PyObject *result, *line;
238 int hint = 0, length = 0;
239
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000240 if (!PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000241
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000242 result = PyList_New(0);
243 if (!result)
244 return NULL;
245
Jim Fultone60de4d2000-10-06 19:24:23 +0000246 while (1){
247 if ( (n = IO_creadline((PyObject*)self,&output)) < 0)
248 goto err;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000249 if (n == 0)
250 break;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000251 line = PyString_FromStringAndSize (output, n);
Jim Fultone60de4d2000-10-06 19:24:23 +0000252 if (!line)
253 goto err;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000254 if (PyList_Append (result, line) == -1) {
255 Py_DECREF (line);
256 goto err;
257 }
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000258 Py_DECREF (line);
259 length += n;
260 if (hint > 0 && length >= hint)
261 break;
262 }
263 return result;
Jim Fultone60de4d2000-10-06 19:24:23 +0000264 err:
265 Py_DECREF(result);
266 return NULL;
267}
268
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000269PyDoc_STRVAR(IO_reset__doc__,
270"reset() -- Reset the file position to the beginning");
Jim Fultone60de4d2000-10-06 19:24:23 +0000271
272static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000273IO_reset(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000274
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000275 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000276
277 self->pos = 0;
278
279 Py_INCREF(Py_None);
280 return Py_None;
281}
282
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000283PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000284
285static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000286IO_tell(IOobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000287
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000288 if (!IO__opencheck(self)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000289
Gregory P. Smith9d534572008-06-11 07:41:16 +0000290 assert(self->pos >= 0);
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000291 return PyInt_FromSsize_t(self->pos);
Jim Fultone60de4d2000-10-06 19:24:23 +0000292}
293
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000294PyDoc_STRVAR(IO_truncate__doc__,
295"truncate(): truncate the file at the current position.");
Jim Fultone60de4d2000-10-06 19:24:23 +0000296
297static PyObject *
298IO_truncate(IOobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000299 Py_ssize_t pos = -1;
Jim Fultone60de4d2000-10-06 19:24:23 +0000300
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000301 if (!IO__opencheck(self)) return NULL;
302 if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;
Martin v. Löwiscffcc8b2006-11-19 10:41:41 +0000303
304 if (PyTuple_Size(args) == 0) {
305 /* No argument passed, truncate to current position */
306 pos = self->pos;
307 }
308
309 if (pos < 0) {
310 errno = EINVAL;
311 PyErr_SetFromErrno(PyExc_IOError);
312 return NULL;
313 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000314
315 if (self->string_size > pos) self->string_size = pos;
Tim Peters037b3ee2004-08-21 06:55:43 +0000316 self->pos = self->string_size;
Jim Fultone60de4d2000-10-06 19:24:23 +0000317
318 Py_INCREF(Py_None);
319 return Py_None;
320}
321
Raymond Hettinger352f9472003-04-24 15:50:11 +0000322static PyObject *
323IO_iternext(Iobject *self)
324{
325 PyObject *next;
326 next = IO_readline((IOobject *)self, NULL);
327 if (!next)
328 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000329 if (!PyString_GET_SIZE(next)) {
Raymond Hettinger352f9472003-04-24 15:50:11 +0000330 Py_DECREF(next);
331 PyErr_SetNone(PyExc_StopIteration);
332 return NULL;
333 }
334 return next;
335}
336
Jim Fultone60de4d2000-10-06 19:24:23 +0000337
338
339
340/* Read-write object methods */
341
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000342PyDoc_STRVAR(O_seek__doc__,
Jim Fultone60de4d2000-10-06 19:24:23 +0000343"seek(position) -- set the current position\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000344"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
Jim Fultone60de4d2000-10-06 19:24:23 +0000345
346static PyObject *
347O_seek(Oobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000348 Py_ssize_t position;
349 int mode = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000350
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000351 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
352 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000353 return NULL;
354
355 if (mode == 2) {
356 position += self->string_size;
357 }
358 else if (mode == 1) {
359 position += self->pos;
360 }
361
362 if (position > self->buf_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000363 char *newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000364 self->buf_size*=2;
365 if (self->buf_size <= position) self->buf_size=position+1;
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000366 newbuf = (char*) realloc(self->buf,self->buf_size);
367 if (!newbuf) {
368 free(self->buf);
369 self->buf = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000370 self->buf_size=self->pos=0;
371 return PyErr_NoMemory();
372 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000373 self->buf = newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000374 }
375 else if (position < 0) position=0;
376
377 self->pos=position;
378
379 while (--position >= self->string_size) self->buf[position]=0;
380
381 Py_INCREF(Py_None);
382 return Py_None;
Martin v. Löwisc912a3a2000-09-19 11:06:46 +0000383}
384
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000385PyDoc_STRVAR(O_write__doc__,
Guido van Rossum049cd901996-12-05 23:30:48 +0000386"write(s) -- Write a string to the file"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000387"\n\nNote (hack:) writing None resets the buffer");
Guido van Rossum049cd901996-12-05 23:30:48 +0000388
389
390static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000391O_cwrite(PyObject *self, const char *c, Py_ssize_t l) {
392 Py_ssize_t newl;
Guido van Rossum2f098122001-12-07 20:20:28 +0000393 Oobject *oself;
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000394 char *newbuf;
Guido van Rossum55702f81997-01-06 22:57:52 +0000395
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000396 if (!IO__opencheck(IOOOBJECT(self))) return -1;
Guido van Rossum2f098122001-12-07 20:20:28 +0000397 oself = (Oobject *)self;
Guido van Rossum049cd901996-12-05 23:30:48 +0000398
Guido van Rossum2f098122001-12-07 20:20:28 +0000399 newl = oself->pos+l;
400 if (newl >= oself->buf_size) {
401 oself->buf_size *= 2;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000402 if (oself->buf_size <= newl) {
403 assert(newl + 1 < INT_MAX);
404 oself->buf_size = (int)(newl+1);
405 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000406 newbuf = (char*)realloc(oself->buf, oself->buf_size);
407 if (!newbuf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000408 PyErr_SetString(PyExc_MemoryError,"out of memory");
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000409 free(oself->buf);
410 oself->buf = 0;
Guido van Rossum2f098122001-12-07 20:20:28 +0000411 oself->buf_size = oself->pos = 0;
Jim Fultone60de4d2000-10-06 19:24:23 +0000412 return -1;
413 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000414 oself->buf = newbuf;
Jim Fultone60de4d2000-10-06 19:24:23 +0000415 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000416
Guido van Rossum2f098122001-12-07 20:20:28 +0000417 memcpy(oself->buf+oself->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000418
Martin v. Löwis18e16552006-02-15 17:27:45 +0000419 assert(oself->pos + l < INT_MAX);
420 oself->pos += (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000421
Guido van Rossum2f098122001-12-07 20:20:28 +0000422 if (oself->string_size < oself->pos) {
423 oself->string_size = oself->pos;
424 }
Jim Fultone60de4d2000-10-06 19:24:23 +0000425
Martin v. Löwis18e16552006-02-15 17:27:45 +0000426 return (int)l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000427}
428
429static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000430O_write(Oobject *self, PyObject *args) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000431 char *c;
432 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000433
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000434 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000435
Jim Fultone60de4d2000-10-06 19:24:23 +0000436 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000437
Jim Fultone60de4d2000-10-06 19:24:23 +0000438 Py_INCREF(Py_None);
439 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000440}
441
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000442PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000443
444static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000445O_close(Oobject *self, PyObject *unused) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000446 if (self->buf != NULL) free(self->buf);
447 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000448
Jim Fultone60de4d2000-10-06 19:24:23 +0000449 self->pos = self->string_size = self->buf_size = 0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000450
Jim Fultone60de4d2000-10-06 19:24:23 +0000451 Py_INCREF(Py_None);
452 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000453}
454
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000455PyDoc_STRVAR(O_writelines__doc__,
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000456"writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
457"\n"
458"Note that newlines are not added. The sequence can be any iterable object\n"
459"producing strings. This is equivalent to calling write() for 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) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000462 PyObject *it, *s;
463
464 it = PyObject_GetIter(args);
465 if (it == NULL)
Raymond Hettingerbc72c5a2004-02-27 10:30:49 +0000466 return NULL;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000467 while ((s = PyIter_Next(it)) != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000468 Py_ssize_t n;
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000469 char *c;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000470 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
Raymond Hettinger6ec09962004-03-08 18:17:31 +0000471 Py_DECREF(it);
472 Py_DECREF(s);
473 return NULL;
474 }
475 if (O_cwrite((PyObject *)self, c, n) == -1) {
476 Py_DECREF(it);
477 Py_DECREF(s);
478 return NULL;
Michael W. Hudson10402a32005-09-22 09:19:01 +0000479 }
480 Py_DECREF(s);
481 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000482
Michael W. Hudson10402a32005-09-22 09:19:01 +0000483 Py_DECREF(it);
484
485 /* See if PyIter_Next failed */
486 if (PyErr_Occurred())
487 return NULL;
488
489 Py_RETURN_NONE;
490}
Guido van Rossum049cd901996-12-05 23:30:48 +0000491static struct PyMethodDef O_methods[] = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000492 /* Common methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000493 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000494 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000495 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000496 {"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__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000499 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
500 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000501 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
502
503 /* Read-write StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000504 {"close", (PyCFunction)O_close, METH_NOARGS, 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__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000507 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +0000508 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000509};
510
Raymond Hettinger352f9472003-04-24 15:50:11 +0000511static PyMemberDef O_memberlist[] = {
512 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
513 "flag indicating that a space needs to be printed; used by print"},
Raymond Hettinger5475f232003-08-08 12:20:03 +0000514 /* getattr(f, "closed") is implemented without this table */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000515 {NULL} /* Sentinel */
516};
517
Guido van Rossum049cd901996-12-05 23:30:48 +0000518static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000519O_dealloc(Oobject *self) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000520 if (self->buf != NULL)
521 free(self->buf);
522 PyObject_Del(self);
Guido van Rossum049cd901996-12-05 23:30:48 +0000523}
524
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000525PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
Guido van Rossum049cd901996-12-05 23:30:48 +0000526
527static PyTypeObject Otype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000528 PyVarObject_HEAD_INIT(NULL, 0)
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000529 "cStringIO.StringO", /*tp_name*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000530 sizeof(Oobject), /*tp_basicsize*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000531 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000532 /* methods */
533 (destructor)O_dealloc, /*tp_dealloc*/
Georg Brandld37ac692006-03-30 11:58:57 +0000534 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000535 0, /*tp_getattr */
536 0, /*tp_setattr */
Georg Brandld37ac692006-03-30 11:58:57 +0000537 0, /*tp_compare*/
538 0, /*tp_repr*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000539 0, /*tp_as_number*/
540 0, /*tp_as_sequence*/
541 0, /*tp_as_mapping*/
Georg Brandld37ac692006-03-30 11:58:57 +0000542 0, /*tp_hash*/
543 0 , /*tp_call*/
544 0, /*tp_str*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000545 0, /*tp_getattro */
546 0, /*tp_setattro */
547 0, /*tp_as_buffer */
548 Py_TPFLAGS_DEFAULT, /*tp_flags*/
549 Otype__doc__, /*tp_doc */
550 0, /*tp_traverse */
551 0, /*tp_clear */
552 0, /*tp_richcompare */
553 0, /*tp_weaklistoffset */
554 PyObject_SelfIter, /*tp_iter */
555 (iternextfunc)IO_iternext, /*tp_iternext */
556 O_methods, /*tp_methods */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000557 O_memberlist, /*tp_members */
558 file_getsetlist, /*tp_getset */
Guido van Rossum049cd901996-12-05 23:30:48 +0000559};
560
Guido van Rossum142eeb81997-08-13 03:14:41 +0000561static PyObject *
562newOobject(int size) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000563 Oobject *self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000564
Jim Fultone60de4d2000-10-06 19:24:23 +0000565 self = PyObject_New(Oobject, &Otype);
566 if (self == NULL)
567 return NULL;
568 self->pos=0;
569 self->string_size = 0;
570 self->softspace = 0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000571
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000572 self->buf = (char *)malloc(size);
573 if (!self->buf) {
Jim Fultone60de4d2000-10-06 19:24:23 +0000574 PyErr_SetString(PyExc_MemoryError,"out of memory");
575 self->buf_size = 0;
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +0000576 Py_DECREF(self);
Jim Fultone60de4d2000-10-06 19:24:23 +0000577 return NULL;
578 }
579
580 self->buf_size=size;
581 return (PyObject*)self;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000582}
583
Skip Montanaroe1388282003-08-11 13:15:11 +0000584/* End of code for StringO objects */
Guido van Rossum049cd901996-12-05 23:30:48 +0000585/* -------------------------------------------------------- */
586
587static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000588I_close(Iobject *self, PyObject *unused) {
Amaury Forgeot d'Arc588ff932008-02-16 14:34:57 +0000589 Py_CLEAR(self->pbuf);
Jim Fultone60de4d2000-10-06 19:24:23 +0000590 self->buf = NULL;
591
592 self->pos = self->string_size = 0;
593
594 Py_INCREF(Py_None);
595 return Py_None;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000596}
597
598static PyObject *
Jim Fultone60de4d2000-10-06 19:24:23 +0000599I_seek(Iobject *self, PyObject *args) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000600 Py_ssize_t position;
601 int mode = 0;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000602
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000603 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
604 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
Jim Fultone60de4d2000-10-06 19:24:23 +0000605 return NULL;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000606
Jim Fultone60de4d2000-10-06 19:24:23 +0000607 if (mode == 2) position += self->string_size;
608 else if (mode == 1) position += self->pos;
Guido van Rossum476e49f1998-12-15 21:43:15 +0000609
Jim Fultone60de4d2000-10-06 19:24:23 +0000610 if (position < 0) position=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000611
Jim Fultone60de4d2000-10-06 19:24:23 +0000612 self->pos=position;
613
614 Py_INCREF(Py_None);
615 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000616}
617
618static 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__},
Jim Fultone60de4d2000-10-06 19:24:23 +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__},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000626 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
627 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000628 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
629
630 /* Read-only StringIO specific methods: */
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000631 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
Jim Fultone60de4d2000-10-06 19:24:23 +0000632 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
Guido van Rossum476e49f1998-12-15 21:43:15 +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) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000638 Py_XDECREF(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)
Skip Montanaroeb2f0612003-08-11 14:51:15 +0000648 "cStringIO.StringI", /*tp_name*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000649 sizeof(Iobject), /*tp_basicsize*/
650 0, /*tp_itemsize*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000651 /* methods */
Barry Warsaw3e8be722001-09-22 04:36:49 +0000652 (destructor)I_dealloc, /*tp_dealloc*/
Georg Brandld37ac692006-03-30 11:58:57 +0000653 0, /*tp_print*/
Raymond Hettinger352f9472003-04-24 15:50:11 +0000654 0, /* tp_getattr */
Georg Brandld37ac692006-03-30 11:58:57 +0000655 0, /*tp_setattr*/
656 0, /*tp_compare*/
657 0, /*tp_repr*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000658 0, /*tp_as_number*/
659 0, /*tp_as_sequence*/
660 0, /*tp_as_mapping*/
Georg Brandld37ac692006-03-30 11:58:57 +0000661 0, /*tp_hash*/
662 0, /*tp_call*/
663 0, /*tp_str*/
Barry Warsaw3e8be722001-09-22 04:36:49 +0000664 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 */
Raymond Hettinger352f9472003-04-24 15:50:11 +0000673 PyObject_SelfIter, /* tp_iter */
674 (iternextfunc)IO_iternext, /* tp_iternext */
Raymond Hettinger5475f232003-08-08 12:20:03 +0000675 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;
683 char *buf;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000684 Py_ssize_t size;
Jeremy Hylton127b2ef2000-04-12 22:04:01 +0000685
Georg Brandl95d94942007-08-08 13:50:02 +0000686 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
Georg Brandl96164442007-08-08 13:03:41 +0000687 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
688 s->ob_type->tp_name);
689 return NULL;
690 }
Georg Brandl5597e262006-10-12 09:47:12 +0000691
Martin v. Löwis5df2e612006-03-01 23:10:49 +0000692 self = PyObject_New(Iobject, &Itype);
693 if (!self) return NULL;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000694 Py_INCREF(s);
695 self->buf=buf;
696 self->string_size=size;
697 self->pbuf=s;
698 self->pos=0;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000699
700 return (PyObject*)self;
701}
702
Guido van Rossum049cd901996-12-05 23:30:48 +0000703/* End of code for StringI objects */
704/* -------------------------------------------------------- */
705
706
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000707PyDoc_STRVAR(IO_StringIO__doc__,
708"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
Guido van Rossum049cd901996-12-05 23:30:48 +0000709
710static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000711IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000712 PyObject *s=0;
713
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000714 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
Jim Fultone60de4d2000-10-06 19:24:23 +0000715
716 if (s) return newIobject(s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000717 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000718}
719
720/* List of methods defined in the module */
721
722static struct PyMethodDef IO_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000723 {"StringIO", (PyCFunction)IO_StringIO,
724 METH_VARARGS, IO_StringIO__doc__},
Guido van Rossum55702f81997-01-06 22:57:52 +0000725 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000726};
727
728
729/* Initialization function for the module (*must* be called initcStringIO) */
730
Guido van Rossum154417e1997-04-09 17:35:33 +0000731static struct PycStringIO_CAPI CAPI = {
Jim Fultone60de4d2000-10-06 19:24:23 +0000732 IO_cread,
733 IO_creadline,
Guido van Rossum154417e1997-04-09 17:35:33 +0000734 O_cwrite,
Jim Fultone60de4d2000-10-06 19:24:23 +0000735 IO_cgetval,
Guido van Rossum154417e1997-04-09 17:35:33 +0000736 newOobject,
737 newIobject,
738 &Itype,
739 &Otype,
740};
741
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000742#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
743#define PyMODINIT_FUNC void
Guido van Rossum476e49f1998-12-15 21:43:15 +0000744#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000745PyMODINIT_FUNC
Thomas Wouters58d05102000-07-24 14:43:35 +0000746initcStringIO(void) {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000747 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000748
Guido van Rossum154417e1997-04-09 17:35:33 +0000749
Guido van Rossum049cd901996-12-05 23:30:48 +0000750 /* Create the module and add the functions */
751 m = Py_InitModule4("cStringIO", IO_methods,
752 cStringIO_module_documentation,
753 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000754 if (m == NULL) return;
Guido van Rossum049cd901996-12-05 23:30:48 +0000755
756 /* Add some symbolic constants to the module */
757 d = PyModule_GetDict(m);
Guido van Rossum049cd901996-12-05 23:30:48 +0000758
Guido van Rossum55702f81997-01-06 22:57:52 +0000759 /* Export C API */
Christian Heimese93237d2007-12-19 02:37:44 +0000760 Py_TYPE(&Itype)=&PyType_Type;
761 Py_TYPE(&Otype)=&PyType_Type;
Raymond Hettinger352f9472003-04-24 15:50:11 +0000762 if (PyType_Ready(&Otype) < 0) return;
763 if (PyType_Ready(&Itype) < 0) return;
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000764 PyDict_SetItemString(d,"cStringIO_CAPI",
765 v = PyCObject_FromVoidPtr(&CAPI,NULL));
766 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000767
768 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000769 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
770 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000771
772 /* Maybe make certain warnings go away */
Jim Fultone60de4d2000-10-06 19:24:23 +0000773 if (0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000774}