1
2 #include "Python.h"
3 #include "import.h"
4 #include "cStringIO.h"
5 #include "structmember.h"
6
7 PyDoc_STRVAR(cStringIO_module_documentation,
8 "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"
12 "full generality of StringIO, but it provides enough for most\n"
13 "applications and is especially useful in conjunction with the\n"
14 "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"
23 " value=an_output_stream.getvalue()\n"
24 "\n"
25 " an_input_stream=StringIO(a_string)\n"
26 " spam=an_input_stream.readline()\n"
27 " spam=an_input_stream.read(5)\n"
28 " an_input_stream.seek(0) # OK, start over\n"
29 " 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"
33 "\n"
34 "cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n");
35
36 /* Declaration for file-like objects that manage data as strings
37
38 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 */
43
44 typedef struct {
45 PyObject_HEAD
46 char *buf;
47 Py_ssize_t pos, string_size;
48 } IOobject;
49
50 #define IOOOBJECT(O) ((IOobject*)(O))
51
52 /* Declarations for objects of type StringO */
53
54 typedef struct { /* Subtype of IOobject */
55 PyObject_HEAD
56 char *buf;
57 Py_ssize_t pos, string_size;
58
59 Py_ssize_t buf_size;
60 int softspace;
61 } Oobject;
62
63 /* Declarations for objects of type StringI */
64
65 typedef struct { /* Subtype of IOobject */
66 PyObject_HEAD
67 char *buf;
68 Py_ssize_t pos, string_size;
69 /* We store a reference to the object here in order to keep
70 the buffer alive during the lifetime of the Iobject. */
71 PyObject *pbuf;
72 } Iobject;
73
74 /* IOobject (common) methods */
75
76 PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing.");
77
78 static int
IO__opencheck(IOobject * self)79 IO__opencheck(IOobject *self) {
80 if (!self->buf) {
81 PyErr_SetString(PyExc_ValueError,
82 "I/O operation on closed file");
83 return 0;
84 }
85 return 1;
86 }
87
88 static PyObject *
IO_get_closed(IOobject * self,void * closure)89 IO_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
99 static PyGetSetDef file_getsetlist[] = {
100 {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"},
101 {0},
102 };
103
104 static PyObject *
IO_flush(IOobject * self,PyObject * unused)105 IO_flush(IOobject *self, PyObject *unused) {
106
107 if (!IO__opencheck(self)) return NULL;
108
109 Py_INCREF(Py_None);
110 return Py_None;
111 }
112
113 PyDoc_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");
118
119 static PyObject *
IO_cgetval(PyObject * self)120 IO_cgetval(PyObject *self) {
121 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
122 assert(IOOOBJECT(self)->pos >= 0);
123 return PyString_FromStringAndSize(((IOobject*)self)->buf,
124 ((IOobject*)self)->pos);
125 }
126
127 static PyObject *
IO_getval(IOobject * self,PyObject * args)128 IO_getval(IOobject *self, PyObject *args) {
129 PyObject *use_pos=Py_None;
130 Py_ssize_t s;
131
132 if (!IO__opencheck(self)) return NULL;
133 if (!PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL;
134
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;
141 assert(self->pos >= 0);
142 return PyString_FromStringAndSize(self->buf, s);
143 }
144
145 PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0");
146
147 static PyObject *
IO_isatty(IOobject * self,PyObject * unused)148 IO_isatty(IOobject *self, PyObject *unused) {
149 if (!IO__opencheck(self)) return NULL;
150 Py_INCREF(Py_False);
151 return Py_False;
152 }
153
154 PyDoc_STRVAR(IO_read__doc__,
155 "read([s]) -- Read s characters, or the rest of the string");
156
157 static int
IO_cread(PyObject * self,char ** output,Py_ssize_t n)158 IO_cread(PyObject *self, char **output, Py_ssize_t n) {
159 Py_ssize_t l;
160
161 if (!IO__opencheck(IOOOBJECT(self))) return -1;
162 assert(IOOOBJECT(self)->pos >= 0);
163 assert(IOOOBJECT(self)->string_size >= 0);
164 l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos;
165 if (n < 0 || n > l) {
166 n = l;
167 if (n < 0) n=0;
168 }
169
170 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
171 ((IOobject*)self)->pos += n;
172 return n;
173 }
174
175 static PyObject *
IO_read(IOobject * self,PyObject * args)176 IO_read(IOobject *self, PyObject *args) {
177 Py_ssize_t n = -1;
178 char *output = NULL;
179
180 if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL;
181
182 if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;
183
184 return PyString_FromStringAndSize(output, n);
185 }
186
187 PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");
188
189 static int
IO_creadline(PyObject * self,char ** output)190 IO_creadline(PyObject *self, char **output) {
191 char *n, *s;
192 Py_ssize_t l;
193
194 if (!IO__opencheck(IOOOBJECT(self))) return -1;
195
196 for (n = ((IOobject*)self)->buf + ((IOobject*)self)->pos,
197 s = ((IOobject*)self)->buf + ((IOobject*)self)->string_size;
198 n < s && *n != '\n'; n++);
199
200 if (n < s) n++;
201
202 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
203 l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos;
204
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;
210 return (int)l;
211 }
212
213 static PyObject *
IO_readline(IOobject * self,PyObject * args)214 IO_readline(IOobject *self, PyObject *args) {
215 int n, m=-1;
216 char *output;
217
218 if (args)
219 if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;
220
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 }
227 assert(IOOOBJECT(self)->pos >= 0);
228 return PyString_FromStringAndSize(output, n);
229 }
230
231 PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
232
233 static PyObject *
IO_readlines(IOobject * self,PyObject * args)234 IO_readlines(IOobject *self, PyObject *args) {
235 int n;
236 char *output;
237 PyObject *result, *line;
238 int hint = 0, length = 0;
239
240 if (!PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL;
241
242 result = PyList_New(0);
243 if (!result)
244 return NULL;
245
246 while (1){
247 if ( (n = IO_creadline((PyObject*)self,&output)) < 0)
248 goto err;
249 if (n == 0)
250 break;
251 line = PyString_FromStringAndSize (output, n);
252 if (!line)
253 goto err;
254 if (PyList_Append (result, line) == -1) {
255 Py_DECREF (line);
256 goto err;
257 }
258 Py_DECREF (line);
259 length += n;
260 if (hint > 0 && length >= hint)
261 break;
262 }
263 return result;
264 err:
265 Py_DECREF(result);
266 return NULL;
267 }
268
269 PyDoc_STRVAR(IO_reset__doc__,
270 "reset() -- Reset the file position to the beginning");
271
272 static PyObject *
IO_reset(IOobject * self,PyObject * unused)273 IO_reset(IOobject *self, PyObject *unused) {
274
275 if (!IO__opencheck(self)) return NULL;
276
277 self->pos = 0;
278
279 Py_INCREF(Py_None);
280 return Py_None;
281 }
282
283 PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
284
285 static PyObject *
IO_tell(IOobject * self,PyObject * unused)286 IO_tell(IOobject *self, PyObject *unused) {
287
288 if (!IO__opencheck(self)) return NULL;
289
290 assert(self->pos >= 0);
291 return PyInt_FromSsize_t(self->pos);
292 }
293
294 PyDoc_STRVAR(IO_truncate__doc__,
295 "truncate(): truncate the file at the current position.");
296
297 static PyObject *
IO_truncate(IOobject * self,PyObject * args)298 IO_truncate(IOobject *self, PyObject *args) {
299 Py_ssize_t pos = -1;
300
301 if (!IO__opencheck(self)) return NULL;
302 if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;
303
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 }
314
315 if (self->string_size > pos) self->string_size = pos;
316 self->pos = self->string_size;
317
318 Py_INCREF(Py_None);
319 return Py_None;
320 }
321
322 static PyObject *
IO_iternext(Iobject * self)323 IO_iternext(Iobject *self)
324 {
325 PyObject *next;
326 next = IO_readline((IOobject *)self, NULL);
327 if (!next)
328 return NULL;
329 if (!PyString_GET_SIZE(next)) {
330 Py_DECREF(next);
331 PyErr_SetNone(PyExc_StopIteration);
332 return NULL;
333 }
334 return next;
335 }
336
337
338
339
340 /* Read-write object methods */
341
342 PyDoc_STRVAR(IO_seek__doc__,
343 "seek(position) -- set the current position\n"
344 "seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
345
346 static PyObject *
IO_seek(Iobject * self,PyObject * args)347 IO_seek(Iobject *self, PyObject *args) {
348 Py_ssize_t position;
349 int mode = 0;
350
351 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
352 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
353 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 < 0) position=0;
363
364 self->pos=position;
365
366 Py_INCREF(Py_None);
367 return Py_None;
368 }
369
370 PyDoc_STRVAR(O_write__doc__,
371 "write(s) -- Write a string to the file"
372 "\n\nNote (hack:) writing None resets the buffer");
373
374
375 static int
O_cwrite(PyObject * self,const char * c,Py_ssize_t l)376 O_cwrite(PyObject *self, const char *c, Py_ssize_t l) {
377 Py_ssize_t newl;
378 Oobject *oself;
379 char *newbuf;
380
381 if (!IO__opencheck(IOOOBJECT(self))) return -1;
382 oself = (Oobject *)self;
383
384 newl = oself->pos+l;
385 if (newl >= oself->buf_size) {
386 oself->buf_size *= 2;
387 if (oself->buf_size <= newl) {
388 assert(newl + 1 < INT_MAX);
389 oself->buf_size = (int)(newl+1);
390 }
391 newbuf = (char*)realloc(oself->buf, oself->buf_size);
392 if (!newbuf) {
393 PyErr_SetString(PyExc_MemoryError,"out of memory");
394 free(oself->buf);
395 oself->buf = 0;
396 oself->buf_size = oself->pos = 0;
397 return -1;
398 }
399 oself->buf = newbuf;
400 }
401
402 if (oself->string_size < oself->pos) {
403 /* In case of overseek, pad with null bytes the buffer region between
404 the end of stream and the current position.
405
406 0 lo string_size hi
407 | |<---used--->|<----------available----------->|
408 | | <--to pad-->|<---to write---> |
409 0 buf position
410 */
411 memset(oself->buf + oself->string_size, '\0',
412 (oself->pos - oself->string_size) * sizeof(char));
413 }
414
415 memcpy(oself->buf+oself->pos,c,l);
416
417 assert(oself->pos + l < INT_MAX);
418 oself->pos += (int)l;
419
420 if (oself->string_size < oself->pos) {
421 oself->string_size = oself->pos;
422 }
423
424 return (int)l;
425 }
426
427 static PyObject *
O_write(Oobject * self,PyObject * args)428 O_write(Oobject *self, PyObject *args) {
429 char *c;
430 int l;
431
432 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
433
434 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
435
436 Py_INCREF(Py_None);
437 return Py_None;
438 }
439
440 PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
441
442 static PyObject *
O_close(Oobject * self,PyObject * unused)443 O_close(Oobject *self, PyObject *unused) {
444 if (self->buf != NULL) free(self->buf);
445 self->buf = NULL;
446
447 self->pos = self->string_size = self->buf_size = 0;
448
449 Py_INCREF(Py_None);
450 return Py_None;
451 }
452
453 PyDoc_STRVAR(O_writelines__doc__,
454 "writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
455 "\n"
456 "Note that newlines are not added. The sequence can be any iterable object\n"
457 "producing strings. This is equivalent to calling write() for each string.");
458 static PyObject *
O_writelines(Oobject * self,PyObject * args)459 O_writelines(Oobject *self, PyObject *args) {
460 PyObject *it, *s;
461
462 it = PyObject_GetIter(args);
463 if (it == NULL)
464 return NULL;
465 while ((s = PyIter_Next(it)) != NULL) {
466 Py_ssize_t n;
467 char *c;
468 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
469 Py_DECREF(it);
470 Py_DECREF(s);
471 return NULL;
472 }
473 if (O_cwrite((PyObject *)self, c, n) == -1) {
474 Py_DECREF(it);
475 Py_DECREF(s);
476 return NULL;
477 }
478 Py_DECREF(s);
479 }
480
481 Py_DECREF(it);
482
483 /* See if PyIter_Next failed */
484 if (PyErr_Occurred())
485 return NULL;
486
487 Py_RETURN_NONE;
488 }
489 static struct PyMethodDef O_methods[] = {
490 /* Common methods: */
491 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
492 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
493 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
494 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
495 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
496 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
497 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
498 {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__},
499 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
500 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
501
502 /* Read-write StringIO specific methods: */
503 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
504 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
505 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
506 {NULL, NULL} /* sentinel */
507 };
508
509 static PyMemberDef O_memberlist[] = {
510 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
511 "flag indicating that a space needs to be printed; used by print"},
512 /* getattr(f, "closed") is implemented without this table */
513 {NULL} /* Sentinel */
514 };
515
516 static void
O_dealloc(Oobject * self)517 O_dealloc(Oobject *self) {
518 if (self->buf != NULL)
519 free(self->buf);
520 PyObject_Del(self);
521 }
522
523 PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
524
525 static PyTypeObject Otype = {
526 PyVarObject_HEAD_INIT(NULL, 0)
527 "cStringIO.StringO", /*tp_name*/
528 sizeof(Oobject), /*tp_basicsize*/
529 0, /*tp_itemsize*/
530 /* methods */
531 (destructor)O_dealloc, /*tp_dealloc*/
532 0, /*tp_print*/
533 0, /*tp_getattr */
534 0, /*tp_setattr */
535 0, /*tp_compare*/
536 0, /*tp_repr*/
537 0, /*tp_as_number*/
538 0, /*tp_as_sequence*/
539 0, /*tp_as_mapping*/
540 0, /*tp_hash*/
541 0 , /*tp_call*/
542 0, /*tp_str*/
543 0, /*tp_getattro */
544 0, /*tp_setattro */
545 0, /*tp_as_buffer */
546 Py_TPFLAGS_DEFAULT, /*tp_flags*/
547 Otype__doc__, /*tp_doc */
548 0, /*tp_traverse */
549 0, /*tp_clear */
550 0, /*tp_richcompare */
551 0, /*tp_weaklistoffset */
552 PyObject_SelfIter, /*tp_iter */
553 (iternextfunc)IO_iternext, /*tp_iternext */
554 O_methods, /*tp_methods */
555 O_memberlist, /*tp_members */
556 file_getsetlist, /*tp_getset */
557 };
558
559 static PyObject *
newOobject(int size)560 newOobject(int size) {
561 Oobject *self;
562
563 self = PyObject_New(Oobject, &Otype);
564 if (self == NULL)
565 return NULL;
566 self->pos=0;
567 self->string_size = 0;
568 self->softspace = 0;
569
570 self->buf = (char *)malloc(size);
571 if (!self->buf) {
572 PyErr_SetString(PyExc_MemoryError,"out of memory");
573 self->buf_size = 0;
574 Py_DECREF(self);
575 return NULL;
576 }
577
578 self->buf_size=size;
579 return (PyObject*)self;
580 }
581
582 /* End of code for StringO objects */
583 /* -------------------------------------------------------- */
584
585 static PyObject *
I_close(Iobject * self,PyObject * unused)586 I_close(Iobject *self, PyObject *unused) {
587 Py_CLEAR(self->pbuf);
588 self->buf = NULL;
589
590 self->pos = self->string_size = 0;
591
592 Py_INCREF(Py_None);
593 return Py_None;
594 }
595
596 static struct PyMethodDef I_methods[] = {
597 /* Common methods: */
598 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
599 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
600 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
601 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
602 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
603 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
604 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
605 {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__},
606 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
607 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
608
609 /* Read-only StringIO specific methods: */
610 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
611 {NULL, NULL}
612 };
613
614 static void
I_dealloc(Iobject * self)615 I_dealloc(Iobject *self) {
616 Py_XDECREF(self->pbuf);
617 PyObject_Del(self);
618 }
619
620
621 PyDoc_STRVAR(Itype__doc__,
622 "Simple type for treating strings as input file streams");
623
624 static PyTypeObject Itype = {
625 PyVarObject_HEAD_INIT(NULL, 0)
626 "cStringIO.StringI", /*tp_name*/
627 sizeof(Iobject), /*tp_basicsize*/
628 0, /*tp_itemsize*/
629 /* methods */
630 (destructor)I_dealloc, /*tp_dealloc*/
631 0, /*tp_print*/
632 0, /* tp_getattr */
633 0, /*tp_setattr*/
634 0, /*tp_compare*/
635 0, /*tp_repr*/
636 0, /*tp_as_number*/
637 0, /*tp_as_sequence*/
638 0, /*tp_as_mapping*/
639 0, /*tp_hash*/
640 0, /*tp_call*/
641 0, /*tp_str*/
642 0, /* tp_getattro */
643 0, /* tp_setattro */
644 0, /* tp_as_buffer */
645 Py_TPFLAGS_DEFAULT, /* tp_flags */
646 Itype__doc__, /* tp_doc */
647 0, /* tp_traverse */
648 0, /* tp_clear */
649 0, /* tp_richcompare */
650 0, /* tp_weaklistoffset */
651 PyObject_SelfIter, /* tp_iter */
652 (iternextfunc)IO_iternext, /* tp_iternext */
653 I_methods, /* tp_methods */
654 0, /* tp_members */
655 file_getsetlist, /* tp_getset */
656 };
657
658 static PyObject *
newIobject(PyObject * s)659 newIobject(PyObject *s) {
660 Iobject *self;
661 char *buf;
662 Py_ssize_t size;
663
664 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
665 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
666 s->ob_type->tp_name);
667 return NULL;
668 }
669
670 self = PyObject_New(Iobject, &Itype);
671 if (!self) return NULL;
672 Py_INCREF(s);
673 self->buf=buf;
674 self->string_size=size;
675 self->pbuf=s;
676 self->pos=0;
677
678 return (PyObject*)self;
679 }
680
681 /* End of code for StringI objects */
682 /* -------------------------------------------------------- */
683
684
685 PyDoc_STRVAR(IO_StringIO__doc__,
686 "StringIO([s]) -- Return a StringIO-like stream for reading or writing");
687
688 static PyObject *
IO_StringIO(PyObject * self,PyObject * args)689 IO_StringIO(PyObject *self, PyObject *args) {
690 PyObject *s=0;
691
692 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
693
694 if (s) return newIobject(s);
695 return newOobject(128);
696 }
697
698 /* List of methods defined in the module */
699
700 static struct PyMethodDef IO_methods[] = {
701 {"StringIO", (PyCFunction)IO_StringIO,
702 METH_VARARGS, IO_StringIO__doc__},
703 {NULL, NULL} /* sentinel */
704 };
705
706
707 /* Initialization function for the module (*must* be called initcStringIO) */
708
709 static struct PycStringIO_CAPI CAPI = {
710 IO_cread,
711 IO_creadline,
712 O_cwrite,
713 IO_cgetval,
714 newOobject,
715 newIobject,
716 &Itype,
717 &Otype,
718 };
719
720 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
721 #define PyMODINIT_FUNC void
722 #endif
723 PyMODINIT_FUNC
initcStringIO(void)724 initcStringIO(void) {
725 PyObject *m, *d, *v;
726
727
728 /* Create the module and add the functions */
729 m = Py_InitModule4("cStringIO", IO_methods,
730 cStringIO_module_documentation,
731 (PyObject*)NULL,PYTHON_API_VERSION);
732 if (m == NULL) return;
733
734 /* Add some symbolic constants to the module */
735 d = PyModule_GetDict(m);
736
737 /* Export C API */
738 Py_TYPE(&Itype)=&PyType_Type;
739 Py_TYPE(&Otype)=&PyType_Type;
740 if (PyType_Ready(&Otype) < 0) return;
741 if (PyType_Ready(&Itype) < 0) return;
742 v = PyCapsule_New(&CAPI, PycStringIO_CAPSULE_NAME, NULL);
743 PyDict_SetItemString(d,"cStringIO_CAPI", v);
744 Py_XDECREF(v);
745
746 /* Export Types */
747 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
748 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
749
750 /* Maybe make certain warnings go away */
751 if (0) PycString_IMPORT;
752 }
753