5 #include "structmember.h"
7 PyDoc_STRVAR(cStringIO_module_documentation
,
8 "A simple fast partial StringIO replacement.\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"
18 " from cStringIO import StringIO\n"
20 " an_output_stream=StringIO()\n"
21 " an_output_stream.write(some_stuff)\n"
23 " value=an_output_stream.getvalue()\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"
31 "If someone else wants to provide a more complete implementation,\n"
34 "cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n");
36 #define UNLESS(E) if (!(E))
39 /* Declaration for file-like objects that manage data as strings
41 The IOobject type should be though of as a common base type for
42 Iobjects, which provide input (read-only) StringIO objects and
43 Oobjects, which provide read-write objects. Most of the methods
44 depend only on common data.
53 #define IOOOBJECT(O) ((IOobject*)(O))
55 /* Declarations for objects of type StringO */
57 typedef struct { /* Subtype of IOobject */
62 int buf_size
, softspace
;
65 /* Declarations for objects of type StringI */
67 typedef struct { /* Subtype of IOobject */
71 /* We store a reference to the object here in order to keep
72 the buffer alive during the lifetime of the Iobject. */
76 /* IOobject (common) methods */
78 PyDoc_STRVAR(IO_flush__doc__
, "flush(): does nothing.");
81 IO__opencheck(IOobject
*self
) {
83 PyErr_SetString(PyExc_ValueError
,
84 "I/O operation on closed file");
91 IO_get_closed(IOobject
*self
, void *closure
)
93 PyObject
*result
= Py_False
;
95 if (self
->buf
== NULL
)
101 static PyGetSetDef file_getsetlist
[] = {
102 {"closed", (getter
)IO_get_closed
, NULL
, "True if the file is closed"},
107 IO_flush(IOobject
*self
, PyObject
*unused
) {
109 UNLESS (IO__opencheck(self
)) return NULL
;
115 PyDoc_STRVAR(IO_getval__doc__
,
116 "getvalue([use_pos]) -- Get the string value."
118 "If use_pos is specified and is a true value, then the string returned\n"
119 "will include only the text up to the current file position.\n");
122 IO_cgetval(PyObject
*self
) {
123 UNLESS (IO__opencheck(IOOOBJECT(self
))) return NULL
;
124 return PyString_FromStringAndSize(((IOobject
*)self
)->buf
,
125 ((IOobject
*)self
)->pos
);
129 IO_getval(IOobject
*self
, PyObject
*args
) {
130 PyObject
*use_pos
=Py_None
;
133 UNLESS (IO__opencheck(self
)) return NULL
;
134 UNLESS (PyArg_UnpackTuple(args
,"getval", 0, 1,&use_pos
)) return NULL
;
136 if (PyObject_IsTrue(use_pos
)) {
138 if (s
> self
->string_size
) s
=self
->string_size
;
142 return PyString_FromStringAndSize(self
->buf
, s
);
145 PyDoc_STRVAR(IO_isatty__doc__
, "isatty(): always returns 0");
148 IO_isatty(IOobject
*self
, PyObject
*unused
) {
153 PyDoc_STRVAR(IO_read__doc__
,
154 "read([s]) -- Read s characters, or the rest of the string");
157 IO_cread(PyObject
*self
, char **output
, int n
) {
160 UNLESS (IO__opencheck(IOOOBJECT(self
))) return -1;
161 l
= ((IOobject
*)self
)->string_size
- ((IOobject
*)self
)->pos
;
162 if (n
< 0 || n
> l
) {
167 *output
=((IOobject
*)self
)->buf
+ ((IOobject
*)self
)->pos
;
168 ((IOobject
*)self
)->pos
+= n
;
173 IO_read(IOobject
*self
, PyObject
*args
) {
177 UNLESS (PyArg_ParseTuple(args
, "|i:read", &n
)) return NULL
;
179 if ( (n
=IO_cread((PyObject
*)self
,&output
,n
)) < 0) return NULL
;
181 return PyString_FromStringAndSize(output
, n
);
184 PyDoc_STRVAR(IO_readline__doc__
, "readline() -- Read one line");
187 IO_creadline(PyObject
*self
, char **output
) {
191 UNLESS (IO__opencheck(IOOOBJECT(self
))) return -1;
193 for (n
= ((IOobject
*)self
)->buf
+ ((IOobject
*)self
)->pos
,
194 s
= ((IOobject
*)self
)->buf
+ ((IOobject
*)self
)->string_size
;
195 n
< s
&& *n
!= '\n'; n
++);
198 *output
=((IOobject
*)self
)->buf
+ ((IOobject
*)self
)->pos
;
199 l
= n
- ((IOobject
*)self
)->buf
- ((IOobject
*)self
)->pos
;
200 ((IOobject
*)self
)->pos
+= l
;
205 IO_readline(IOobject
*self
, PyObject
*args
) {
210 UNLESS (PyArg_ParseTuple(args
, "|i:readline", &m
)) return NULL
;
212 if( (n
=IO_creadline((PyObject
*)self
,&output
)) < 0) return NULL
;
213 if (m
>= 0 && m
< n
) {
218 return PyString_FromStringAndSize(output
, n
);
221 PyDoc_STRVAR(IO_readlines__doc__
, "readlines() -- Read all lines");
224 IO_readlines(IOobject
*self
, PyObject
*args
) {
227 PyObject
*result
, *line
;
228 int hint
= 0, length
= 0;
230 UNLESS (PyArg_ParseTuple(args
, "|i:readlines", &hint
)) return NULL
;
232 result
= PyList_New(0);
237 if ( (n
= IO_creadline((PyObject
*)self
,&output
)) < 0)
241 line
= PyString_FromStringAndSize (output
, n
);
244 if (PyList_Append (result
, line
) == -1) {
250 if (hint
> 0 && length
>= hint
)
259 PyDoc_STRVAR(IO_reset__doc__
,
260 "reset() -- Reset the file position to the beginning");
263 IO_reset(IOobject
*self
, PyObject
*unused
) {
265 UNLESS (IO__opencheck(self
)) return NULL
;
273 PyDoc_STRVAR(IO_tell__doc__
, "tell() -- get the current position.");
276 IO_tell(IOobject
*self
, PyObject
*unused
) {
278 UNLESS (IO__opencheck(self
)) return NULL
;
280 return PyInt_FromLong(self
->pos
);
283 PyDoc_STRVAR(IO_truncate__doc__
,
284 "truncate(): truncate the file at the current position.");
287 IO_truncate(IOobject
*self
, PyObject
*args
) {
290 UNLESS (IO__opencheck(self
)) return NULL
;
291 UNLESS (PyArg_ParseTuple(args
, "|i:truncate", &pos
)) return NULL
;
292 if (pos
< 0) pos
= self
->pos
;
294 if (self
->string_size
> pos
) self
->string_size
= pos
;
295 self
->pos
= self
->string_size
;
302 IO_iternext(Iobject
*self
)
305 next
= IO_readline((IOobject
*)self
, NULL
);
308 if (!PyString_GET_SIZE(next
)) {
310 PyErr_SetNone(PyExc_StopIteration
);
319 /* Read-write object methods */
321 PyDoc_STRVAR(O_seek__doc__
,
322 "seek(position) -- set the current position\n"
323 "seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
326 O_seek(Oobject
*self
, PyObject
*args
) {
327 int position
, mode
= 0;
329 UNLESS (IO__opencheck(IOOOBJECT(self
))) return NULL
;
330 UNLESS (PyArg_ParseTuple(args
, "i|i:seek", &position
, &mode
))
334 position
+= self
->string_size
;
336 else if (mode
== 1) {
337 position
+= self
->pos
;
340 if (position
> self
->buf_size
) {
342 if (self
->buf_size
<= position
) self
->buf_size
=position
+1;
343 UNLESS (self
->buf
= (char*)
344 realloc(self
->buf
,self
->buf_size
)) {
345 self
->buf_size
=self
->pos
=0;
346 return PyErr_NoMemory();
349 else if (position
< 0) position
=0;
353 while (--position
>= self
->string_size
) self
->buf
[position
]=0;
359 PyDoc_STRVAR(O_write__doc__
,
360 "write(s) -- Write a string to the file"
361 "\n\nNote (hack:) writing None resets the buffer");
365 O_cwrite(PyObject
*self
, const char *c
, int l
) {
369 UNLESS (IO__opencheck(IOOOBJECT(self
))) return -1;
370 oself
= (Oobject
*)self
;
373 if (newl
>= oself
->buf_size
) {
374 oself
->buf_size
*= 2;
375 if (oself
->buf_size
<= newl
)
376 oself
->buf_size
= newl
+1;
378 (char*)realloc(oself
->buf
, oself
->buf_size
)) {
379 PyErr_SetString(PyExc_MemoryError
,"out of memory");
380 oself
->buf_size
= oself
->pos
= 0;
385 memcpy(oself
->buf
+oself
->pos
,c
,l
);
389 if (oself
->string_size
< oself
->pos
) {
390 oself
->string_size
= oself
->pos
;
397 O_write(Oobject
*self
, PyObject
*args
) {
401 UNLESS (PyArg_ParseTuple(args
, "t#:write", &c
, &l
)) return NULL
;
403 if (O_cwrite((PyObject
*)self
,c
,l
) < 0) return NULL
;
409 PyDoc_STRVAR(O_close__doc__
, "close(): explicitly release resources held.");
412 O_close(Oobject
*self
, PyObject
*unused
) {
413 if (self
->buf
!= NULL
) free(self
->buf
);
416 self
->pos
= self
->string_size
= self
->buf_size
= 0;
422 PyDoc_STRVAR(O_writelines__doc__
,
423 "writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
425 "Note that newlines are not added. The sequence can be any iterable object\n"
426 "producing strings. This is equivalent to calling write() for each string.");
428 O_writelines(Oobject
*self
, PyObject
*args
) {
431 it
= PyObject_GetIter(args
);
434 while ((s
= PyIter_Next(it
)) != NULL
) {
437 if (PyString_AsStringAndSize(s
, &c
, &n
) == -1) {
442 if (O_cwrite((PyObject
*)self
, c
, n
) == -1) {
452 /* See if PyIter_Next failed */
453 if (PyErr_Occurred())
458 static struct PyMethodDef O_methods
[] = {
459 /* Common methods: */
460 {"flush", (PyCFunction
)IO_flush
, METH_NOARGS
, IO_flush__doc__
},
461 {"getvalue", (PyCFunction
)IO_getval
, METH_VARARGS
, IO_getval__doc__
},
462 {"isatty", (PyCFunction
)IO_isatty
, METH_NOARGS
, IO_isatty__doc__
},
463 {"read", (PyCFunction
)IO_read
, METH_VARARGS
, IO_read__doc__
},
464 {"readline", (PyCFunction
)IO_readline
, METH_VARARGS
, IO_readline__doc__
},
465 {"readlines", (PyCFunction
)IO_readlines
,METH_VARARGS
, IO_readlines__doc__
},
466 {"reset", (PyCFunction
)IO_reset
, METH_NOARGS
, IO_reset__doc__
},
467 {"tell", (PyCFunction
)IO_tell
, METH_NOARGS
, IO_tell__doc__
},
468 {"truncate", (PyCFunction
)IO_truncate
, METH_VARARGS
, IO_truncate__doc__
},
470 /* Read-write StringIO specific methods: */
471 {"close", (PyCFunction
)O_close
, METH_NOARGS
, O_close__doc__
},
472 {"seek", (PyCFunction
)O_seek
, METH_VARARGS
, O_seek__doc__
},
473 {"write", (PyCFunction
)O_write
, METH_VARARGS
, O_write__doc__
},
474 {"writelines", (PyCFunction
)O_writelines
, METH_O
, O_writelines__doc__
},
475 {NULL
, NULL
} /* sentinel */
478 static PyMemberDef O_memberlist
[] = {
479 {"softspace", T_INT
, offsetof(Oobject
, softspace
), 0,
480 "flag indicating that a space needs to be printed; used by print"},
481 /* getattr(f, "closed") is implemented without this table */
482 {NULL
} /* Sentinel */
486 O_dealloc(Oobject
*self
) {
487 if (self
->buf
!= NULL
)
492 PyDoc_STRVAR(Otype__doc__
, "Simple type for output to strings.");
494 static PyTypeObject Otype
= {
495 PyObject_HEAD_INIT(NULL
)
497 "cStringIO.StringO", /*tp_name*/
498 sizeof(Oobject
), /*tp_basicsize*/
501 (destructor
)O_dealloc
, /*tp_dealloc*/
502 (printfunc
)0, /*tp_print*/
505 (cmpfunc
)0, /*tp_compare*/
506 (reprfunc
)0, /*tp_repr*/
508 0, /*tp_as_sequence*/
510 (hashfunc
)0, /*tp_hash*/
511 (ternaryfunc
)0, /*tp_call*/
512 (reprfunc
)0, /*tp_str*/
516 Py_TPFLAGS_DEFAULT
, /*tp_flags*/
517 Otype__doc__
, /*tp_doc */
520 0, /*tp_richcompare */
521 0, /*tp_weaklistoffset */
522 PyObject_SelfIter
, /*tp_iter */
523 (iternextfunc
)IO_iternext
, /*tp_iternext */
524 O_methods
, /*tp_methods */
525 O_memberlist
, /*tp_members */
526 file_getsetlist
, /*tp_getset */
530 newOobject(int size
) {
533 self
= PyObject_New(Oobject
, &Otype
);
537 self
->string_size
= 0;
540 UNLESS (self
->buf
= (char *)malloc(size
)) {
541 PyErr_SetString(PyExc_MemoryError
,"out of memory");
547 return (PyObject
*)self
;
550 /* End of code for StringO objects */
551 /* -------------------------------------------------------- */
554 I_close(Iobject
*self
, PyObject
*unused
) {
555 Py_XDECREF(self
->pbuf
);
559 self
->pos
= self
->string_size
= 0;
566 I_seek(Iobject
*self
, PyObject
*args
) {
567 int position
, mode
= 0;
569 UNLESS (IO__opencheck(IOOOBJECT(self
))) return NULL
;
570 UNLESS (PyArg_ParseTuple(args
, "i|i:seek", &position
, &mode
))
573 if (mode
== 2) position
+= self
->string_size
;
574 else if (mode
== 1) position
+= self
->pos
;
576 if (position
< 0) position
=0;
584 static struct PyMethodDef I_methods
[] = {
585 /* Common methods: */
586 {"flush", (PyCFunction
)IO_flush
, METH_NOARGS
, IO_flush__doc__
},
587 {"getvalue", (PyCFunction
)IO_getval
, METH_VARARGS
, IO_getval__doc__
},
588 {"isatty", (PyCFunction
)IO_isatty
, METH_NOARGS
, IO_isatty__doc__
},
589 {"read", (PyCFunction
)IO_read
, METH_VARARGS
, IO_read__doc__
},
590 {"readline", (PyCFunction
)IO_readline
, METH_VARARGS
, IO_readline__doc__
},
591 {"readlines", (PyCFunction
)IO_readlines
,METH_VARARGS
, IO_readlines__doc__
},
592 {"reset", (PyCFunction
)IO_reset
, METH_NOARGS
, IO_reset__doc__
},
593 {"tell", (PyCFunction
)IO_tell
, METH_NOARGS
, IO_tell__doc__
},
594 {"truncate", (PyCFunction
)IO_truncate
, METH_VARARGS
, IO_truncate__doc__
},
596 /* Read-only StringIO specific methods: */
597 {"close", (PyCFunction
)I_close
, METH_NOARGS
, O_close__doc__
},
598 {"seek", (PyCFunction
)I_seek
, METH_VARARGS
, O_seek__doc__
},
603 I_dealloc(Iobject
*self
) {
604 Py_XDECREF(self
->pbuf
);
609 PyDoc_STRVAR(Itype__doc__
,
610 "Simple type for treating strings as input file streams");
612 static PyTypeObject Itype
= {
613 PyObject_HEAD_INIT(NULL
)
615 "cStringIO.StringI", /*tp_name*/
616 sizeof(Iobject
), /*tp_basicsize*/
619 (destructor
)I_dealloc
, /*tp_dealloc*/
620 (printfunc
)0, /*tp_print*/
622 (setattrfunc
)0, /*tp_setattr*/
623 (cmpfunc
)0, /*tp_compare*/
624 (reprfunc
)0, /*tp_repr*/
626 0, /*tp_as_sequence*/
628 (hashfunc
)0, /*tp_hash*/
629 (ternaryfunc
)0, /*tp_call*/
630 (reprfunc
)0, /*tp_str*/
633 0, /* tp_as_buffer */
634 Py_TPFLAGS_DEFAULT
, /* tp_flags */
635 Itype__doc__
, /* tp_doc */
638 0, /* tp_richcompare */
639 0, /* tp_weaklistoffset */
640 PyObject_SelfIter
, /* tp_iter */
641 (iternextfunc
)IO_iternext
, /* tp_iternext */
642 I_methods
, /* tp_methods */
644 file_getsetlist
, /* tp_getset */
648 newIobject(PyObject
*s
) {
653 if (PyObject_AsReadBuffer(s
, (const void **)&buf
, &size
)) {
654 PyErr_Format(PyExc_TypeError
, "expected read buffer, %.200s found",
655 s
->ob_type
->tp_name
);
658 UNLESS (self
= PyObject_New(Iobject
, &Itype
)) return NULL
;
661 self
->string_size
=size
;
665 return (PyObject
*)self
;
668 /* End of code for StringI objects */
669 /* -------------------------------------------------------- */
672 PyDoc_STRVAR(IO_StringIO__doc__
,
673 "StringIO([s]) -- Return a StringIO-like stream for reading or writing");
676 IO_StringIO(PyObject
*self
, PyObject
*args
) {
679 if (!PyArg_UnpackTuple(args
, "StringIO", 0, 1, &s
)) return NULL
;
681 if (s
) return newIobject(s
);
682 return newOobject(128);
685 /* List of methods defined in the module */
687 static struct PyMethodDef IO_methods
[] = {
688 {"StringIO", (PyCFunction
)IO_StringIO
,
689 METH_VARARGS
, IO_StringIO__doc__
},
690 {NULL
, NULL
} /* sentinel */
694 /* Initialization function for the module (*must* be called initcStringIO) */
696 static struct PycStringIO_CAPI CAPI
= {
707 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
708 #define PyMODINIT_FUNC void
711 initcStringIO(void) {
715 /* Create the module and add the functions */
716 m
= Py_InitModule4("cStringIO", IO_methods
,
717 cStringIO_module_documentation
,
718 (PyObject
*)NULL
,PYTHON_API_VERSION
);
720 /* Add some symbolic constants to the module */
721 d
= PyModule_GetDict(m
);
724 Itype
.ob_type
=&PyType_Type
;
725 Otype
.ob_type
=&PyType_Type
;
726 if (PyType_Ready(&Otype
) < 0) return;
727 if (PyType_Ready(&Itype
) < 0) return;
728 PyDict_SetItemString(d
,"cStringIO_CAPI",
729 v
= PyCObject_FromVoidPtr(&CAPI
,NULL
));
733 PyDict_SetItemString(d
,"InputType", (PyObject
*)&Itype
);
734 PyDict_SetItemString(d
,"OutputType", (PyObject
*)&Otype
);
736 /* Maybe make certain warnings go away */
737 if (0) PycString_IMPORT
;