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