blob: ff47b7005a7f380cb7c442b5ded0bbcdc6e8d054 [file] [log] [blame]
Guido van Rossum049cd901996-12-05 23:30:48 +00001/*
2
3 $Id$
4
5 A simple fast partial StringIO replacement.
6
7
8
9 Copyright
10
11 Copyright 1996 Digital Creations, L.C., 910 Princess Anne
12 Street, Suite 300, Fredericksburg, Virginia 22401 U.S.A. All
13 rights reserved. Copyright in this software is owned by DCLC,
14 unless otherwise indicated. Permission to use, copy and
15 distribute this software is hereby granted, provided that the
16 above copyright notice appear in all copies and that both that
17 copyright notice and this permission notice appear. Note that
18 any product, process or technology described in this software
19 may be the subject of other Intellectual Property rights
20 reserved by Digital Creations, L.C. and are not licensed
21 hereunder.
22
23 Trademarks
24
25 Digital Creations & DCLC, are trademarks of Digital Creations, L.C..
26 All other trademarks are owned by their respective companies.
27
28 No Warranty
29
30 The software is provided "as is" without warranty of any kind,
31 either express or implied, including, but not limited to, the
32 implied warranties of merchantability, fitness for a particular
33 purpose, or non-infringement. This software could include
34 technical inaccuracies or typographical errors. Changes are
35 periodically made to the software; these changes will be
36 incorporated in new editions of the software. DCLC may make
37 improvements and/or changes in this software at any time
38 without notice.
39
40 Limitation Of Liability
41
42 In no event will DCLC be liable for direct, indirect, special,
43 incidental, economic, cover, or consequential damages arising
44 out of the use of or inability to use this software even if
45 advised of the possibility of such damages. Some states do not
46 allow the exclusion or limitation of implied warranties or
47 limitation of liability for incidental or consequential
48 damages, so the above limitation or exclusion may not apply to
49 you.
50
51 If you have questions regarding this software,
52 contact:
53
Guido van Rossum142eeb81997-08-13 03:14:41 +000054 info@digicool.com
Guido van Rossum049cd901996-12-05 23:30:48 +000055 Digital Creations L.C.
56
57 (540) 371-6909
58
59
Guido van Rossum049cd901996-12-05 23:30:48 +000060*/
61static char cStringIO_module_documentation[] =
62"A simple fast partial StringIO replacement.\n"
63"\n"
64"This module provides a simple useful replacement for\n"
65"the StringIO module that is written in C. It does not provide the\n"
66"full generality if StringIO, but it provides anough for most\n"
67"applications and is especially useful in conjuction with the\n"
68"pickle module.\n"
69"\n"
70"Usage:\n"
71"\n"
72" from cStringIO import StringIO\n"
73"\n"
74" an_output_stream=StringIO()\n"
75" an_output_stream.write(some_stuff)\n"
76" ...\n"
77" value=an_output_stream.getvalue() # str(an_output_stream) works too!\n"
78"\n"
79" an_input_stream=StringIO(a_string)\n"
80" spam=an_input_stream.readline()\n"
81" spam=an_input_stream.read(5)\n"
82" an_input_stream.reset() # OK, start over, note no seek yet\n"
83" spam=an_input_stream.read() # and read it all\n"
84" \n"
85"If someone else wants to provide a more complete implementation,\n"
86"go for it. :-) \n"
Guido van Rossum142eeb81997-08-13 03:14:41 +000087"\n"
88"$Id$\n"
Guido van Rossum049cd901996-12-05 23:30:48 +000089;
90
91#include "Python.h"
92#include "import.h"
Guido van Rossum154417e1997-04-09 17:35:33 +000093#include "cStringIO.h"
Guido van Rossum049cd901996-12-05 23:30:48 +000094
Guido van Rossum049cd901996-12-05 23:30:48 +000095#define UNLESS(E) if(!(E))
Guido van Rossum049cd901996-12-05 23:30:48 +000096
Guido van Rossum049cd901996-12-05 23:30:48 +000097/* Declarations for objects of type StringO */
98
99typedef struct {
100 PyObject_HEAD
101 char *buf;
Guido van Rossum3dc35b01997-04-11 19:56:06 +0000102 int pos, string_size, buf_size, closed, softspace;
Guido van Rossum049cd901996-12-05 23:30:48 +0000103} Oobject;
104
Guido van Rossum049cd901996-12-05 23:30:48 +0000105/* Declarations for objects of type StringI */
106
107typedef struct {
108 PyObject_HEAD
109 char *buf;
110 int pos, string_size, closed;
111 PyObject *pbuf;
112} Iobject;
113
Guido van Rossum049cd901996-12-05 23:30:48 +0000114static char O_reset__doc__[] =
115"reset() -- Reset the file position to the beginning"
116;
117
118static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000119O_reset(Oobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000120 self->pos = 0;
121
122 Py_INCREF(Py_None);
123 return Py_None;
124}
125
126
127static char O_tell__doc__[] =
128"tell() -- get the current position.";
129
130static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000131O_tell(Oobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000132 return PyInt_FromLong(self->pos);
133}
134
135
136static char O_seek__doc__[] =
137"seek(position) -- set the current position\n"
138"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF";
139
140static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000141O_seek(Oobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000142 int position, mode = 0;
143
144 UNLESS(PyArg_ParseTuple(args, "i|i", &position, &mode))
145 {
146 return NULL;
147 }
148
149 if (mode == 2)
150 {
151 position += self->string_size;
152 }
153 else if (mode == 1)
154 {
155 position += self->pos;
156 }
157
158 self->pos = (position > self->string_size ? self->string_size :
159 (position < 0 ? 0 : position));
160
Guido van Rossum55702f81997-01-06 22:57:52 +0000161 Py_INCREF(Py_None);
162 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000163}
164
165static char O_read__doc__[] =
166"read([s]) -- Read s characters, or the rest of the string"
167;
168
169static int
Guido van Rossum154417e1997-04-09 17:35:33 +0000170O_cread(PyObject *self, char **output, int n) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000171 int l;
172
Guido van Rossum154417e1997-04-09 17:35:33 +0000173 l = ((Oobject*)self)->string_size - ((Oobject*)self)->pos;
Guido van Rossum049cd901996-12-05 23:30:48 +0000174 if (n < 0 || n > l)
175 {
176 n = l;
177 }
178
Guido van Rossum154417e1997-04-09 17:35:33 +0000179 *output=((Oobject*)self)->buf + ((Oobject*)self)->pos;
180 ((Oobject*)self)->pos += n;
Guido van Rossum049cd901996-12-05 23:30:48 +0000181 return n;
182}
183
184static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000185O_read(Oobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000186 int n = -1;
187 char *output;
188
189 UNLESS(PyArg_ParseTuple(args, "|i", &n)) return NULL;
190
Guido van Rossum154417e1997-04-09 17:35:33 +0000191 n=O_cread((PyObject*)self,&output,n);
Guido van Rossum049cd901996-12-05 23:30:48 +0000192
193 return PyString_FromStringAndSize(output, n);
194}
195
196
197static char O_readline__doc__[] =
198"readline() -- Read one line"
199;
200
201static int
Guido van Rossum154417e1997-04-09 17:35:33 +0000202O_creadline(PyObject *self, char **output) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000203 char *n, *s;
204 int l;
205
Guido van Rossum154417e1997-04-09 17:35:33 +0000206 for (n = ((Oobject*)self)->buf + ((Oobject*)self)->pos,
207 s = ((Oobject*)self)->buf + ((Oobject*)self)->string_size;
Guido van Rossum049cd901996-12-05 23:30:48 +0000208 n < s && *n != '\n'; n++);
209 if (n < s) n++;
210
Guido van Rossum154417e1997-04-09 17:35:33 +0000211 *output=((Oobject*)self)->buf + ((Oobject*)self)->pos;
212 l = n - ((Oobject*)self)->buf - ((Oobject*)self)->pos;
213 ((Oobject*)self)->pos += l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000214 return l;
215}
216
217static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000218O_readline(Oobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000219 int n;
220 char *output;
221
Guido van Rossum154417e1997-04-09 17:35:33 +0000222 n=O_creadline((PyObject*)self,&output);
Guido van Rossum049cd901996-12-05 23:30:48 +0000223 return PyString_FromStringAndSize(output, n);
224}
225
226static char O_write__doc__[] =
227"write(s) -- Write a string to the file"
228"\n\nNote (hack:) writing None resets the buffer"
229;
230
231
232static int
Guido van Rossum154417e1997-04-09 17:35:33 +0000233O_cwrite(PyObject *self, char *c, int l) {
Barry Warsaw61a63e11997-01-14 17:38:28 +0000234 int newl;
Guido van Rossum55702f81997-01-06 22:57:52 +0000235
Guido van Rossum154417e1997-04-09 17:35:33 +0000236 newl=((Oobject*)self)->pos+l;
237 if(newl >= ((Oobject*)self)->buf_size)
Guido van Rossum049cd901996-12-05 23:30:48 +0000238 {
Guido van Rossum154417e1997-04-09 17:35:33 +0000239 ((Oobject*)self)->buf_size*=2;
240 if(((Oobject*)self)->buf_size <= newl) ((Oobject*)self)->buf_size=newl+1;
241 UNLESS(((Oobject*)self)->buf=
242 (char*)realloc(((Oobject*)self)->buf,
243 (((Oobject*)self)->buf_size) *sizeof(char)))
Guido van Rossum049cd901996-12-05 23:30:48 +0000244 {
245 PyErr_SetString(PyExc_MemoryError,"out of memory");
Guido van Rossum154417e1997-04-09 17:35:33 +0000246 ((Oobject*)self)->buf_size=((Oobject*)self)->pos=0;
Guido van Rossum049cd901996-12-05 23:30:48 +0000247 return -1;
248 }
249 }
250
Guido van Rossum154417e1997-04-09 17:35:33 +0000251 memcpy(((Oobject*)((Oobject*)self))->buf+((Oobject*)self)->pos,c,l);
Guido van Rossum049cd901996-12-05 23:30:48 +0000252
Guido van Rossum154417e1997-04-09 17:35:33 +0000253 ((Oobject*)self)->pos += l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000254
Guido van Rossum154417e1997-04-09 17:35:33 +0000255 if (((Oobject*)self)->string_size < ((Oobject*)self)->pos)
Guido van Rossum049cd901996-12-05 23:30:48 +0000256 {
Guido van Rossum154417e1997-04-09 17:35:33 +0000257 ((Oobject*)self)->string_size = ((Oobject*)self)->pos;
Guido van Rossum049cd901996-12-05 23:30:48 +0000258 }
259
260 return l;
261}
262
263static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000264O_write(Oobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000265 PyObject *s;
Barry Warsaw61a63e11997-01-14 17:38:28 +0000266 char *c;
267 int l;
Guido van Rossum049cd901996-12-05 23:30:48 +0000268
269 UNLESS(PyArg_Parse(args, "O", &s)) return NULL;
Guido van Rossum55702f81997-01-06 22:57:52 +0000270 UNLESS(-1 != (l=PyString_Size(s))) return NULL;
271 UNLESS(c=PyString_AsString(s)) return NULL;
Guido van Rossum154417e1997-04-09 17:35:33 +0000272 UNLESS(-1 != O_cwrite((PyObject*)self,c,l)) return NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000273
Guido van Rossum55702f81997-01-06 22:57:52 +0000274 Py_INCREF(Py_None);
275 return Py_None;
Guido van Rossum049cd901996-12-05 23:30:48 +0000276}
277
278static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000279O_getval(Oobject *self, PyObject *args) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000280 PyObject *use_pos;
281 int s;
282
283 use_pos=Py_None;
284 UNLESS(PyArg_ParseTuple(args,"|O",&use_pos)) return NULL;
285 if(PyObject_IsTrue(use_pos)) s=self->pos;
286 else s=self->string_size;
287 return PyString_FromStringAndSize(self->buf, s);
Guido van Rossum154417e1997-04-09 17:35:33 +0000288}
289
290static PyObject *
291O_cgetval(PyObject *self) {
292 return PyString_FromStringAndSize(((Oobject*)self)->buf,
293 ((Oobject*)self)->pos);
Guido van Rossum049cd901996-12-05 23:30:48 +0000294}
295
296static char O_truncate__doc__[] =
297"truncate(): truncate the file at the current position.";
298
299static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000300O_truncate(Oobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000301 self->string_size = self->pos;
302 Py_INCREF(Py_None);
303 return Py_None;
304}
305
306static char O_isatty__doc__[] = "isatty(): always returns 0";
307
308static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000309O_isatty(Oobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000310 return PyInt_FromLong(0);
311}
312
313static char O_close__doc__[] = "close(): explicitly release resources held.";
314
315static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000316O_close(Oobject *self, PyObject *args) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000317 if (self->buf != NULL)
318 free(self->buf);
319 self->buf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000320
321 self->pos = self->string_size = self->buf_size = 0;
322 self->closed = 1;
323
324 Py_INCREF(Py_None);
325 return Py_None;
326}
327
328static char O_flush__doc__[] = "flush(): does nothing.";
329
330static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000331O_flush(Oobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000332 Py_INCREF(Py_None);
333 return Py_None;
334}
335
336
337static char O_writelines__doc__[] = "blah";
338static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000339O_writelines(Oobject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000340 PyObject *string_module = 0;
341 static PyObject *string_joinfields = 0;
342
343 UNLESS(PyArg_Parse(args, "O", args))
344 {
345 return NULL;
346 }
347
348 if (!string_joinfields)
349 {
350 UNLESS(string_module = PyImport_ImportModule("string"))
351 {
352 return NULL;
353 }
354
355 UNLESS(string_joinfields=
356 PyObject_GetAttrString(string_module, "joinfields"))
357 {
358 return NULL;
359 }
360
361 Py_DECREF(string_module);
362 }
363
364 if (PyObject_Length(args) == -1)
365 {
366 return NULL;
367 }
368
369 return O_write(self,
370 PyObject_CallFunction(string_joinfields, "Os", args, ""));
371}
372
373static struct PyMethodDef O_methods[] = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000374 {"write", (PyCFunction)O_write, 0, O_write__doc__},
Guido van Rossum049cd901996-12-05 23:30:48 +0000375 {"read", (PyCFunction)O_read, 1, O_read__doc__},
376 {"readline", (PyCFunction)O_readline, 0, O_readline__doc__},
Guido van Rossum049cd901996-12-05 23:30:48 +0000377 {"reset", (PyCFunction)O_reset, 0, O_reset__doc__},
378 {"seek", (PyCFunction)O_seek, 1, O_seek__doc__},
379 {"tell", (PyCFunction)O_tell, 0, O_tell__doc__},
Guido van Rossum142eeb81997-08-13 03:14:41 +0000380 {"getvalue", (PyCFunction)O_getval, 1,
381 "getvalue([use_pos]) -- Get the string value."
382 "\n"
383 "If use_pos is specified and is a true value, then the string returned\n"
384 "will include only the text up to the current file position.\n"
385 },
Guido van Rossum049cd901996-12-05 23:30:48 +0000386 {"truncate", (PyCFunction)O_truncate, 0, O_truncate__doc__},
387 {"isatty", (PyCFunction)O_isatty, 0, O_isatty__doc__},
388 {"close", (PyCFunction)O_close, 0, O_close__doc__},
389 {"flush", (PyCFunction)O_flush, 0, O_flush__doc__},
390 {"writelines", (PyCFunction)O_writelines, 0, O_writelines__doc__},
391 {NULL, NULL} /* sentinel */
392};
393
Guido van Rossum049cd901996-12-05 23:30:48 +0000394
395static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000396O_dealloc(Oobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000397 if (self->buf != NULL)
398 free(self->buf);
Guido van Rossum049cd901996-12-05 23:30:48 +0000399 PyMem_DEL(self);
400}
401
402static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000403O_getattr(Oobject *self, char *name) {
Guido van Rossum3dc35b01997-04-11 19:56:06 +0000404 if (strcmp(name, "softspace") == 0) {
405 return PyInt_FromLong(self->softspace);
406 }
Guido van Rossum049cd901996-12-05 23:30:48 +0000407 return Py_FindMethod(O_methods, (PyObject *)self, name);
408}
409
Guido van Rossum3dc35b01997-04-11 19:56:06 +0000410static int
411O_setattr(Oobject *self, char *name, PyObject *value) {
412 long x;
413 if (strcmp(name, "softspace") != 0) {
414 PyErr_SetString(PyExc_AttributeError, name);
415 return -1;
416 }
417 x = PyInt_AsLong(value);
418 if (x == -1 && PyErr_Occurred())
419 return -1;
420 self->softspace = x;
421 return 0;
422}
423
Guido van Rossum049cd901996-12-05 23:30:48 +0000424static char Otype__doc__[] =
425"Simple type for output to strings."
426;
427
428static PyTypeObject Otype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000429 PyObject_HEAD_INIT(NULL)
430 0, /*ob_size*/
431 "StringO", /*tp_name*/
432 sizeof(Oobject), /*tp_basicsize*/
433 0, /*tp_itemsize*/
434 /* methods */
435 (destructor)O_dealloc, /*tp_dealloc*/
436 (printfunc)0, /*tp_print*/
437 (getattrfunc)O_getattr, /*tp_getattr*/
Guido van Rossum3dc35b01997-04-11 19:56:06 +0000438 (setattrfunc)O_setattr, /*tp_setattr*/
Guido van Rossum154417e1997-04-09 17:35:33 +0000439 (cmpfunc)0, /*tp_compare*/
440 (reprfunc)0, /*tp_repr*/
441 0, /*tp_as_number*/
442 0, /*tp_as_sequence*/
443 0, /*tp_as_mapping*/
444 (hashfunc)0, /*tp_hash*/
445 (ternaryfunc)0, /*tp_call*/
446 (reprfunc)0, /*tp_str*/
447
448 /* Space for future expansion */
449 0L,0L,0L,0L,
450 Otype__doc__ /* Documentation string */
Guido van Rossum049cd901996-12-05 23:30:48 +0000451};
452
Guido van Rossum142eeb81997-08-13 03:14:41 +0000453static PyObject *
454newOobject(int size) {
455 Oobject *self;
456
457 self = PyObject_NEW(Oobject, &Otype);
458 if (self == NULL)
459 return NULL;
460 self->pos=0;
461 self->closed = 0;
462 self->string_size = 0;
463 self->softspace = 0;
464
465 UNLESS(self->buf=malloc(size*sizeof(char)))
466 {
467 PyErr_SetString(PyExc_MemoryError,"out of memory");
468 self->buf_size = 0;
469 return NULL;
470 }
471
472 self->buf_size=size;
473 return (PyObject*)self;
474}
475
Guido van Rossum049cd901996-12-05 23:30:48 +0000476/* End of code for StringO objects */
477/* -------------------------------------------------------- */
478
479static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000480I_close(Iobject *self, PyObject *args) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000481 Py_XDECREF(self->pbuf);
482 self->pbuf = NULL;
Guido van Rossum049cd901996-12-05 23:30:48 +0000483
484 self->pos = self->string_size = 0;
485 self->closed = 1;
486
487 Py_INCREF(Py_None);
488 return Py_None;
489}
490
491static struct PyMethodDef I_methods[] = {
492 {"read", (PyCFunction)O_read, 1, O_read__doc__},
493 {"readline", (PyCFunction)O_readline, 0, O_readline__doc__},
494 {"reset", (PyCFunction)O_reset, 0, O_reset__doc__},
495 {"seek", (PyCFunction)O_seek, 1, O_seek__doc__},
496 {"tell", (PyCFunction)O_tell, 0, O_tell__doc__},
497 {"truncate", (PyCFunction)O_truncate, 0, O_truncate__doc__},
498 {"isatty", (PyCFunction)O_isatty, 0, O_isatty__doc__},
499 {"close", (PyCFunction)I_close, 0, O_close__doc__},
500 {"flush", (PyCFunction)O_flush, 0, O_flush__doc__},
501 {NULL, NULL} /* sentinel */
502};
503
Guido van Rossum049cd901996-12-05 23:30:48 +0000504static void
Guido van Rossum154417e1997-04-09 17:35:33 +0000505I_dealloc(Iobject *self) {
Guido van Rossum15a40391997-09-03 00:09:26 +0000506 Py_XDECREF(self->pbuf);
Guido van Rossum049cd901996-12-05 23:30:48 +0000507 PyMem_DEL(self);
508}
509
510static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000511I_getattr(Iobject *self, char *name) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000512 return Py_FindMethod(I_methods, (PyObject *)self, name);
513}
514
515static char Itype__doc__[] =
516"Simple type for treating strings as input file streams"
517;
518
519static PyTypeObject Itype = {
Guido van Rossum154417e1997-04-09 17:35:33 +0000520 PyObject_HEAD_INIT(NULL)
521 0, /*ob_size*/
522 "StringI", /*tp_name*/
523 sizeof(Iobject), /*tp_basicsize*/
524 0, /*tp_itemsize*/
525 /* methods */
526 (destructor)I_dealloc, /*tp_dealloc*/
527 (printfunc)0, /*tp_print*/
528 (getattrfunc)I_getattr, /*tp_getattr*/
529 (setattrfunc)0, /*tp_setattr*/
530 (cmpfunc)0, /*tp_compare*/
531 (reprfunc)0, /*tp_repr*/
532 0, /*tp_as_number*/
533 0, /*tp_as_sequence*/
534 0, /*tp_as_mapping*/
535 (hashfunc)0, /*tp_hash*/
536 (ternaryfunc)0, /*tp_call*/
537 (reprfunc)0, /*tp_str*/
538
539 /* Space for future expansion */
540 0L,0L,0L,0L,
541 Itype__doc__ /* Documentation string */
Guido van Rossum049cd901996-12-05 23:30:48 +0000542};
543
Guido van Rossum142eeb81997-08-13 03:14:41 +0000544static PyObject *
545newIobject(PyObject *s) {
546 Iobject *self;
547 char *buf;
548 int size;
549
550 UNLESS(buf=PyString_AsString(s)) return NULL;
551 UNLESS(-1 != (size=PyString_Size(s))) return NULL;
552 UNLESS(self = PyObject_NEW(Iobject, &Itype)) return NULL;
553 Py_INCREF(s);
554 self->buf=buf;
555 self->string_size=size;
556 self->pbuf=s;
557 self->pos=0;
558 self->closed = 0;
559
560 return (PyObject*)self;
561}
562
Guido van Rossum049cd901996-12-05 23:30:48 +0000563/* End of code for StringI objects */
564/* -------------------------------------------------------- */
565
566
567static char IO_StringIO__doc__[] =
568"StringIO([s]) -- Return a StringIO-like stream for reading or writing"
569;
570
571static PyObject *
Guido van Rossum154417e1997-04-09 17:35:33 +0000572IO_StringIO(PyObject *self, PyObject *args) {
Guido van Rossum049cd901996-12-05 23:30:48 +0000573 PyObject *s=0;
574
575 UNLESS(PyArg_ParseTuple(args, "|O", &s)) return NULL;
Guido van Rossum154417e1997-04-09 17:35:33 +0000576 if(s) return newIobject(s);
577 return newOobject(128);
Guido van Rossum049cd901996-12-05 23:30:48 +0000578}
579
580/* List of methods defined in the module */
581
582static struct PyMethodDef IO_methods[] = {
Guido van Rossum55702f81997-01-06 22:57:52 +0000583 {"StringIO", (PyCFunction)IO_StringIO, 1, IO_StringIO__doc__},
584 {NULL, NULL} /* sentinel */
Guido van Rossum049cd901996-12-05 23:30:48 +0000585};
586
587
588/* Initialization function for the module (*must* be called initcStringIO) */
589
Guido van Rossum154417e1997-04-09 17:35:33 +0000590static struct PycStringIO_CAPI CAPI = {
591 O_cread,
592 O_creadline,
593 O_cwrite,
594 O_cgetval,
595 newOobject,
596 newIobject,
597 &Itype,
598 &Otype,
599};
600
Guido van Rossum049cd901996-12-05 23:30:48 +0000601void
Guido van Rossum154417e1997-04-09 17:35:33 +0000602initcStringIO() {
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000603 PyObject *m, *d, *v;
Guido van Rossum049cd901996-12-05 23:30:48 +0000604
Guido van Rossum154417e1997-04-09 17:35:33 +0000605
Guido van Rossum049cd901996-12-05 23:30:48 +0000606 /* Create the module and add the functions */
607 m = Py_InitModule4("cStringIO", IO_methods,
608 cStringIO_module_documentation,
609 (PyObject*)NULL,PYTHON_API_VERSION);
610
611 /* Add some symbolic constants to the module */
612 d = PyModule_GetDict(m);
Guido van Rossum049cd901996-12-05 23:30:48 +0000613
Guido van Rossum55702f81997-01-06 22:57:52 +0000614 /* Export C API */
Guido van Rossum154417e1997-04-09 17:35:33 +0000615 Itype.ob_type=&PyType_Type;
616 Otype.ob_type=&PyType_Type;
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000617 PyDict_SetItemString(d,"cStringIO_CAPI",
618 v = PyCObject_FromVoidPtr(&CAPI,NULL));
619 Py_XDECREF(v);
Guido van Rossum154417e1997-04-09 17:35:33 +0000620
621 /* Export Types */
Guido van Rossum049cd901996-12-05 23:30:48 +0000622 PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
623 PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
Guido van Rossum142eeb81997-08-13 03:14:41 +0000624
625 /* Maybe make certain warnings go away */
626 if(0) PycString_IMPORT;
Guido van Rossum049cd901996-12-05 23:30:48 +0000627
Guido van Rossum049cd901996-12-05 23:30:48 +0000628 /* Check for errors */
Guido van Rossum154417e1997-04-09 17:35:33 +0000629 if (PyErr_Occurred()) Py_FatalError("can't initialize module cStringIO");
Guido van Rossum049cd901996-12-05 23:30:48 +0000630}
Guido van Rossum55702f81997-01-06 22:57:52 +0000631
Guido van Rossum142eeb81997-08-13 03:14:41 +0000632
633/******************************************************************************
634
635 $Log$
Guido van Rossum9efe8ef1997-09-03 18:19:40 +0000636 Revision 2.8 1997/09/03 18:19:38 guido
637 #Plug small memory leaks in constructors.
638
Guido van Rossum15a40391997-09-03 00:09:26 +0000639 Revision 2.7 1997/09/03 00:09:26 guido
640 Fix the bug Jeremy was experiencing: both the close() and the
641 dealloc() functions contained code to free/DECREF the buffer
642 (there were differences between I and O objects but the logic bug was
643 the same). Fixed this be setting the buffer pointer to NULL and
644 testing for that. (This also makes it safe to call close() more than
645 once.)
646
647 XXX Worry: what if you try to read() or write() once the thing is
648 closed?
649
Guido van Rossum142eeb81997-08-13 03:14:41 +0000650 Revision 2.6 1997/08/13 03:14:41 guido
651 cPickle release 0.3 from Jim Fulton
652
653 Revision 1.21 1997/06/19 18:51:42 jim
654 Added ident string.
655
656 Revision 1.20 1997/06/13 20:50:50 jim
657 - Various changes to make gcc -Wall -pedantic happy, including
658 getting rid of staticforward declarations and adding pretend use
659 of two statics defined in .h file.
660
661 Revision 1.19 1997/06/02 18:15:17 jim
662 Merged in guido's changes.
663
664 Revision 1.18 1997/05/07 16:26:47 jim
665 getvalue() can nor be given an argument. If this argument is true,
666 then getvalue returns the text upto the current position. Otherwise
667 it returns all of the text. The default value of the argument is
668 false.
669
670 Revision 1.17 1997/04/17 18:02:46 chris
671 getvalue() now returns entire string, not just the string up to
672 current position
673
674 Revision 2.5 1997/04/11 19:56:06 guido
675 My own patch: support writable 'softspace' attribute.
676
677 > Jim asked: What is softspace for?
678
679 It's an old feature. The print statement uses this to remember
680 whether it should insert a space before the next item or not.
681 Implementation is in fileobject.c.
682
683 Revision 1.11 1997/01/23 20:45:01 jim
684 ANSIfied it.
685 Changed way C API was exported.
686
687 Revision 1.10 1997/01/02 15:19:55 chris
688 checked in to be sure repository is up to date.
689
690 Revision 1.9 1996/12/27 21:40:29 jim
691 Took out some lamosities in interface, like returning self from
692 write.
693
694 Revision 1.8 1996/12/23 15:52:49 jim
695 Added ifdef to check for CObject before using it.
696
697 Revision 1.7 1996/12/23 15:22:35 jim
698 Finished implementation, adding full compatibility with StringIO, and
699 then some.
700
701 *****************************************************************************/