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 assert(IOOOBJECT(self
)->pos
>= 0);
123 return PyString_FromStringAndSize(((IOobject
*)self
)->buf
,
124 ((IOobject
*)self
)->pos
);
128 IO_getval(IOobject
*self
, PyObject
*args
) {
129 PyObject
*use_pos
=Py_None
;
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
)) {
137 if (s
> self
->string_size
) 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");
148 IO_isatty(IOobject
*self
, PyObject
*unused
) {
149 if (!IO__opencheck(self
)) return NULL
;
154 PyDoc_STRVAR(IO_read__doc__
,
155 "read([s]) -- Read s characters, or the rest of the string");
158 IO_cread(PyObject
*self
, char **output
, Py_ssize_t n
) {
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
) {
170 *output
=((IOobject
*)self
)->buf
+ ((IOobject
*)self
)->pos
;
171 ((IOobject
*)self
)->pos
+= n
;
176 IO_read(IOobject
*self
, PyObject
*args
) {
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");
190 IO_creadline(PyObject
*self
, char **output
) {
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
++);
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
;
214 IO_readline(IOobject
*self
, PyObject
*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
) {
227 assert(IOOOBJECT(self
)->pos
>= 0);
228 return PyString_FromStringAndSize(output
, n
);
231 PyDoc_STRVAR(IO_readlines__doc__
, "readlines() -- Read all lines");
234 IO_readlines(IOobject
*self
, PyObject
*args
) {
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);
247 if ( (n
= IO_creadline((PyObject
*)self
,&output
)) < 0)
251 line
= PyString_FromStringAndSize (output
, n
);
254 if (PyList_Append (result
, line
) == -1) {
260 if (hint
> 0 && length
>= hint
)
269 PyDoc_STRVAR(IO_reset__doc__
,
270 "reset() -- Reset the file position to the beginning");
273 IO_reset(IOobject
*self
, PyObject
*unused
) {
275 if (!IO__opencheck(self
)) return NULL
;
283 PyDoc_STRVAR(IO_tell__doc__
, "tell() -- get the current position.");
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.");
298 IO_truncate(IOobject
*self
, PyObject
*args
) {
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 */
311 PyErr_SetFromErrno(PyExc_IOError
);
315 if (self
->string_size
> pos
) self
->string_size
= pos
;
316 self
->pos
= self
->string_size
;
323 IO_iternext(Iobject
*self
)
326 next
= IO_readline((IOobject
*)self
, NULL
);
329 if (!PyString_GET_SIZE(next
)) {
331 PyErr_SetNone(PyExc_StopIteration
);
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");
347 O_seek(Oobject
*self
, PyObject
*args
) {
351 if (!IO__opencheck(IOOOBJECT(self
))) return NULL
;
352 if (!PyArg_ParseTuple(args
, "n|i:seek", &position
, &mode
))
356 position
+= self
->string_size
;
358 else if (mode
== 1) {
359 position
+= self
->pos
;
362 if (position
> self
->buf_size
) {
365 if (self
->buf_size
<= position
) self
->buf_size
=position
+1;
366 newbuf
= (char*) realloc(self
->buf
,self
->buf_size
);
370 self
->buf_size
=self
->pos
=0;
371 return PyErr_NoMemory();
375 else if (position
< 0) position
=0;
379 while (--position
>= self
->string_size
) self
->buf
[position
]=0;
385 PyDoc_STRVAR(O_write__doc__
,
386 "write(s) -- Write a string to the file"
387 "\n\nNote (hack:) writing None resets the buffer");
391 O_cwrite(PyObject
*self
, const char *c
, Py_ssize_t l
) {
396 if (!IO__opencheck(IOOOBJECT(self
))) return -1;
397 oself
= (Oobject
*)self
;
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
);
408 PyErr_SetString(PyExc_MemoryError
,"out of memory");
411 oself
->buf_size
= oself
->pos
= 0;
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
;
430 O_write(Oobject
*self
, PyObject
*args
) {
434 if (!PyArg_ParseTuple(args
, "t#:write", &c
, &l
)) return NULL
;
436 if (O_cwrite((PyObject
*)self
,c
,l
) < 0) return NULL
;
442 PyDoc_STRVAR(O_close__doc__
, "close(): explicitly release resources held.");
445 O_close(Oobject
*self
, PyObject
*unused
) {
446 if (self
->buf
!= NULL
) free(self
->buf
);
449 self
->pos
= self
->string_size
= self
->buf_size
= 0;
455 PyDoc_STRVAR(O_writelines__doc__
,
456 "writelines(sequence_of_strings) -> None. Write the strings to the file.\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.");
461 O_writelines(Oobject
*self
, PyObject
*args
) {
464 it
= PyObject_GetIter(args
);
467 while ((s
= PyIter_Next(it
)) != NULL
) {
470 if (PyString_AsStringAndSize(s
, &c
, &n
) == -1) {
475 if (O_cwrite((PyObject
*)self
, c
, n
) == -1) {
485 /* See if PyIter_Next failed */
486 if (PyErr_Occurred())
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 */
519 O_dealloc(Oobject
*self
) {
520 if (self
->buf
!= NULL
)
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*/
533 (destructor
)O_dealloc
, /*tp_dealloc*/
540 0, /*tp_as_sequence*/
548 Py_TPFLAGS_DEFAULT
, /*tp_flags*/
549 Otype__doc__
, /*tp_doc */
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 */
562 newOobject(int size
) {
565 self
= PyObject_New(Oobject
, &Otype
);
569 self
->string_size
= 0;
572 self
->buf
= (char *)malloc(size
);
574 PyErr_SetString(PyExc_MemoryError
,"out of memory");
581 return (PyObject
*)self
;
584 /* End of code for StringO objects */
585 /* -------------------------------------------------------- */
588 I_close(Iobject
*self
, PyObject
*unused
) {
589 Py_CLEAR(self
->pbuf
);
592 self
->pos
= self
->string_size
= 0;
599 I_seek(Iobject
*self
, PyObject
*args
) {
603 if (!IO__opencheck(IOOOBJECT(self
))) return NULL
;
604 if (!PyArg_ParseTuple(args
, "n|i:seek", &position
, &mode
))
607 if (mode
== 2) position
+= self
->string_size
;
608 else if (mode
== 1) position
+= self
->pos
;
610 if (position
< 0) position
=0;
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__
},
637 I_dealloc(Iobject
*self
) {
638 Py_XDECREF(self
->pbuf
);
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*/
652 (destructor
)I_dealloc
, /*tp_dealloc*/
659 0, /*tp_as_sequence*/
666 0, /* tp_as_buffer */
667 Py_TPFLAGS_DEFAULT
, /* tp_flags */
668 Itype__doc__
, /* tp_doc */
671 0, /* tp_richcompare */
672 0, /* tp_weaklistoffset */
673 PyObject_SelfIter
, /* tp_iter */
674 (iternextfunc
)IO_iternext
, /* tp_iternext */
675 I_methods
, /* tp_methods */
677 file_getsetlist
, /* tp_getset */
681 newIobject(PyObject
*s
) {
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
);
692 self
= PyObject_New(Iobject
, &Itype
);
693 if (!self
) return NULL
;
696 self
->string_size
=size
;
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");
711 IO_StringIO(PyObject
*self
, PyObject
*args
) {
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
= {
742 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
743 #define PyMODINIT_FUNC void
746 initcStringIO(void) {
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
);
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
));
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
;