blob: 15c02c3c653a63f8a4bc057ffed155140d900613 [file] [log] [blame]
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Write Python objects to files and read them back.
26 This is intended for writing and reading compiled Python code only;
27 a true persistent storage facility would be much harder, since
28 it would have to take circular links and sharing into account. */
29
30#include "allobjects.h"
Guido van Rossum2807d191992-03-27 17:23:17 +000031#include "modsupport.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000032#include "longintrepr.h"
33#include "compile.h"
34#include "marshal.h"
35
36#include <errno.h>
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000037
38#define TYPE_NULL '0'
39#define TYPE_NONE 'N'
40#define TYPE_INT 'i'
41#define TYPE_FLOAT 'f'
42#define TYPE_LONG 'l'
43#define TYPE_STRING 's'
44#define TYPE_TUPLE '('
45#define TYPE_LIST '['
46#define TYPE_DICT '{'
Guido van Rossum681d79a1995-07-18 14:51:37 +000047#define TYPE_CODE 'c'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000048#define TYPE_UNKNOWN '?'
49
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000050typedef struct {
51 FILE *fp;
52 /* If fp == NULL, the following are valid: */
53 object *str;
54 char *ptr;
55 char *end;
56} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000057
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000058#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
59 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
60 else w_more(c, p)
61
62static void
63w_more(c, p)
64 char c;
65 WFILE *p;
66{
67 int size, newsize;
68 if (p->str == NULL)
69 return; /* An error already occurred */
70 size = getstringsize(p->str);
71 newsize = size + 1024;
72 if (resizestring(&p->str, newsize) != 0) {
73 p->ptr = p->end = NULL;
74 }
75 else {
76 p->ptr = GETSTRINGVALUE((stringobject *)p->str) + size;
77 p->end = GETSTRINGVALUE((stringobject *)p->str) + newsize;
78 *p->ptr++ = c;
79 }
80}
81
82static void
83w_string(s, n, p)
84 char *s;
85 int n;
86 WFILE *p;
87{
88 if (p->fp != NULL) {
89 fwrite(s, 1, n, p->fp);
90 }
91 else {
92 while (--n >= 0) {
93 w_byte(*s, p);
94 s++;
95 }
96 }
97}
98
99static void
100w_short(x, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000101 int x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000102 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000103{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000104 w_byte( x & 0xff, p);
105 w_byte((x>> 8) & 0xff, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000106}
107
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000108static void
109w_long(x, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000110 long x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000111 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000112{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000113 w_byte((int)( x & 0xff), p);
114 w_byte((int)((x>> 8) & 0xff), p);
115 w_byte((int)((x>>16) & 0xff), p);
116 w_byte((int)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000117}
118
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000119static void
120w_object(v, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000121 object *v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000122 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000123{
Guido van Rossum3a205f71995-02-17 15:10:07 +0000124 int i, n;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000125
126 if (v == NULL)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000127 w_byte(TYPE_NULL, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000128 else if (v == None)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000129 w_byte(TYPE_NONE, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000130 else if (is_intobject(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000131 w_byte(TYPE_INT, p);
132 w_long(getintvalue(v), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000133 }
134 else if (is_longobject(v)) {
135 longobject *ob = (longobject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000136 w_byte(TYPE_LONG, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000137 n = ob->ob_size;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000138 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000139 if (n < 0)
140 n = -n;
141 for (i = 0; i < n; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000142 w_short(ob->ob_digit[i], p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000143 }
144 else if (is_floatobject(v)) {
145 extern void float_buf_repr PROTO((char *, floatobject *));
146 char buf[256]; /* Plenty to format any double */
147 float_buf_repr(buf, (floatobject *)v);
148 n = strlen(buf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000149 w_byte(TYPE_FLOAT, p);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000150 w_byte(n, p);
151 w_string(buf, n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000152 }
153 else if (is_stringobject(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000154 w_byte(TYPE_STRING, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000155 n = getstringsize(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000156 w_long((long)n, p);
157 w_string(getstringvalue(v), n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000158 }
159 else if (is_tupleobject(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000160 w_byte(TYPE_TUPLE, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000161 n = gettuplesize(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000162 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000163 for (i = 0; i < n; i++) {
Guido van Rossum8d617a61995-03-09 12:12:11 +0000164 w_object(GETTUPLEITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000165 }
166 }
167 else if (is_listobject(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000168 w_byte(TYPE_LIST, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000169 n = getlistsize(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000170 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000171 for (i = 0; i < n; i++) {
Guido van Rossum3a205f71995-02-17 15:10:07 +0000172 w_object(getlistitem(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000173 }
174 }
Guido van Rossum64b45521991-06-07 13:58:22 +0000175 else if (is_dictobject(v)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000176 int pos;
177 object *key, *value;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000178 w_byte(TYPE_DICT, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000179 /* This one is NULL object terminated! */
Guido van Rossum25831651993-05-19 14:50:45 +0000180 pos = 0;
181 while (mappinggetnext(v, &pos, &key, &value)) {
182 w_object(key, p);
183 w_object(value, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000184 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000185 w_object((object *)NULL, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000186 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000187 else if (is_codeobject(v)) {
188 codeobject *co = (codeobject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000189 w_byte(TYPE_CODE, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000190 w_short(co->co_argcount, p);
191 w_short(co->co_nlocals, p);
192 w_short(co->co_flags, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000193 w_object((object *)co->co_code, p);
194 w_object(co->co_consts, p);
195 w_object(co->co_names, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000196 w_object(co->co_varnames, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000197 w_object(co->co_filename, p);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000198 w_object(co->co_name, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000199 }
200 else {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000201 w_byte(TYPE_UNKNOWN, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000202 }
203}
204
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000205void
206wr_long(x, fp)
207 long x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000208 FILE *fp;
209{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000210 WFILE wf;
211 wf.fp = fp;
212 w_long(x, &wf);
213}
214
215void
216wr_object(x, fp)
217 object *x;
218 FILE *fp;
219{
220 WFILE wf;
221 wf.fp = fp;
222 w_object(x, &wf);
223}
224
225typedef WFILE RFILE; /* Same struct with different invariants */
226
Guido van Rossum8d617a61995-03-09 12:12:11 +0000227#define rs_byte(p) (((p)->ptr != (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
228
229#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000230
231static int
232r_string(s, n, p)
233 char *s;
234 int n;
235 RFILE *p;
236{
237 if (p->fp != NULL)
238 return fread(s, 1, n, p->fp);
239 if (p->end - p->ptr < n)
240 n = p->end - p->ptr;
241 memcpy(s, p->ptr, n);
242 p->ptr += n;
243 return n;
244}
245
246static int
247r_short(p)
248 RFILE *p;
249{
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000250 register short x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000251 x = r_byte(p);
252 x |= r_byte(p) << 8;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000253 /* XXX If your short is > 16 bits, add sign-extension here!!! */
254 return x;
255}
256
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000257static long
258r_long(p)
259 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000260{
261 register long x;
Guido van Rossum8d617a61995-03-09 12:12:11 +0000262 register FILE *fp = p->fp;
263 if (fp) {
264 x = getc(fp);
265 x |= (long)getc(fp) << 8;
266 x |= (long)getc(fp) << 16;
267 x |= (long)getc(fp) << 24;
268 }
269 else {
270 x = rs_byte(p);
271 x |= (long)rs_byte(p) << 8;
272 x |= (long)rs_byte(p) << 16;
273 x |= (long)rs_byte(p) << 24;
274 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000275 /* XXX If your long is > 32 bits, add sign-extension here!!! */
276 return x;
277}
278
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000279static object *
280r_object(p)
281 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000282{
Jack Jansen9513f2c1995-10-27 13:21:28 +0000283 object *v, *v2;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000284 long i, n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000285 int type = r_byte(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000286
287 switch (type) {
288
289 case EOF:
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000290 err_setstr(EOFError, "EOF read where object expected");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000291 return NULL;
292
293 case TYPE_NULL:
294 return NULL;
295
296 case TYPE_NONE:
297 INCREF(None);
298 return None;
299
300 case TYPE_INT:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000301 return newintobject(r_long(p));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000302
303 case TYPE_LONG:
304 {
305 int size;
306 longobject *ob;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000307 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000308 size = n<0 ? -n : n;
309 ob = alloclongobject(size);
310 if (ob == NULL)
311 return NULL;
312 ob->ob_size = n;
313 for (i = 0; i < size; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000314 ob->ob_digit[i] = r_short(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000315 return (object *)ob;
316 }
317
318 case TYPE_FLOAT:
319 {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000320 extern double atof PROTO((const char *));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000321 char buf[256];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000322 n = r_byte(p);
323 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000324 err_setstr(EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000325 "EOF read where object expected");
326 return NULL;
327 }
328 buf[n] = '\0';
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000329 return newfloatobject(atof(buf));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000330 }
331
332 case TYPE_STRING:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000333 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000334 v = newsizedstringobject((char *)NULL, n);
335 if (v != NULL) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000336 if (r_string(getstringvalue(v), (int)n, p) != n) {
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000337 DECREF(v);
338 v = NULL;
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000339 err_setstr(EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000340 "EOF read where object expected");
341 }
342 }
343 return v;
344
345 case TYPE_TUPLE:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000346 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000347 v = newtupleobject((int)n);
348 if (v == NULL)
349 return v;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000350 for (i = 0; i < n; i++) {
351 v2 = r_object(p);
352 if ( v2 == NULL ) {
353 DECREF(v);
354 v = NULL;
355 break;
356 }
357 SETTUPLEITEM(v, (int)i, v2);
358 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000359 return v;
360
361 case TYPE_LIST:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000362 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000363 v = newlistobject((int)n);
364 if (v == NULL)
365 return v;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000366 for (i = 0; i < n; i++) {
367 v2 = r_object(p);
368 if ( v2 == NULL ) {
369 DECREF(v);
370 v = NULL;
371 break;
372 }
373 setlistitem(v, (int)i, v2);
374 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000375 return v;
376
Guido van Rossum64b45521991-06-07 13:58:22 +0000377 case TYPE_DICT:
378 v = newdictobject();
379 if (v == NULL)
380 return NULL;
381 for (;;) {
382 object *key, *val;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000383 key = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000384 if (key == NULL)
Jack Jansen9513f2c1995-10-27 13:21:28 +0000385 break; /* XXXX and how about memory errors? */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000386 val = r_object(p);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000387 /* XXXX error check? */
Guido van Rossum64b45521991-06-07 13:58:22 +0000388 dict2insert(v, key, val);
389 DECREF(key);
390 XDECREF(val);
391 }
392 return v;
393
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000394 case TYPE_CODE:
395 {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000396 int argcount = r_short(p);
397 int nlocals = r_short(p);
398 int flags = r_short(p);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000399 object *code = NULL;
400 object *consts = NULL;
401 object *names = NULL;
402 object *varnames = NULL;
403 object *filename = NULL;
404 object *name = NULL;
405
406 code = r_object(p);
407 if (code) consts = r_object(p);
408 if (consts) names = r_object(p);
409 if (names) varnames = r_object(p);
410 if (varnames) filename = r_object(p);
411 if (filename) name = r_object(p);
412
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000413 if (!err_occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000414 v = (object *) newcodeobject(
415 argcount, nlocals, flags,
416 code, consts, names, varnames,
417 filename, name);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000418 }
419 else
420 v = NULL;
421 XDECREF(code);
422 XDECREF(consts);
423 XDECREF(names);
424 XDECREF(filename);
Guido van Rossuma4403101994-10-05 12:24:16 +0000425 XDECREF(name);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000426
427 }
428 return v;
429
430 default:
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000431 err_setstr(TypeError, "read unknown object");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000432 return NULL;
433
434 }
435}
436
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000437long
438rd_long(fp)
439 FILE *fp;
440{
441 RFILE rf;
442 rf.fp = fp;
443 return r_long(&rf);
444}
445
446object *
447rd_object(fp)
448 FILE *fp;
449{
450 RFILE rf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000451 if (err_occurred()) {
Guido van Rossum05870111995-08-28 02:56:20 +0000452 fatal("XXX rd_object called with exception set"); /* tmp */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453 fprintf(stderr, "XXX rd_object called with exception set\n");
454 return NULL;
455 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000456 rf.fp = fp;
457 return r_object(&rf);
458}
459
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000460object *
461rds_object(str, len)
462 char *str;
463 int len;
464{
465 RFILE rf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000466 if (err_occurred()) {
467 fprintf(stderr, "XXX rds_object called with exception set\n");
468 return NULL;
469 }
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000470 rf.fp = NULL;
471 rf.str = NULL;
472 rf.ptr = str;
473 rf.end = str + len;
474 return r_object(&rf);
475}
476
Guido van Rossum64b45521991-06-07 13:58:22 +0000477/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000478
479static object *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000480marshal_dump(self, args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000481 object *self;
482 object *args;
483{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000484 WFILE wf;
485 object *x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000486 object *f;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000487 if (!getargs(args, "(OO)", &x, &f))
488 return NULL;
489 if (!is_fileobject(f)) {
490 err_setstr(TypeError, "marshal.dump() 2nd arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000491 return NULL;
492 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000493 wf.fp = getfilefile(f);
494 wf.str = NULL;
495 wf.ptr = wf.end = NULL;
496 w_object(x, &wf);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000497 INCREF(None);
498 return None;
499}
500
501static object *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000502marshal_load(self, args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000503 object *self;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000504 object *args;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000505{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000506 RFILE rf;
507 object *f;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000508 object *v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000509 if (!getargs(args, "O", &f))
510 return NULL;
511 if (!is_fileobject(f)) {
512 err_setstr(TypeError, "marshal.load() arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000513 return NULL;
514 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000515 rf.fp = getfilefile(f);
516 rf.str = NULL;
517 rf.ptr = rf.end = NULL;
518 err_clear();
519 v = r_object(&rf);
520 if (err_occurred()) {
521 XDECREF(v);
522 v = NULL;
523 }
524 return v;
525}
526
527static object *
528marshal_dumps(self, args)
529 object *self;
530 object *args;
531{
532 WFILE wf;
533 object *x;
534 if (!getargs(args, "O", &x))
535 return NULL;
536 wf.fp = NULL;
537 wf.str = newsizedstringobject((char *)NULL, 50);
538 if (wf.str == NULL)
539 return NULL;
540 wf.ptr = GETSTRINGVALUE((stringobject *)wf.str);
541 wf.end = wf.ptr + getstringsize(wf.str);
542 w_object(x, &wf);
543 if (wf.str != NULL)
544 resizestring(&wf.str,
545 (int) (wf.ptr - GETSTRINGVALUE((stringobject *)wf.str)));
546 return wf.str;
547}
548
549static object *
550marshal_loads(self, args)
551 object *self;
552 object *args;
553{
554 RFILE rf;
555 object *v;
556 char *s;
557 int n;
558 if (!getargs(args, "s#", &s, &n))
559 return NULL;
560 rf.fp = NULL;
561 rf.str = args;
562 rf.ptr = s;
563 rf.end = s + n;
564 err_clear();
565 v = r_object(&rf);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000566 if (err_occurred()) {
567 XDECREF(v);
568 v = NULL;
569 }
570 return v;
571}
572
573static struct methodlist marshal_methods[] = {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000574 {"dump", marshal_dump},
575 {"load", marshal_load},
576 {"dumps", marshal_dumps},
577 {"loads", marshal_loads},
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000578 {NULL, NULL} /* sentinel */
579};
580
581void
582initmarshal()
583{
584 (void) initmodule("marshal", marshal_methods);
585}