blob: d9162bba190bc14b67897a6975c1b32adb3c3aa8 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumbab9d031992-04-05 14:26:55 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumf70e43a1991-02-19 12:39:46 +00003Netherlands.
4
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
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* File object implementation */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossumfa3da8a1992-01-27 16:53:23 +000028#include "modsupport.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029
Guido van Rossumce5ba841991-03-06 13:06:18 +000030#define BUF(v) GETSTRINGVALUE((stringobject *)v)
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032#include "errno.h"
33#ifndef errno
34extern int errno;
35#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036
37typedef struct {
38 OB_HEAD
39 FILE *f_fp;
40 object *f_name;
41 object *f_mode;
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000042 int (*f_close) PROTO((FILE *));
Guido van Rossumeb183da1991-04-04 10:44:06 +000043 int f_softspace; /* Flag used by 'print' command */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044} fileobject;
45
46FILE *
47getfilefile(f)
48 object *f;
49{
Guido van Rossumd7297e61992-07-06 14:19:26 +000050 if (!is_fileobject(f) || ((fileobject *)f)->f_fp == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +000051 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052 return NULL;
53 }
54 return ((fileobject *)f)->f_fp;
55}
56
57object *
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000058newopenfileobject(fp, name, mode, close)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 FILE *fp;
60 char *name;
61 char *mode;
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000062 int (*close) FPROTO((FILE *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063{
64 fileobject *f = NEWOBJ(fileobject, &Filetype);
65 if (f == NULL)
66 return NULL;
67 f->f_fp = NULL;
68 f->f_name = newstringobject(name);
69 f->f_mode = newstringobject(mode);
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000070 f->f_close = close;
Guido van Rossumeb183da1991-04-04 10:44:06 +000071 f->f_softspace = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072 if (f->f_name == NULL || f->f_mode == NULL) {
73 DECREF(f);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074 return NULL;
75 }
76 f->f_fp = fp;
77 return (object *) f;
78}
79
80object *
81newfileobject(name, mode)
82 char *name, *mode;
83{
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000084 extern int fclose PROTO((FILE *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085 fileobject *f;
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000086 f = (fileobject *) newopenfileobject((FILE *)NULL, name, mode, fclose);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087 if (f == NULL)
88 return NULL;
Guido van Rossuma08095a1991-02-13 23:25:27 +000089#ifdef THINK_C
90 if (*mode == '*') {
91 FILE *fopenRF();
92 f->f_fp = fopenRF(name, mode+1);
93 }
94 else
95#endif
96 f->f_fp = fopen(name, mode);
97 if (f->f_fp == NULL) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +000098 err_errno(IOError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099 DECREF(f);
100 return NULL;
101 }
102 return (object *)f;
103}
104
Guido van Rossumd7297e61992-07-06 14:19:26 +0000105static object *
106err_closed()
107{
108 err_setstr(ValueError, "I/O operation on closed file");
109 return NULL;
110}
111
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112/* Methods */
113
114static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000115file_dealloc(f)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 fileobject *f;
117{
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000118 if (f->f_fp != NULL && f->f_close != NULL)
119 (*f->f_close)(f->f_fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120 if (f->f_name != NULL)
121 DECREF(f->f_name);
122 if (f->f_mode != NULL)
123 DECREF(f->f_mode);
124 free((char *)f);
125}
126
Guido van Rossum90933611991-06-07 16:10:43 +0000127static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000128file_print(f, fp, flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129 fileobject *f;
130 FILE *fp;
131 int flags;
132{
133 fprintf(fp, "<%s file ", f->f_fp == NULL ? "closed" : "open");
Guido van Rossum90933611991-06-07 16:10:43 +0000134 if (printobject(f->f_name, fp, flags) != 0)
135 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136 fprintf(fp, ", mode ");
Guido van Rossum90933611991-06-07 16:10:43 +0000137 if (printobject(f->f_mode, fp, flags) != 0)
138 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139 fprintf(fp, ">");
Guido van Rossum90933611991-06-07 16:10:43 +0000140 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141}
142
143static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000144file_repr(f)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145 fileobject *f;
146{
147 char buf[300];
Guido van Rossum3f5da241990-12-20 15:06:42 +0000148 /* XXX This differs from file_print if the filename contains
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149 quotes or other funny characters. */
150 sprintf(buf, "<%s file '%.256s', mode '%.10s'>",
151 f->f_fp == NULL ? "closed" : "open",
152 getstringvalue(f->f_name),
153 getstringvalue(f->f_mode));
154 return newstringobject(buf);
155}
156
157static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000158file_close(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159 fileobject *f;
160 object *args;
161{
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000162 int sts = 0;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000163 if (!getnoarg(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000164 return NULL;
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000165 errno = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166 if (f->f_fp != NULL) {
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000167 if (f->f_close != NULL)
168 sts = (*f->f_close)(f->f_fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169 f->f_fp = NULL;
170 }
Guido van Rossumfebd5511992-03-04 16:39:24 +0000171 if (sts == EOF)
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000172 return err_errno(IOError);
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000173 if (sts != 0)
174 return newintobject((long)sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000175 INCREF(None);
176 return None;
177}
178
179static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000180file_seek(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181 fileobject *f;
182 object *args;
183{
Guido van Rossumce5ba841991-03-06 13:06:18 +0000184 long offset;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000185 int whence;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000186
Guido van Rossumd7297e61992-07-06 14:19:26 +0000187 if (f->f_fp == NULL)
188 return err_closed();
189 whence = 0;
190 if (!getargs(args, "l", &offset)) {
191 err_clear();
192 if (!getargs(args, "(li)", &offset, &whence))
Guido van Rossumce5ba841991-03-06 13:06:18 +0000193 return NULL;
194 }
195 errno = 0;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000196 if (fseek(f->f_fp, offset, whence) != 0) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000197 err_errno(IOError);
198 clearerr(f->f_fp);
199 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000200 }
201 INCREF(None);
202 return None;
203}
204
205static object *
206file_tell(f, args)
207 fileobject *f;
208 object *args;
209{
210 long offset;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000211 if (f->f_fp == NULL)
212 return err_closed();
213 if (!getnoarg(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000215 errno = 0;
216 offset = ftell(f->f_fp);
217 if (offset == -1L) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000218 err_errno(IOError);
219 clearerr(f->f_fp);
220 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000221 }
222 return newintobject(offset);
223}
224
225static object *
Guido van Rossumed233a51992-06-23 09:07:03 +0000226file_fileno(f, args)
227 fileobject *f;
228 object *args;
229{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000230 if (f->f_fp == NULL)
231 return err_closed();
Guido van Rossumed233a51992-06-23 09:07:03 +0000232 if (!getnoarg(args))
233 return NULL;
234 return newintobject((long) fileno(f->f_fp));
235}
236
237static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000238file_flush(f, args)
239 fileobject *f;
240 object *args;
241{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000242 if (f->f_fp == NULL)
243 return err_closed();
244 if (!getnoarg(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000246 errno = 0;
247 if (fflush(f->f_fp) != 0) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000248 err_errno(IOError);
249 clearerr(f->f_fp);
250 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000251 }
252 INCREF(None);
253 return None;
254}
255
256static object *
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000257file_isatty(f, args)
258 fileobject *f;
259 object *args;
260{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000261 if (f->f_fp == NULL)
262 return err_closed();
263 if (!getnoarg(args))
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000264 return NULL;
Guido van Rossum51415a71992-03-27 17:23:38 +0000265 return newintobject((long)isatty((int)fileno(f->f_fp)));
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000266}
267
268static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000269file_read(f, args)
270 fileobject *f;
271 object *args;
272{
273 int n, n1, n2, n3;
274 object *v;
275
Guido van Rossumd7297e61992-07-06 14:19:26 +0000276 if (f->f_fp == NULL)
277 return err_closed();
278 if (args == NULL) {
Guido van Rossumce5ba841991-03-06 13:06:18 +0000279 n = 0;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000280 if (n < 0) {
Guido van Rossumd7297e61992-07-06 14:19:26 +0000281 err_setstr(ValueError, "negative read count");
Guido van Rossumce5ba841991-03-06 13:06:18 +0000282 return NULL;
283 }
284 }
Guido van Rossumd7297e61992-07-06 14:19:26 +0000285 else if (!getargs(args, "i", &n))
286 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000287
288 n2 = n != 0 ? n : BUFSIZ;
289 v = newsizedstringobject((char *)NULL, n2);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290 if (v == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000292 n1 = 0;
293 for (;;) {
294 n3 = fread(BUF(v)+n1, 1, n2-n1, f->f_fp);
295 /* XXX Error check? */
296 if (n3 == 0)
297 break;
298 n1 += n3;
299 if (n1 == n)
300 break;
301 if (n == 0) {
302 n2 = n1 + BUFSIZ;
303 if (resizestring(&v, n2) < 0)
304 return NULL;
305 }
306 }
307 if (n1 != n2)
308 resizestring(&v, n1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309 return v;
310}
311
Guido van Rossum0bd24411991-04-04 15:21:57 +0000312/* Internal routine to get a line.
313 Size argument interpretation:
314 > 0: max length;
315 = 0: read arbitrary line;
316 < 0: strip trailing '\n', raise EOFError if EOF reached immediately
Guido van Rossumce5ba841991-03-06 13:06:18 +0000317*/
318
Guido van Rossum0bd24411991-04-04 15:21:57 +0000319object *
320getline(f, n)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 fileobject *f;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000322 int n;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000323{
Guido van Rossumce5ba841991-03-06 13:06:18 +0000324 register FILE *fp;
325 register int c;
326 register char *buf, *end;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000327 int n1, n2;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328 object *v;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000329
Guido van Rossum0bd24411991-04-04 15:21:57 +0000330 n2 = n > 0 ? n : 100;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000331 v = newsizedstringobject((char *)NULL, n2);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000332 if (v == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000334 buf = BUF(v);
335 end = buf + n2;
336
337 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000338 if ((c = getc(fp)) == EOF) {
Guido van Rossum76ad8ed1991-06-03 10:54:55 +0000339 clearerr(fp);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000340 if (intrcheck()) {
341 DECREF(v);
342 err_set(KeyboardInterrupt);
343 return NULL;
344 }
345 if (n < 0 && buf == BUF(v)) {
346 DECREF(v);
Guido van Rossum201be051991-12-24 13:26:41 +0000347 err_setstr(EOFError,
348 "EOF when reading a line");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000349 return NULL;
350 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000351 break;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000352 }
353 if ((*buf++ = c) == '\n') {
354 if (n < 0)
355 buf--;
356 break;
357 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000358 if (buf == end) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000359 if (n > 0)
Guido van Rossumce5ba841991-03-06 13:06:18 +0000360 break;
361 n1 = n2;
362 n2 += 1000;
363 if (resizestring(&v, n2) < 0)
364 return NULL;
365 buf = BUF(v) + n1;
366 end = BUF(v) + n2;
367 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000369
370 n1 = buf - BUF(v);
371 if (n1 != n2)
372 resizestring(&v, n1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 return v;
374}
375
Guido van Rossum0bd24411991-04-04 15:21:57 +0000376/* External C interface */
377
378object *
379filegetline(f, n)
380 object *f;
381 int n;
382{
383 if (f == NULL || !is_fileobject(f)) {
384 err_badcall();
385 return NULL;
386 }
Guido van Rossumd7297e61992-07-06 14:19:26 +0000387 if (((fileobject*)f)->f_fp == NULL)
388 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000389 return getline((fileobject *)f, n);
390}
391
392/* Python method */
393
394static object *
395file_readline(f, args)
396 fileobject *f;
397 object *args;
398{
399 int n;
400
Guido van Rossumd7297e61992-07-06 14:19:26 +0000401 if (f->f_fp == NULL)
402 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000403 if (args == NULL)
404 n = 0; /* Unlimited */
405 else {
406 if (!getintarg(args, &n))
407 return NULL;
408 if (n < 0) {
Guido van Rossumd7297e61992-07-06 14:19:26 +0000409 err_setstr(ValueError, "negative readline count");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000410 return NULL;
411 }
412 }
413
Guido van Rossum51415a71992-03-27 17:23:38 +0000414 return getline(f, n);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000415}
416
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000418file_readlines(f, args)
419 fileobject *f;
420 object *args;
421{
422 object *list;
423 object *line;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000424
Guido van Rossumd7297e61992-07-06 14:19:26 +0000425 if (f->f_fp == NULL)
426 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000427 if (!getnoarg(args))
428 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000429 if ((list = newlistobject(0)) == NULL)
430 return NULL;
431 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000432 line = getline(f, 0);
Guido van Rossumce5ba841991-03-06 13:06:18 +0000433 if (line != NULL && getstringsize(line) == 0) {
434 DECREF(line);
435 break;
436 }
437 if (line == NULL || addlistitem(list, line) != 0) {
438 DECREF(list);
439 XDECREF(line);
440 return NULL;
441 }
442 DECREF(line);
443 }
444 return list;
445}
446
447static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000448file_write(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449 fileobject *f;
450 object *args;
451{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000452 char *s;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453 int n, n2;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000454 if (f->f_fp == NULL)
455 return err_closed();
456 if (!getargs(args, "s#", &s, &n))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457 return NULL;
Guido van Rossumeb183da1991-04-04 10:44:06 +0000458 f->f_softspace = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459 errno = 0;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000460 n2 = fwrite(s, 1, n, f->f_fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461 if (n2 != n) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000462 err_errno(IOError);
Guido van Rossumfebd5511992-03-04 16:39:24 +0000463 clearerr(f->f_fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464 return NULL;
465 }
466 INCREF(None);
467 return None;
468}
469
Guido van Rossum3f5da241990-12-20 15:06:42 +0000470static struct methodlist file_methods[] = {
Guido van Rossumce5ba841991-03-06 13:06:18 +0000471 {"close", file_close},
472 {"flush", file_flush},
Guido van Rossumed233a51992-06-23 09:07:03 +0000473 {"fileno", file_fileno},
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000474 {"isatty", file_isatty},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000475 {"read", file_read},
476 {"readline", file_readline},
Guido van Rossumce5ba841991-03-06 13:06:18 +0000477 {"readlines", file_readlines},
478 {"seek", file_seek},
479 {"tell", file_tell},
480 {"write", file_write},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481 {NULL, NULL} /* sentinel */
482};
483
484static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000485file_getattr(f, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486 fileobject *f;
487 char *name;
488{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000489 return findmethod(file_methods, (object *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490}
491
492typeobject Filetype = {
493 OB_HEAD_INIT(&Typetype)
494 0,
495 "file",
496 sizeof(fileobject),
497 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000498 file_dealloc, /*tp_dealloc*/
499 file_print, /*tp_print*/
500 file_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501 0, /*tp_setattr*/
502 0, /*tp_compare*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000503 file_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000504};
Guido van Rossumeb183da1991-04-04 10:44:06 +0000505
506/* Interface for the 'soft space' between print items. */
507
508int
509softspace(f, newflag)
510 object *f;
511 int newflag;
512{
513 int oldflag = 0;
514 if (f != NULL && is_fileobject(f)) {
515 oldflag = ((fileobject *)f)->f_softspace;
516 ((fileobject *)f)->f_softspace = newflag;
517 }
518 return oldflag;
519}