Issue #7117, continued: Remove substitution of %g-style formatting for
[python.git] / Modules / cStringIO.c
blob237d8c2f1f1da271758c1d5d654fe7c2a7cb0220
2 #include "Python.h"
3 #include "import.h"
4 #include "cStringIO.h"
5 #include "structmember.h"
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");
36 /* Declaration for file-like objects that manage data as strings
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.
44 typedef struct {
45 PyObject_HEAD
46 char *buf;
47 Py_ssize_t pos, string_size;
48 } IOobject;
50 #define IOOOBJECT(O) ((IOobject*)(O))
52 /* Declarations for objects of type StringO */
54 typedef struct { /* Subtype of IOobject */
55 PyObject_HEAD
56 char *buf;
57 Py_ssize_t pos, string_size;
59 Py_ssize_t buf_size;
60 int softspace;
61 } Oobject;
63 /* Declarations for objects of type StringI */
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;
74 /* IOobject (common) methods */
76 PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing.");
78 static int
79 IO__opencheck(IOobject *self) {
80 if (!self->buf) {
81 PyErr_SetString(PyExc_ValueError,
82 "I/O operation on closed file");
83 return 0;
85 return 1;
88 static PyObject *
89 IO_get_closed(IOobject *self, void *closure)
91 PyObject *result = Py_False;
93 if (self->buf == NULL)
94 result = Py_True;
95 Py_INCREF(result);
96 return result;
99 static PyGetSetDef file_getsetlist[] = {
100 {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"},
101 {0},
104 static PyObject *
105 IO_flush(IOobject *self, PyObject *unused) {
107 if (!IO__opencheck(self)) return NULL;
109 Py_INCREF(Py_None);
110 return Py_None;
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");
119 static PyObject *
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);
127 static PyObject *
128 IO_getval(IOobject *self, PyObject *args) {
129 PyObject *use_pos=Py_None;
130 Py_ssize_t s;
132 if (!IO__opencheck(self)) return NULL;
133 if (!PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL;
135 if (PyObject_IsTrue(use_pos)) {
136 s=self->pos;
137 if (s > self->string_size) s=self->string_size;
139 else
140 s=self->string_size;
141 assert(self->pos >= 0);
142 return PyString_FromStringAndSize(self->buf, s);
145 PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0");
147 static PyObject *
148 IO_isatty(IOobject *self, PyObject *unused) {
149 if (!IO__opencheck(self)) return NULL;
150 Py_INCREF(Py_False);
151 return Py_False;
154 PyDoc_STRVAR(IO_read__doc__,
155 "read([s]) -- Read s characters, or the rest of the string");
157 static int
158 IO_cread(PyObject *self, char **output, Py_ssize_t n) {
159 Py_ssize_t l;
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;
170 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
171 ((IOobject*)self)->pos += n;
172 return n;
175 static PyObject *
176 IO_read(IOobject *self, PyObject *args) {
177 Py_ssize_t n = -1;
178 char *output = NULL;
180 if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL;
182 if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;
184 return PyString_FromStringAndSize(output, n);
187 PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");
189 static int
190 IO_creadline(PyObject *self, char **output) {
191 char *n, *s;
192 Py_ssize_t l;
194 if (!IO__opencheck(IOOOBJECT(self))) return -1;
196 for (n = ((IOobject*)self)->buf + ((IOobject*)self)->pos,
197 s = ((IOobject*)self)->buf + ((IOobject*)self)->string_size;
198 n < s && *n != '\n'; n++);
200 if (n < s) n++;
202 *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;
203 l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos;
205 assert(IOOOBJECT(self)->pos <= PY_SSIZE_T_MAX - l);
206 assert(IOOOBJECT(self)->pos >= 0);
207 assert(IOOOBJECT(self)->string_size >= 0);
209 ((IOobject*)self)->pos += l;
210 return (int)l;
213 static PyObject *
214 IO_readline(IOobject *self, PyObject *args) {
215 int n, m=-1;
216 char *output;
218 if (args)
219 if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;
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;
227 assert(IOOOBJECT(self)->pos >= 0);
228 return PyString_FromStringAndSize(output, n);
231 PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
233 static PyObject *
234 IO_readlines(IOobject *self, PyObject *args) {
235 int n;
236 char *output;
237 PyObject *result, *line;
238 int hint = 0, length = 0;
240 if (!PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL;
242 result = PyList_New(0);
243 if (!result)
244 return NULL;
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;
258 Py_DECREF (line);
259 length += n;
260 if (hint > 0 && length >= hint)
261 break;
263 return result;
264 err:
265 Py_DECREF(result);
266 return NULL;
269 PyDoc_STRVAR(IO_reset__doc__,
270 "reset() -- Reset the file position to the beginning");
272 static PyObject *
273 IO_reset(IOobject *self, PyObject *unused) {
275 if (!IO__opencheck(self)) return NULL;
277 self->pos = 0;
279 Py_INCREF(Py_None);
280 return Py_None;
283 PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
285 static PyObject *
286 IO_tell(IOobject *self, PyObject *unused) {
288 if (!IO__opencheck(self)) return NULL;
290 assert(self->pos >= 0);
291 return PyInt_FromSsize_t(self->pos);
294 PyDoc_STRVAR(IO_truncate__doc__,
295 "truncate(): truncate the file at the current position.");
297 static PyObject *
298 IO_truncate(IOobject *self, PyObject *args) {
299 Py_ssize_t pos = -1;
301 if (!IO__opencheck(self)) return NULL;
302 if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;
304 if (PyTuple_Size(args) == 0) {
305 /* No argument passed, truncate to current position */
306 pos = self->pos;
309 if (pos < 0) {
310 errno = EINVAL;
311 PyErr_SetFromErrno(PyExc_IOError);
312 return NULL;
315 if (self->string_size > pos) self->string_size = pos;
316 self->pos = self->string_size;
318 Py_INCREF(Py_None);
319 return Py_None;
322 static PyObject *
323 IO_iternext(Iobject *self)
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;
334 return next;
340 /* Read-write object methods */
342 PyDoc_STRVAR(O_seek__doc__,
343 "seek(position) -- set the current position\n"
344 "seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
346 static PyObject *
347 O_seek(Oobject *self, PyObject *args) {
348 Py_ssize_t position;
349 int mode = 0;
351 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
352 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
353 return NULL;
355 if (mode == 2) {
356 position += self->string_size;
358 else if (mode == 1) {
359 position += self->pos;
362 if (position > self->buf_size) {
363 char *newbuf;
364 self->buf_size*=2;
365 if (self->buf_size <= position) self->buf_size=position+1;
366 newbuf = (char*) realloc(self->buf,self->buf_size);
367 if (!newbuf) {
368 free(self->buf);
369 self->buf = 0;
370 self->buf_size=self->pos=0;
371 return PyErr_NoMemory();
373 self->buf = newbuf;
375 else if (position < 0) position=0;
377 self->pos=position;
379 while (--position >= self->string_size) self->buf[position]=0;
381 Py_INCREF(Py_None);
382 return Py_None;
385 PyDoc_STRVAR(O_write__doc__,
386 "write(s) -- Write a string to the file"
387 "\n\nNote (hack:) writing None resets the buffer");
390 static int
391 O_cwrite(PyObject *self, const char *c, Py_ssize_t l) {
392 Py_ssize_t newl;
393 Oobject *oself;
394 char *newbuf;
396 if (!IO__opencheck(IOOOBJECT(self))) return -1;
397 oself = (Oobject *)self;
399 newl = oself->pos+l;
400 if (newl >= oself->buf_size) {
401 oself->buf_size *= 2;
402 if (oself->buf_size <= newl) {
403 assert(newl + 1 < INT_MAX);
404 oself->buf_size = (int)(newl+1);
406 newbuf = (char*)realloc(oself->buf, oself->buf_size);
407 if (!newbuf) {
408 PyErr_SetString(PyExc_MemoryError,"out of memory");
409 free(oself->buf);
410 oself->buf = 0;
411 oself->buf_size = oself->pos = 0;
412 return -1;
414 oself->buf = newbuf;
417 memcpy(oself->buf+oself->pos,c,l);
419 assert(oself->pos + l < INT_MAX);
420 oself->pos += (int)l;
422 if (oself->string_size < oself->pos) {
423 oself->string_size = oself->pos;
426 return (int)l;
429 static PyObject *
430 O_write(Oobject *self, PyObject *args) {
431 char *c;
432 int l;
434 if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL;
436 if (O_cwrite((PyObject*)self,c,l) < 0) return NULL;
438 Py_INCREF(Py_None);
439 return Py_None;
442 PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
444 static PyObject *
445 O_close(Oobject *self, PyObject *unused) {
446 if (self->buf != NULL) free(self->buf);
447 self->buf = NULL;
449 self->pos = self->string_size = self->buf_size = 0;
451 Py_INCREF(Py_None);
452 return Py_None;
455 PyDoc_STRVAR(O_writelines__doc__,
456 "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.");
460 static PyObject *
461 O_writelines(Oobject *self, PyObject *args) {
462 PyObject *it, *s;
464 it = PyObject_GetIter(args);
465 if (it == NULL)
466 return NULL;
467 while ((s = PyIter_Next(it)) != NULL) {
468 Py_ssize_t n;
469 char *c;
470 if (PyString_AsStringAndSize(s, &c, &n) == -1) {
471 Py_DECREF(it);
472 Py_DECREF(s);
473 return NULL;
475 if (O_cwrite((PyObject *)self, c, n) == -1) {
476 Py_DECREF(it);
477 Py_DECREF(s);
478 return NULL;
480 Py_DECREF(s);
483 Py_DECREF(it);
485 /* See if PyIter_Next failed */
486 if (PyErr_Occurred())
487 return NULL;
489 Py_RETURN_NONE;
491 static struct PyMethodDef O_methods[] = {
492 /* Common methods: */
493 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
494 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
495 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
496 {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__},
497 {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},
498 {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},
499 {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__},
500 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
501 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
503 /* Read-write StringIO specific methods: */
504 {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__},
505 {"seek", (PyCFunction)O_seek, METH_VARARGS, O_seek__doc__},
506 {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__},
507 {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__},
508 {NULL, NULL} /* sentinel */
511 static PyMemberDef O_memberlist[] = {
512 {"softspace", T_INT, offsetof(Oobject, softspace), 0,
513 "flag indicating that a space needs to be printed; used by print"},
514 /* getattr(f, "closed") is implemented without this table */
515 {NULL} /* Sentinel */
518 static void
519 O_dealloc(Oobject *self) {
520 if (self->buf != NULL)
521 free(self->buf);
522 PyObject_Del(self);
525 PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
527 static PyTypeObject Otype = {
528 PyVarObject_HEAD_INIT(NULL, 0)
529 "cStringIO.StringO", /*tp_name*/
530 sizeof(Oobject), /*tp_basicsize*/
531 0, /*tp_itemsize*/
532 /* methods */
533 (destructor)O_dealloc, /*tp_dealloc*/
534 0, /*tp_print*/
535 0, /*tp_getattr */
536 0, /*tp_setattr */
537 0, /*tp_compare*/
538 0, /*tp_repr*/
539 0, /*tp_as_number*/
540 0, /*tp_as_sequence*/
541 0, /*tp_as_mapping*/
542 0, /*tp_hash*/
543 0 , /*tp_call*/
544 0, /*tp_str*/
545 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 */
557 O_memberlist, /*tp_members */
558 file_getsetlist, /*tp_getset */
561 static PyObject *
562 newOobject(int size) {
563 Oobject *self;
565 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;
572 self->buf = (char *)malloc(size);
573 if (!self->buf) {
574 PyErr_SetString(PyExc_MemoryError,"out of memory");
575 self->buf_size = 0;
576 Py_DECREF(self);
577 return NULL;
580 self->buf_size=size;
581 return (PyObject*)self;
584 /* End of code for StringO objects */
585 /* -------------------------------------------------------- */
587 static PyObject *
588 I_close(Iobject *self, PyObject *unused) {
589 Py_CLEAR(self->pbuf);
590 self->buf = NULL;
592 self->pos = self->string_size = 0;
594 Py_INCREF(Py_None);
595 return Py_None;
598 static PyObject *
599 I_seek(Iobject *self, PyObject *args) {
600 Py_ssize_t position;
601 int mode = 0;
603 if (!IO__opencheck(IOOOBJECT(self))) return NULL;
604 if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))
605 return NULL;
607 if (mode == 2) position += self->string_size;
608 else if (mode == 1) position += self->pos;
610 if (position < 0) position=0;
612 self->pos=position;
614 Py_INCREF(Py_None);
615 return Py_None;
618 static struct PyMethodDef I_methods[] = {
619 /* Common methods: */
620 {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},
621 {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__},
622 {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__},
623 {"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__},
627 {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__},
628 {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},
630 /* Read-only StringIO specific methods: */
631 {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__},
632 {"seek", (PyCFunction)I_seek, METH_VARARGS, O_seek__doc__},
633 {NULL, NULL}
636 static void
637 I_dealloc(Iobject *self) {
638 Py_XDECREF(self->pbuf);
639 PyObject_Del(self);
643 PyDoc_STRVAR(Itype__doc__,
644 "Simple type for treating strings as input file streams");
646 static PyTypeObject Itype = {
647 PyVarObject_HEAD_INIT(NULL, 0)
648 "cStringIO.StringI", /*tp_name*/
649 sizeof(Iobject), /*tp_basicsize*/
650 0, /*tp_itemsize*/
651 /* methods */
652 (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 */
680 static PyObject *
681 newIobject(PyObject *s) {
682 Iobject *self;
683 char *buf;
684 Py_ssize_t size;
686 if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
687 PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
688 s->ob_type->tp_name);
689 return NULL;
692 self = PyObject_New(Iobject, &Itype);
693 if (!self) return NULL;
694 Py_INCREF(s);
695 self->buf=buf;
696 self->string_size=size;
697 self->pbuf=s;
698 self->pos=0;
700 return (PyObject*)self;
703 /* End of code for StringI objects */
704 /* -------------------------------------------------------- */
707 PyDoc_STRVAR(IO_StringIO__doc__,
708 "StringIO([s]) -- Return a StringIO-like stream for reading or writing");
710 static PyObject *
711 IO_StringIO(PyObject *self, PyObject *args) {
712 PyObject *s=0;
714 if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;
716 if (s) return newIobject(s);
717 return newOobject(128);
720 /* List of methods defined in the module */
722 static struct PyMethodDef IO_methods[] = {
723 {"StringIO", (PyCFunction)IO_StringIO,
724 METH_VARARGS, IO_StringIO__doc__},
725 {NULL, NULL} /* sentinel */
729 /* Initialization function for the module (*must* be called initcStringIO) */
731 static struct PycStringIO_CAPI CAPI = {
732 IO_cread,
733 IO_creadline,
734 O_cwrite,
735 IO_cgetval,
736 newOobject,
737 newIobject,
738 &Itype,
739 &Otype,
742 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
743 #define PyMODINIT_FUNC void
744 #endif
745 PyMODINIT_FUNC
746 initcStringIO(void) {
747 PyObject *m, *d, *v;
750 /* Create the module and add the functions */
751 m = Py_InitModule4("cStringIO", IO_methods,
752 cStringIO_module_documentation,
753 (PyObject*)NULL,PYTHON_API_VERSION);
754 if (m == NULL) return;
756 /* Add some symbolic constants to the module */
757 d = PyModule_GetDict(m);
759 /* Export C API */
760 Py_TYPE(&Itype)=&PyType_Type;
761 Py_TYPE(&Otype)=&PyType_Type;
762 if (PyType_Ready(&Otype) < 0) return;
763 if (PyType_Ready(&Itype) < 0) return;
764 PyDict_SetItemString(d,"cStringIO_CAPI",
765 v = PyCObject_FromVoidPtr(&CAPI,NULL));
766 Py_XDECREF(v);
768 /* Export Types */
769 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
770 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
772 /* Maybe make certain warnings go away */
773 if (0) PycString_IMPORT;