cPickle release 0.3 from Jim Fulton

This commit is contained in:
Guido van Rossum 1997-08-13 03:14:41 +00:00
parent f55afae3c6
commit 142eeb8339
3 changed files with 245 additions and 175 deletions

View file

@ -70,12 +70,12 @@
This would typically be done in your init function. This would typically be done in your init function.
$Log$ $Log$
Revision 2.4 1997/04/09 18:04:08 guido Revision 2.5 1997/08/13 03:14:08 guido
Got rid of the static decl of PyCObject_Import, which was a 1.4 cPickle release 0.3 from Jim Fulton
compatibility hack.
Revision 2.3 1997/04/09 17:34:28 guido Revision 1.3 1997/06/13 19:44:02 jim
Changed the way the C API was exported. Jim Fulton. - changed to avoid warning of multiple declarations in 1.5 and
our 1.4.
Revision 1.2 1997/01/27 14:13:05 jim Revision 1.2 1997/01/27 14:13:05 jim
Changed the way the C API was exported. Changed the way the C API was exported.
@ -121,7 +121,26 @@ static struct PycStringIO_CAPI {
#define PycStringIO_OutputCheck(O) \ #define PycStringIO_OutputCheck(O) \
((O)->ob_type==PycStringIO->OutputType) ((O)->ob_type==PycStringIO->OutputType)
static void *
xxxPyCObject_Import(char *module_name, char *name)
{
PyObject *m, *c;
void *r=NULL;
if((m=PyImport_ImportModule(module_name)))
{
if((c=PyObject_GetAttrString(m,name)))
{
r=PyCObject_AsVoidPtr(c);
Py_DECREF(c);
}
Py_DECREF(m);
}
return r;
}
#define PycString_IMPORT \ #define PycString_IMPORT \
PycStringIO=PyCObject_Import("cStringIO", "cStringIO_CAPI") PycStringIO=xxxPyCObject_Import("cStringIO", "cStringIO_CAPI")
#endif /* CSTRINGIO_INCLUDED */ #endif /* CSTRINGIO_INCLUDED */

View file

@ -53,13 +53,20 @@
*/ */
static char cPickle_module_documentation[] = static char cPickle_module_documentation[] =
"" "C implementation and optimization of the Python pickle module\n"
"\n"
"$Id$\n"
; ;
#include "Python.h" #include "Python.h"
#include "cStringIO.h" #include "cStringIO.h"
#include "mymath.h" #include "mymath.h"
#ifndef Py_eval_input
#include <graminit.h>
#define Py_eval_input eval_input
#endif Py_eval_input
#include <errno.h> #include <errno.h>
#define UNLESS(E) if (!(E)) #define UNLESS(E) if (!(E))
@ -127,7 +134,7 @@ static PyObject *empty_tuple;
static PyObject *__class___str, *__getinitargs___str, *__dict___str, static PyObject *__class___str, *__getinitargs___str, *__dict___str,
*__getstate___str, *__setstate___str, *__name___str, *__reduce___str, *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
*write_str, *__safe_for_unpickling___str, *append_str, *write_str, *__safe_for_unpickling___str, *append_str,
*read_str, *readline_str; *read_str, *readline_str, *__main___str;
/* __builtins__ module */ /* __builtins__ module */
static PyObject *builtins; static PyObject *builtins;
@ -183,7 +190,7 @@ cPickle_PyMapping_HasKey(o, key)
{ {
PyObject *v; PyObject *v;
if (v = PyObject_GetItem(o,key)) if((v = PyObject_GetItem(o,key)))
{ {
Py_DECREF(v); Py_DECREF(v);
return 1; return 1;
@ -275,6 +282,13 @@ write_cStringIO(Picklerobject *self, char *s, int n) {
} }
static int
write_none(Picklerobject *self, char *s, int n) {
if (s == NULL) return 0;
return n;
}
static int static int
write_other(Picklerobject *self, char *s, int n) { write_other(Picklerobject *self, char *s, int n) {
PyObject *py_str = 0, *junk = 0; PyObject *py_str = 0, *junk = 0;
@ -490,7 +504,7 @@ readline_other(Unpicklerobject *self, char **s) {
static char * static char *
my_strndup(char *s, int l) strndup(char *s, int l)
{ {
char *r; char *r;
UNLESS(r=malloc((l+1)*sizeof(char))) return (char*)PyErr_NoMemory(); UNLESS(r=malloc((l+1)*sizeof(char))) return (char*)PyErr_NoMemory();
@ -618,7 +632,7 @@ whichmodule(PyObject *global, PyObject *global_name) {
PyObject *module = 0, *modules_dict = 0, PyObject *module = 0, *modules_dict = 0,
*global_name_attr = 0, *name = 0; *global_name_attr = 0, *name = 0;
if (module = PyDict_GetItem(class_map, global)) { if ((module = PyDict_GetItem(class_map, global))) {
Py_INCREF(module); Py_INCREF(module);
return module; return module;
} }
@ -630,7 +644,10 @@ whichmodule(PyObject *global, PyObject *global_name) {
return NULL; return NULL;
i = 0; i = 0;
while (j = PyDict_Next(modules_dict, &i, &name, &module)) { while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
if(PyObject_Compare(name, __main___str)==0) continue;
UNLESS(global_name_attr = PyObject_GetAttr(module, global_name)) { UNLESS(global_name_attr = PyObject_GetAttr(module, global_name)) {
PyErr_Clear(); PyErr_Clear();
continue; continue;
@ -646,11 +663,22 @@ whichmodule(PyObject *global, PyObject *global_name) {
break; break;
} }
/* The following implements the rule in pickle.py added in 1.5
that used __main__ if no module is found. I don't actually
like this rule. jlf
*/
if(!j) {
j=1;
name=__main___str;
}
/*
if (!j) { if (!j) {
PyErr_Format(PicklingError, "Could not find module for %s.", PyErr_Format(PicklingError, "Could not find module for %s.",
"O", global_name); "O", global_name);
return NULL; return NULL;
} }
*/
PyDict_SetItem(class_map, global, name); PyDict_SetItem(class_map, global, name);
@ -755,7 +783,7 @@ save_float(Picklerobject *self, PyObject *args) {
#ifdef FORMAT_1_3 #ifdef FORMAT_1_3
if (self->bin) { if (self->bin) {
int s, e, i = -1; int s, e;
double f; double f;
long fhi, flo; long fhi, flo;
char str[9], *p = str; char str[9], *p = str;
@ -859,7 +887,7 @@ save_float(Picklerobject *self, PyObject *args) {
static int static int
save_string(Picklerobject *self, PyObject *args) { save_string(Picklerobject *self, PyObject *args, int doput) {
int size, len; int size, len;
size = PyString_Size(args); size = PyString_Size(args);
@ -913,9 +941,9 @@ save_string(Picklerobject *self, PyObject *args) {
return -1; return -1;
} }
if (size > 1) if (doput)
if (put(self, args) < 0) if (put(self, args) < 0)
return -1; return -1;
return 0; return 0;
} }
@ -946,7 +974,7 @@ save_tuple(Picklerobject *self, PyObject *args) {
goto finally; goto finally;
if (len) { if (len) {
if (has_key = cPickle_PyMapping_HasKey(self->memo, py_tuple_id) < 0) if ((has_key = cPickle_PyMapping_HasKey(self->memo, py_tuple_id)) < 0)
goto finally; goto finally;
if (has_key) { if (has_key) {
@ -1031,7 +1059,7 @@ save_list(Picklerobject *self, PyObject *args) {
goto finally; goto finally;
} }
if (using_appends = (self->bin && (len > 1))) if ((using_appends = (self->bin && (len > 1))))
if ((*self->write_func)(self, &MARKv, 1) < 0) if ((*self->write_func)(self, &MARKv, 1) < 0)
goto finally; goto finally;
@ -1096,7 +1124,7 @@ save_dict(Picklerobject *self, PyObject *args) {
goto finally; goto finally;
} }
if (using_setitems = (self->bin && (PyDict_Size(args) > 1))) if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
if ((*self->write_func)(self, &MARKv, 1) < 0) if ((*self->write_func)(self, &MARKv, 1) < 0)
goto finally; goto finally;
@ -1147,7 +1175,7 @@ save_inst(Picklerobject *self, PyObject *args) {
goto finally; goto finally;
} }
if (getinitargs_func = PyObject_GetAttr(args, __getinitargs___str)) { if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
PyObject *element = 0; PyObject *element = 0;
int i, len; int i, len;
@ -1207,7 +1235,7 @@ save_inst(Picklerobject *self, PyObject *args) {
goto finally; goto finally;
} }
if (getstate_func = PyObject_GetAttr(args, __getstate___str)) { if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
UNLESS(state = PyObject_CallObject(getstate_func, empty_tuple)) UNLESS(state = PyObject_CallObject(getstate_func, empty_tuple))
goto finally; goto finally;
} }
@ -1403,12 +1431,11 @@ save_reduce(Picklerobject *self, PyObject *callable,
return 0; return 0;
} }
static int static int
save(Picklerobject *self, PyObject *args, int pers_save) { save(Picklerobject *self, PyObject *args, int pers_save) {
PyTypeObject *type; PyTypeObject *type;
PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0, PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
*callable = 0, *state = 0, *junk = 0; *callable = 0, *state = 0;
int res = -1, tmp, size; int res = -1, tmp, size;
if (!pers_save && self->pers_func) { if (!pers_save && self->pers_func) {
@ -1456,7 +1483,7 @@ save(Picklerobject *self, PyObject *args, int pers_save) {
case 's': case 's':
if ((type == &PyString_Type) && (PyString_Size(args) < 2)) { if ((type == &PyString_Type) && (PyString_Size(args) < 2)) {
res = save_string(self, args); res = save_string(self, args, 0);
goto finally; goto finally;
} }
} }
@ -1485,7 +1512,7 @@ save(Picklerobject *self, PyObject *args, int pers_save) {
switch (type->tp_name[0]) { switch (type->tp_name[0]) {
case 's': case 's':
if (type == &PyString_Type) { if (type == &PyString_Type) {
res = save_string(self, args); res = save_string(self, args, 1);
goto finally; goto finally;
} }
@ -1539,7 +1566,7 @@ save(Picklerobject *self, PyObject *args, int pers_save) {
} }
} }
if (__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type)) { if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
Py_INCREF(__reduce__); Py_INCREF(__reduce__);
UNLESS(self->arg) UNLESS(self->arg)
@ -1556,7 +1583,7 @@ save(Picklerobject *self, PyObject *args, int pers_save) {
else { else {
PyErr_Clear(); PyErr_Clear();
if (__reduce__ = PyObject_GetAttr(args, __reduce___str)) { if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
UNLESS(t = PyObject_CallObject(__reduce__, empty_tuple)) UNLESS(t = PyObject_CallObject(__reduce__, empty_tuple))
goto finally; goto finally;
} }
@ -1586,6 +1613,7 @@ save(Picklerobject *self, PyObject *args, int pers_save) {
} }
callable = PyTuple_GET_ITEM(t, 0); callable = PyTuple_GET_ITEM(t, 0);
arg_tup = PyTuple_GET_ITEM(t, 1); arg_tup = PyTuple_GET_ITEM(t, 1);
if (size > 2) { if (size > 2) {
@ -1680,10 +1708,20 @@ dump_special(Picklerobject *self, PyObject *args) {
return Py_None; return Py_None;
} }
static PyObject *
Pickle_clear_memo(Picklerobject *self, PyObject *args) {
if(self->memo) PyDict_Clear(self->memo);
Py_INCREF(Py_None);
return Py_None;
}
static struct PyMethodDef Pickler_methods[] = { static struct PyMethodDef Pickler_methods[] = {
{"dump", (PyCFunction)Pickler_dump, 1, ""}, {"dump", (PyCFunction)Pickler_dump, 1,
{"dump_special", (PyCFunction)dump_special, 1, ""}, "dump(object) -- Write an object in pickle format"},
{"dump_special", (PyCFunction)dump_special, 1,
""},
{"clear_memo", (PyCFunction)Pickle_clear_memo, 1,
"clear_memo() -- Clear the picklers memp"},
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
@ -1720,6 +1758,9 @@ newPicklerobject(PyObject *file, int bin) {
else if (PycStringIO_OutputCheck(file)) { else if (PycStringIO_OutputCheck(file)) {
self->write_func = write_cStringIO; self->write_func = write_cStringIO;
} }
else if (file == Py_None) {
self->write_func = write_none;
}
else { else {
self->write_func = write_other; self->write_func = write_other;
@ -1903,8 +1944,6 @@ find_class(PyObject *py_module_name, PyObject *py_class_name) {
char *module_name, *class_name; char *module_name, *class_name;
PyObject *res = NULL; PyObject *res = NULL;
static PyObject *eval_dict = 0;
module_name = PyString_AS_STRING((PyStringObject *)py_module_name); module_name = PyString_AS_STRING((PyStringObject *)py_module_name);
class_name = PyString_AS_STRING((PyStringObject *)py_class_name); class_name = PyString_AS_STRING((PyStringObject *)py_class_name);
@ -1917,7 +1956,7 @@ find_class(PyObject *py_module_name, PyObject *py_class_name) {
PyTuple_SET_ITEM((PyTupleObject *)t, 1, py_class_name); PyTuple_SET_ITEM((PyTupleObject *)t, 1, py_class_name);
Py_INCREF(py_class_name); Py_INCREF(py_class_name);
if (class = PyDict_GetItem(class_map, t)) { if ((class = PyDict_GetItem(class_map, t))) {
res = class; res = class;
Py_INCREF(class); Py_INCREF(class);
goto finally; goto finally;
@ -1974,7 +2013,7 @@ load_int(Unpicklerobject *self) {
long l; long l;
if ((len = (*self->readline_func)(self, &s)) < 0) return -1; if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
UNLESS(s=my_strndup(s,len)) return -1; UNLESS(s=strndup(s,len)) return -1;
errno = 0; errno = 0;
l = strtol(s, &endptr, 0); l = strtol(s, &endptr, 0);
@ -2081,10 +2120,8 @@ load_long(Unpicklerobject *self) {
char *end, *s; char *end, *s;
int len, res = -1; int len, res = -1;
static PyObject *arg = 0;
if ((len = (*self->readline_func)(self, &s)) < 0) return -1; if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
UNLESS(s=my_strndup(s,len)) return -1; UNLESS(s=strndup(s,len)) return -1;
UNLESS(l = PyLong_FromString(s, &end, 0)) UNLESS(l = PyLong_FromString(s, &end, 0))
goto finally; goto finally;
@ -2110,7 +2147,7 @@ load_float(Unpicklerobject *self) {
double d; double d;
if ((len = (*self->readline_func)(self, &s)) < 0) return -1; if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
UNLESS(s=my_strndup(s,len)) return -1; UNLESS(s=strndup(s,len)) return -1;
errno = 0; errno = 0;
d = strtod(s, &endptr); d = strtod(s, &endptr);
@ -2220,7 +2257,7 @@ load_string(Unpicklerobject *self) {
static PyObject *eval_dict = 0; static PyObject *eval_dict = 0;
if ((len = (*self->readline_func)(self, &s)) < 0) return -1; if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
UNLESS(s=my_strndup(s,len)) return -1; UNLESS(s=strndup(s,len)) return -1;
UNLESS(eval_dict) UNLESS(eval_dict)
UNLESS(eval_dict = Py_BuildValue("{s{}}", "__builtins__")) UNLESS(eval_dict = Py_BuildValue("{s{}}", "__builtins__"))
@ -2471,7 +2508,7 @@ Instance_New(PyObject *cls, PyObject *args)
PyObject *safe=0, *r=0; PyObject *safe=0, *r=0;
if (PyClass_Check(cls)) if (PyClass_Check(cls))
if(r=PyInstance_New(cls, args, NULL)) return r; if((r=PyInstance_New(cls, args, NULL))) return r;
else goto err; else goto err;
@ -2486,13 +2523,14 @@ Instance_New(PyObject *cls, PyObject *args)
return NULL; return NULL;
} }
if(r=PyObject_CallObject(cls, args)) return r; if((r=PyObject_CallObject(cls, args))) return r;
err: err:
{ {
PyObject *tp, *v, *tb; PyObject *tp, *v, *tb;
PyErr_Fetch(&tp, &v, &tb); PyErr_Fetch(&tp, &v, &tb);
if(r=Py_BuildValue("OOO",v,cls,args)) if((r=Py_BuildValue("OOO",v,cls,args)))
{ {
Py_XDECREF(v); Py_XDECREF(v);
v=r; v=r;
@ -3207,7 +3245,7 @@ finally:
static PyObject * static PyObject *
load(Unpicklerobject *self) load(Unpicklerobject *self)
{ {
PyObject *stack = 0, *err = 0, *exc = 0, *val = 0, *tb = 0; PyObject *stack = 0, *err = 0, *val = 0;
int len; int len;
char *s; char *s;
@ -3777,6 +3815,7 @@ init_stuff(PyObject *module, PyObject *module_dict) {
INIT_STR(__getstate__); INIT_STR(__getstate__);
INIT_STR(__setstate__); INIT_STR(__setstate__);
INIT_STR(__name__); INIT_STR(__name__);
INIT_STR(__main__);
INIT_STR(__reduce__); INIT_STR(__reduce__);
INIT_STR(write); INIT_STR(write);
INIT_STR(__safe_for_unpickling__); INIT_STR(__safe_for_unpickling__);
@ -3873,22 +3912,36 @@ initcPickle() {
/**************************************************************************** /****************************************************************************
$Log$ $Log$
Revision 2.7 1997/05/16 16:36:52 guido Revision 2.8 1997/08/13 03:14:37 guido
Renamed strndup to my_strndup to avoid conflict witth GNU libc. cPickle release 0.3 from Jim Fulton
Revision 2.6 1997/05/13 18:00:44 guido Revision 1.41 1997/06/20 19:45:10 jim
Use compile-time test for 64-bit hardware instead of run-time test. Fixed dumb bug in __main__ fix. :-(
This silences some compilers.
Revision 2.5 1997/05/07 17:46:13 guido Revision 1.40 1997/06/19 18:57:36 jim
Instead of importing graminit.h whenever one of the three grammar 'root' Added ident string.
symbols is needed, define these in Python.h with a Py_ prefix.
Revision 2.4 1997/04/09 17:47:47 guido Revision 1.39 1997/06/13 19:40:44 jim
Give PyErr_Format a new name and make it static. - Various changes to make gcc -Wall -pedantic happy, including
extra parens elimination of unused vars.
Revision 2.3 1997/04/09 17:36:32 guido - Added check to avoid pickling module __main__ for classes that are
Jim Fulton's version 2.2. defined in other modules, in whichmodule
- Changed to use Py_eval_input rather than eval_input.
- Changed to use SIZEOF_LONG macro to avoid warnings on 32-bit machines.
- Added option of supplying None to pickler, which cases no data to be
written during pickling. This is slightly useful, in conjunction
with persistent_id attribute to find persistent sub-objects without
writing a pickle.
Revision 1.38 1997/05/07 17:06:43 jim
Added clear_memo method to pickler.
Revision 1.37 1997/05/06 20:21:01 jim
Changed to only add strings to memo that have length greater than one.
Revision 1.36 1997/03/11 22:05:02 chris Revision 1.36 1997/03/11 22:05:02 chris
write POP rather than POPMARK in non-binary mode write POP rather than POPMARK in non-binary mode

View file

@ -51,70 +51,12 @@
If you have questions regarding this software, If you have questions regarding this software,
contact: contact:
Jim Fulton, jim@digicool.com info@digicool.com
Digital Creations L.C. Digital Creations L.C.
(540) 371-6909 (540) 371-6909
$Log$
Revision 2.5 1997/04/11 19:56:06 guido
My own patch: support writable 'softspace' attribute.
Revision 2.4 1997/04/09 17:35:33 guido
Unknown changes by Jim Fulton.
Revision 1.16 1997/02/17 22:17:43 jim
*** empty log message ***
Revision 1.14 1997/01/24 19:56:24 chris
undid last change
Revision 1.13 1997/01/24 19:45:20 chris
extra byte in buffer no longer included in buf_size
Revision 1.12 1997/01/24 19:38:28 chris
*** empty log message ***
Revision 1.11 1997/01/23 20:45:01 jim
ANSIfied it.
Changed way C API was exported.
Revision 1.10 1997/01/02 15:19:55 chris
checked in to be sure repository is up to date.
Revision 1.9 1996/12/27 21:40:29 jim
Took out some lamosities in interface, like returning self from
write.
Revision 1.8 1996/12/23 15:52:49 jim
Added ifdef to check for CObject before using it.
Revision 1.7 1996/12/23 15:22:35 jim
Finished implementation, adding full compatibility with StringIO, and
then some.
We still need to take out some cStringIO oddities.
Revision 1.6 1996/10/15 18:42:07 jim
Added lots of casts to make warnings go away.
Revision 1.5 1996/10/11 21:03:42 jim
*** empty log message ***
Revision 1.4 1996/10/11 21:02:15 jim
*** empty log message ***
Revision 1.3 1996/10/07 20:51:38 chris
*** empty log message ***
Revision 1.2 1996/07/18 13:08:34 jfulton
*** empty log message ***
Revision 1.1 1996/07/15 17:06:33 jfulton
Initial version.
*/ */
static char cStringIO_module_documentation[] = static char cStringIO_module_documentation[] =
"A simple fast partial StringIO replacement.\n" "A simple fast partial StringIO replacement.\n"
@ -142,6 +84,8 @@ static char cStringIO_module_documentation[] =
" \n" " \n"
"If someone else wants to provide a more complete implementation,\n" "If someone else wants to provide a more complete implementation,\n"
"go for it. :-) \n" "go for it. :-) \n"
"\n"
"$Id$\n"
; ;
#include "Python.h" #include "Python.h"
@ -150,8 +94,6 @@ static char cStringIO_module_documentation[] =
#define UNLESS(E) if(!(E)) #define UNLESS(E) if(!(E))
/* ----------------------------------------------------- */
/* Declarations for objects of type StringO */ /* Declarations for objects of type StringO */
typedef struct { typedef struct {
@ -160,10 +102,6 @@ typedef struct {
int pos, string_size, buf_size, closed, softspace; int pos, string_size, buf_size, closed, softspace;
} Oobject; } Oobject;
staticforward PyTypeObject Otype;
/* ---------------------------------------------------------------- */
/* Declarations for objects of type StringI */ /* Declarations for objects of type StringI */
typedef struct { typedef struct {
@ -173,10 +111,6 @@ typedef struct {
PyObject *pbuf; PyObject *pbuf;
} Iobject; } Iobject;
staticforward PyTypeObject Itype;
/* ---------------------------------------------------------------- */
static char O_reset__doc__[] = static char O_reset__doc__[] =
"reset() -- Reset the file position to the beginning" "reset() -- Reset the file position to the beginning"
; ;
@ -343,7 +277,14 @@ O_write(Oobject *self, PyObject *args) {
static PyObject * static PyObject *
O_getval(Oobject *self, PyObject *args) { O_getval(Oobject *self, PyObject *args) {
return PyString_FromStringAndSize(self->buf, self->pos); PyObject *use_pos;
int s;
use_pos=Py_None;
UNLESS(PyArg_ParseTuple(args,"|O",&use_pos)) return NULL;
if(PyObject_IsTrue(use_pos)) s=self->pos;
else s=self->string_size;
return PyString_FromStringAndSize(self->buf, s);
} }
static PyObject * static PyObject *
@ -434,7 +375,12 @@ static struct PyMethodDef O_methods[] = {
{"reset", (PyCFunction)O_reset, 0, O_reset__doc__}, {"reset", (PyCFunction)O_reset, 0, O_reset__doc__},
{"seek", (PyCFunction)O_seek, 1, O_seek__doc__}, {"seek", (PyCFunction)O_seek, 1, O_seek__doc__},
{"tell", (PyCFunction)O_tell, 0, O_tell__doc__}, {"tell", (PyCFunction)O_tell, 0, O_tell__doc__},
{"getvalue", (PyCFunction)O_getval, 0, "getvalue() -- Get the string value"}, {"getvalue", (PyCFunction)O_getval, 1,
"getvalue([use_pos]) -- Get the string value."
"\n"
"If use_pos is specified and is a true value, then the string returned\n"
"will include only the text up to the current file position.\n"
},
{"truncate", (PyCFunction)O_truncate, 0, O_truncate__doc__}, {"truncate", (PyCFunction)O_truncate, 0, O_truncate__doc__},
{"isatty", (PyCFunction)O_isatty, 0, O_isatty__doc__}, {"isatty", (PyCFunction)O_isatty, 0, O_isatty__doc__},
{"close", (PyCFunction)O_close, 0, O_close__doc__}, {"close", (PyCFunction)O_close, 0, O_close__doc__},
@ -443,32 +389,6 @@ static struct PyMethodDef O_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
/* ---------- */
static PyObject *
newOobject(int size) {
Oobject *self;
self = PyObject_NEW(Oobject, &Otype);
if (self == NULL)
return NULL;
self->pos=0;
self->closed = 0;
self->string_size = 0;
self->softspace = 0;
UNLESS(self->buf=malloc(size*sizeof(char)))
{
PyErr_SetString(PyExc_MemoryError,"out of memory");
self->buf_size = 0;
return NULL;
}
self->buf_size=size;
return (PyObject*)self;
}
static void static void
O_dealloc(Oobject *self) { O_dealloc(Oobject *self) {
@ -527,6 +447,29 @@ static PyTypeObject Otype = {
Otype__doc__ /* Documentation string */ Otype__doc__ /* Documentation string */
}; };
static PyObject *
newOobject(int size) {
Oobject *self;
self = PyObject_NEW(Oobject, &Otype);
if (self == NULL)
return NULL;
self->pos=0;
self->closed = 0;
self->string_size = 0;
self->softspace = 0;
UNLESS(self->buf=malloc(size*sizeof(char)))
{
PyErr_SetString(PyExc_MemoryError,"out of memory");
self->buf_size = 0;
return NULL;
}
self->buf_size=size;
return (PyObject*)self;
}
/* End of code for StringO objects */ /* End of code for StringO objects */
/* -------------------------------------------------------- */ /* -------------------------------------------------------- */
@ -554,29 +497,6 @@ static struct PyMethodDef I_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
/* ---------- */
static PyObject *
newIobject(PyObject *s) {
Iobject *self;
char *buf;
int size;
UNLESS(buf=PyString_AsString(s)) return NULL;
UNLESS(-1 != (size=PyString_Size(s))) return NULL;
UNLESS(self = PyObject_NEW(Iobject, &Itype)) return NULL;
Py_INCREF(s);
self->buf=buf;
self->string_size=size;
self->pbuf=s;
self->pos=0;
self->closed = 0;
return (PyObject*)self;
}
static void static void
I_dealloc(Iobject *self) { I_dealloc(Iobject *self) {
Py_DECREF(self->pbuf); Py_DECREF(self->pbuf);
@ -617,6 +537,25 @@ static PyTypeObject Itype = {
Itype__doc__ /* Documentation string */ Itype__doc__ /* Documentation string */
}; };
static PyObject *
newIobject(PyObject *s) {
Iobject *self;
char *buf;
int size;
UNLESS(buf=PyString_AsString(s)) return NULL;
UNLESS(-1 != (size=PyString_Size(s))) return NULL;
UNLESS(self = PyObject_NEW(Iobject, &Itype)) return NULL;
Py_INCREF(s);
self->buf=buf;
self->string_size=size;
self->pbuf=s;
self->pos=0;
self->closed = 0;
return (PyObject*)self;
}
/* End of code for StringI objects */ /* End of code for StringI objects */
/* -------------------------------------------------------- */ /* -------------------------------------------------------- */
@ -677,7 +616,66 @@ initcStringIO() {
PyDict_SetItemString(d,"InputType", (PyObject*)&Itype); PyDict_SetItemString(d,"InputType", (PyObject*)&Itype);
PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype); PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);
/* Maybe make certain warnings go away */
if(0) PycString_IMPORT;
/* Check for errors */ /* Check for errors */
if (PyErr_Occurred()) Py_FatalError("can't initialize module cStringIO"); if (PyErr_Occurred()) Py_FatalError("can't initialize module cStringIO");
} }
/******************************************************************************
$Log$
Revision 2.6 1997/08/13 03:14:41 guido
cPickle release 0.3 from Jim Fulton
Revision 1.21 1997/06/19 18:51:42 jim
Added ident string.
Revision 1.20 1997/06/13 20:50:50 jim
- Various changes to make gcc -Wall -pedantic happy, including
getting rid of staticforward declarations and adding pretend use
of two statics defined in .h file.
Revision 1.19 1997/06/02 18:15:17 jim
Merged in guido's changes.
Revision 1.18 1997/05/07 16:26:47 jim
getvalue() can nor be given an argument. If this argument is true,
then getvalue returns the text upto the current position. Otherwise
it returns all of the text. The default value of the argument is
false.
Revision 1.17 1997/04/17 18:02:46 chris
getvalue() now returns entire string, not just the string up to
current position
Revision 2.5 1997/04/11 19:56:06 guido
My own patch: support writable 'softspace' attribute.
> Jim asked: What is softspace for?
It's an old feature. The print statement uses this to remember
whether it should insert a space before the next item or not.
Implementation is in fileobject.c.
Revision 1.11 1997/01/23 20:45:01 jim
ANSIfied it.
Changed way C API was exported.
Revision 1.10 1997/01/02 15:19:55 chris
checked in to be sure repository is up to date.
Revision 1.9 1996/12/27 21:40:29 jim
Took out some lamosities in interface, like returning self from
write.
Revision 1.8 1996/12/23 15:52:49 jim
Added ifdef to check for CObject before using it.
Revision 1.7 1996/12/23 15:22:35 jim
Finished implementation, adding full compatibility with StringIO, and
then some.
*****************************************************************************/