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 /* 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.
47 Py_ssize_t pos
, string_size
;
50 #define IOOOBJECT(O) ((IOobject*)(O))
52 /* Declarations for objects of type StringO */
54 typedef struct { /* Subtype of IOobject */
57 Py_ssize_t pos
, string_size
;
63 /* Declarations for objects of type StringI */
65 typedef struct { /* Subtype of IOobject */
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. */
74 /* IOobject (common) methods */
76 PyDoc_STRVAR(IO_flush__doc__
, "flush(): does nothing.");
79 IO__opencheck(IOobject
*self
) {
81 PyErr_SetString(PyExc_ValueError
,
82 "I/O operation on closed file");
89 IO_get_closed(IOobject
*self
, void *closure
)
91 PyObject
*result
= Py_False
;
93 if (self
->buf
== NULL
)
99 static PyGetSetDef file_getsetlist
[] = {
100 {"closed", (getter
)IO_get_closed
, NULL
, "True if the file is closed"},
105 IO_flush(IOobject
*self
, PyObject
*unused
) {
107 if (!IO__opencheck(self
)) return NULL
;
113 PyDoc_STRVAR(IO_getval__doc__
,
114 "getvalue([use_pos]) -- Get the string value."
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");
120 IO_cgetval(PyObject
*self
) {
121 if (!IO__opencheck(IOOOBJECT(self
))) return NULL
;
122 return PyString_FromStringAndSize(((IOobject
*)self
)->buf
,
123 ((IOobject
*)self
)->pos
);
127 IO_getval(IOobject
*self
, PyObject
*args
) {
128 PyObject
*use_pos
=Py_None
;
131 if (!IO__opencheck(self
)) return NULL
;
132 if (!PyArg_UnpackTuple(args
,"getval", 0, 1,&use_pos
)) return NULL
;
134 if (PyObject_IsTrue(use_pos
)) {
136 if (s
> self
->string_size
) s
=self
->string_size
;
140 return PyString_FromStringAndSize(self
->buf
, s
);
143 PyDoc_STRVAR(IO_isatty__doc__
, "isatty(): always returns 0");
146 IO_isatty(IOobject
*self
, PyObject
*unused
) {
147 if (!IO__opencheck(self
)) return NULL
;
152 PyDoc_STRVAR(IO_read__doc__
,
153 "read([s]) -- Read s characters, or the rest of the string");
156 IO_cread(PyObject
*self
, char **output
, Py_ssize_t n
) {
159 if (!IO__opencheck(IOOOBJECT(self
))) return -1;
160 l
= ((IOobject
*)self
)->string_size
- ((IOobject
*)self
)->pos
;
161 if (n
< 0 || n
> l
) {
166 *output
=((IOobject
*)self
)->buf
+ ((IOobject
*)self
)->pos
;
167 ((IOobject
*)self
)->pos
+= n
;
172 IO_read(IOobject
*self
, PyObject
*args
) {
176 if (!PyArg_ParseTuple(args
, "|n:read", &n
)) return NULL
;
178 if ( (n
=IO_cread((PyObject
*)self
,&output
,n
)) < 0) return NULL
;
180 return PyString_FromStringAndSize(output
, n
);
183 PyDoc_STRVAR(IO_readline__doc__
, "readline() -- Read one line");
186 IO_creadline(PyObject
*self
, char **output
) {
190 if (!IO__opencheck(IOOOBJECT(self
))) return -1;
192 for (n
= ((IOobject
*)self
)->buf
+ ((IOobject
*)self
)->pos
,
193 s
= ((IOobject
*)self
)->buf
+ ((IOobject
*)self
)->string_size
;
194 n
< s
&& *n
!= '\n'; n
++);
197 *output
=((IOobject
*)self
)->buf
+ ((IOobject
*)self
)->pos
;
198 l
= n
- ((IOobject
*)self
)->buf
- ((IOobject
*)self
)->pos
;
199 assert(((IOobject
*)self
)->pos
+ l
< INT_MAX
);
200 ((IOobject
*)self
)->pos
+= (int)l
;
205 IO_readline(IOobject
*self
, PyObject
*args
) {
210 if (!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 if (!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 if (!IO__opencheck(self
)) return NULL
;
273 PyDoc_STRVAR(IO_tell__doc__
, "tell() -- get the current position.");
276 IO_tell(IOobject
*self
, PyObject
*unused
) {
278 if (!IO__opencheck(self
)) return NULL
;
280 return PyInt_FromSsize_t(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 if (!IO__opencheck(self
)) return NULL
;
291 if (!PyArg_ParseTuple(args
, "|n:truncate", &pos
)) return NULL
;
293 if (PyTuple_Size(args
) == 0) {
294 /* No argument passed, truncate to current position */
300 PyErr_SetFromErrno(PyExc_IOError
);
304 if (self
->string_size
> pos
) self
->string_size
= pos
;
305 self
->pos
= self
->string_size
;
312 IO_iternext(Iobject
*self
)
315 next
= IO_readline((IOobject
*)self
, NULL
);
318 if (!PyString_GET_SIZE(next
)) {
320 PyErr_SetNone(PyExc_StopIteration
);
329 /* Read-write object methods */
331 PyDoc_STRVAR(O_seek__doc__
,
332 "seek(position) -- set the current position\n"
333 "seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
336 O_seek(Oobject
*self
, PyObject
*args
) {
340 if (!IO__opencheck(IOOOBJECT(self
))) return NULL
;
341 if (!PyArg_ParseTuple(args
, "n|i:seek", &position
, &mode
))
345 position
+= self
->string_size
;
347 else if (mode
== 1) {
348 position
+= self
->pos
;
351 if (position
> self
->buf_size
) {
354 if (self
->buf_size
<= position
) self
->buf_size
=position
+1;
355 newbuf
= (char*) realloc(self
->buf
,self
->buf_size
);
359 self
->buf_size
=self
->pos
=0;
360 return PyErr_NoMemory();
364 else if (position
< 0) position
=0;
368 while (--position
>= self
->string_size
) self
->buf
[position
]=0;
374 PyDoc_STRVAR(O_write__doc__
,
375 "write(s) -- Write a string to the file"
376 "\n\nNote (hack:) writing None resets the buffer");
380 O_cwrite(PyObject
*self
, const char *c
, Py_ssize_t l
) {
385 if (!IO__opencheck(IOOOBJECT(self
))) return -1;
386 oself
= (Oobject
*)self
;
389 if (newl
>= oself
->buf_size
) {
390 oself
->buf_size
*= 2;
391 if (oself
->buf_size
<= newl
) {
392 assert(newl
+ 1 < INT_MAX
);
393 oself
->buf_size
= (int)(newl
+1);
395 newbuf
= (char*)realloc(oself
->buf
, oself
->buf_size
);
397 PyErr_SetString(PyExc_MemoryError
,"out of memory");
400 oself
->buf_size
= oself
->pos
= 0;
406 memcpy(oself
->buf
+oself
->pos
,c
,l
);
408 assert(oself
->pos
+ l
< INT_MAX
);
409 oself
->pos
+= (int)l
;
411 if (oself
->string_size
< oself
->pos
) {
412 oself
->string_size
= oself
->pos
;
419 O_write(Oobject
*self
, PyObject
*args
) {
423 if (!PyArg_ParseTuple(args
, "t#:write", &c
, &l
)) return NULL
;
425 if (O_cwrite((PyObject
*)self
,c
,l
) < 0) return NULL
;
431 PyDoc_STRVAR(O_close__doc__
, "close(): explicitly release resources held.");
434 O_close(Oobject
*self
, PyObject
*unused
) {
435 if (self
->buf
!= NULL
) free(self
->buf
);
438 self
->pos
= self
->string_size
= self
->buf_size
= 0;
444 PyDoc_STRVAR(O_writelines__doc__
,
445 "writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
447 "Note that newlines are not added. The sequence can be any iterable object\n"
448 "producing strings. This is equivalent to calling write() for each string.");
450 O_writelines(Oobject
*self
, PyObject
*args
) {
453 it
= PyObject_GetIter(args
);
456 while ((s
= PyIter_Next(it
)) != NULL
) {
459 if (PyString_AsStringAndSize(s
, &c
, &n
) == -1) {
464 if (O_cwrite((PyObject
*)self
, c
, n
) == -1) {
474 /* See if PyIter_Next failed */
475 if (PyErr_Occurred())
480 static struct PyMethodDef O_methods
[] = {
481 /* Common methods: */
482 {"flush", (PyCFunction
)IO_flush
, METH_NOARGS
, IO_flush__doc__
},
483 {"getvalue", (PyCFunction
)IO_getval
, METH_VARARGS
, IO_getval__doc__
},
484 {"isatty", (PyCFunction
)IO_isatty
, METH_NOARGS
, IO_isatty__doc__
},
485 {"read", (PyCFunction
)IO_read
, METH_VARARGS
, IO_read__doc__
},
486 {"readline", (PyCFunction
)IO_readline
, METH_VARARGS
, IO_readline__doc__
},
487 {"readlines", (PyCFunction
)IO_readlines
,METH_VARARGS
, IO_readlines__doc__
},
488 {"reset", (PyCFunction
)IO_reset
, METH_NOARGS
, IO_reset__doc__
},
489 {"tell", (PyCFunction
)IO_tell
, METH_NOARGS
, IO_tell__doc__
},
490 {"truncate", (PyCFunction
)IO_truncate
, METH_VARARGS
, IO_truncate__doc__
},
492 /* Read-write StringIO specific methods: */
493 {"close", (PyCFunction
)O_close
, METH_NOARGS
, O_close__doc__
},
494 {"seek", (PyCFunction
)O_seek
, METH_VARARGS
, O_seek__doc__
},
495 {"write", (PyCFunction
)O_write
, METH_VARARGS
, O_write__doc__
},
496 {"writelines", (PyCFunction
)O_writelines
, METH_O
, O_writelines__doc__
},
497 {NULL
, NULL
} /* sentinel */
500 static PyMemberDef O_memberlist
[] = {
501 {"softspace", T_INT
, offsetof(Oobject
, softspace
), 0,
502 "flag indicating that a space needs to be printed; used by print"},
503 /* getattr(f, "closed") is implemented without this table */
504 {NULL
} /* Sentinel */
508 O_dealloc(Oobject
*self
) {
509 if (self
->buf
!= NULL
)
514 PyDoc_STRVAR(Otype__doc__
, "Simple type for output to strings.");
516 static PyTypeObject Otype
= {
517 PyVarObject_HEAD_INIT(NULL
, 0)
518 "cStringIO.StringO", /*tp_name*/
519 sizeof(Oobject
), /*tp_basicsize*/
522 (destructor
)O_dealloc
, /*tp_dealloc*/
529 0, /*tp_as_sequence*/
537 Py_TPFLAGS_DEFAULT
, /*tp_flags*/
538 Otype__doc__
, /*tp_doc */
541 0, /*tp_richcompare */
542 0, /*tp_weaklistoffset */
543 PyObject_SelfIter
, /*tp_iter */
544 (iternextfunc
)IO_iternext
, /*tp_iternext */
545 O_methods
, /*tp_methods */
546 O_memberlist
, /*tp_members */
547 file_getsetlist
, /*tp_getset */
551 newOobject(int size
) {
554 self
= PyObject_New(Oobject
, &Otype
);
558 self
->string_size
= 0;
561 self
->buf
= (char *)malloc(size
);
563 PyErr_SetString(PyExc_MemoryError
,"out of memory");
570 return (PyObject
*)self
;
573 /* End of code for StringO objects */
574 /* -------------------------------------------------------- */
577 I_close(Iobject
*self
, PyObject
*unused
) {
578 Py_XDECREF(self
->pbuf
);
582 self
->pos
= self
->string_size
= 0;
589 I_seek(Iobject
*self
, PyObject
*args
) {
593 if (!IO__opencheck(IOOOBJECT(self
))) return NULL
;
594 if (!PyArg_ParseTuple(args
, "n|i:seek", &position
, &mode
))
597 if (mode
== 2) position
+= self
->string_size
;
598 else if (mode
== 1) position
+= self
->pos
;
600 if (position
< 0) position
=0;
608 static struct PyMethodDef I_methods
[] = {
609 /* Common methods: */
610 {"flush", (PyCFunction
)IO_flush
, METH_NOARGS
, IO_flush__doc__
},
611 {"getvalue", (PyCFunction
)IO_getval
, METH_VARARGS
, IO_getval__doc__
},
612 {"isatty", (PyCFunction
)IO_isatty
, METH_NOARGS
, IO_isatty__doc__
},
613 {"read", (PyCFunction
)IO_read
, METH_VARARGS
, IO_read__doc__
},
614 {"readline", (PyCFunction
)IO_readline
, METH_VARARGS
, IO_readline__doc__
},
615 {"readlines", (PyCFunction
)IO_readlines
,METH_VARARGS
, IO_readlines__doc__
},
616 {"reset", (PyCFunction
)IO_reset
, METH_NOARGS
, IO_reset__doc__
},
617 {"tell", (PyCFunction
)IO_tell
, METH_NOARGS
, IO_tell__doc__
},
618 {"truncate", (PyCFunction
)IO_truncate
, METH_VARARGS
, IO_truncate__doc__
},
620 /* Read-only StringIO specific methods: */
621 {"close", (PyCFunction
)I_close
, METH_NOARGS
, O_close__doc__
},
622 {"seek", (PyCFunction
)I_seek
, METH_VARARGS
, O_seek__doc__
},
627 I_dealloc(Iobject
*self
) {
628 Py_XDECREF(self
->pbuf
);
633 PyDoc_STRVAR(Itype__doc__
,
634 "Simple type for treating strings as input file streams");
636 static PyTypeObject Itype
= {
637 PyVarObject_HEAD_INIT(NULL
, 0)
638 "cStringIO.StringI", /*tp_name*/
639 sizeof(Iobject
), /*tp_basicsize*/
642 (destructor
)I_dealloc
, /*tp_dealloc*/
649 0, /*tp_as_sequence*/
656 0, /* tp_as_buffer */
657 Py_TPFLAGS_DEFAULT
, /* tp_flags */
658 Itype__doc__
, /* tp_doc */
661 0, /* tp_richcompare */
662 0, /* tp_weaklistoffset */
663 PyObject_SelfIter
, /* tp_iter */
664 (iternextfunc
)IO_iternext
, /* tp_iternext */
665 I_methods
, /* tp_methods */
667 file_getsetlist
, /* tp_getset */
671 newIobject(PyObject
*s
) {
676 if (PyObject_AsReadBuffer(s
, (const void **)&buf
, &size
)) {
677 PyErr_Format(PyExc_TypeError
, "expected read buffer, %.200s found",
678 s
->ob_type
->tp_name
);
682 self
= PyObject_New(Iobject
, &Itype
);
683 if (!self
) return NULL
;
686 self
->string_size
=size
;
690 return (PyObject
*)self
;
693 /* End of code for StringI objects */
694 /* -------------------------------------------------------- */
697 PyDoc_STRVAR(IO_StringIO__doc__
,
698 "StringIO([s]) -- Return a StringIO-like stream for reading or writing");
701 IO_StringIO(PyObject
*self
, PyObject
*args
) {
704 if (!PyArg_UnpackTuple(args
, "StringIO", 0, 1, &s
)) return NULL
;
706 if (s
) return newIobject(s
);
707 return newOobject(128);
710 /* List of methods defined in the module */
712 static struct PyMethodDef IO_methods
[] = {
713 {"StringIO", (PyCFunction
)IO_StringIO
,
714 METH_VARARGS
, IO_StringIO__doc__
},
715 {NULL
, NULL
} /* sentinel */
719 /* Initialization function for the module (*must* be called initcStringIO) */
721 static struct PycStringIO_CAPI CAPI
= {
732 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
733 #define PyMODINIT_FUNC void
736 initcStringIO(void) {
740 /* Create the module and add the functions */
741 m
= Py_InitModule4("cStringIO", IO_methods
,
742 cStringIO_module_documentation
,
743 (PyObject
*)NULL
,PYTHON_API_VERSION
);
744 if (m
== NULL
) return;
746 /* Add some symbolic constants to the module */
747 d
= PyModule_GetDict(m
);
750 Py_TYPE(&Itype
)=&PyType_Type
;
751 Py_TYPE(&Otype
)=&PyType_Type
;
752 if (PyType_Ready(&Otype
) < 0) return;
753 if (PyType_Ready(&Itype
) < 0) return;
754 PyDict_SetItemString(d
,"cStringIO_CAPI",
755 v
= PyCObject_FromVoidPtr(&CAPI
,NULL
));
759 PyDict_SetItemString(d
,"InputType", (PyObject
*)&Itype
);
760 PyDict_SetItemString(d
,"OutputType", (PyObject
*)&Otype
);
762 /* Maybe make certain warnings go away */
763 if (0) PycString_IMPORT
;