blob: b026413a1ab315a9a72c19c80b4a7bd969b00e0b [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 Rossumc10aa771992-07-31 12:42:38 +0000330 fp = f->f_fp;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000331 n2 = n > 0 ? n : 100;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000332 v = newsizedstringobject((char *)NULL, n2);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000333 if (v == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000335 buf = BUF(v);
336 end = buf + n2;
337
338 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000339 if ((c = getc(fp)) == EOF) {
Guido van Rossum76ad8ed1991-06-03 10:54:55 +0000340 clearerr(fp);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000341 if (intrcheck()) {
342 DECREF(v);
343 err_set(KeyboardInterrupt);
344 return NULL;
345 }
346 if (n < 0 && buf == BUF(v)) {
347 DECREF(v);
Guido van Rossum201be051991-12-24 13:26:41 +0000348 err_setstr(EOFError,
349 "EOF when reading a line");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000350 return NULL;
351 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000352 break;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000353 }
354 if ((*buf++ = c) == '\n') {
355 if (n < 0)
356 buf--;
357 break;
358 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000359 if (buf == end) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000360 if (n > 0)
Guido van Rossumce5ba841991-03-06 13:06:18 +0000361 break;
362 n1 = n2;
363 n2 += 1000;
364 if (resizestring(&v, n2) < 0)
365 return NULL;
366 buf = BUF(v) + n1;
367 end = BUF(v) + n2;
368 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000370
371 n1 = buf - BUF(v);
372 if (n1 != n2)
373 resizestring(&v, n1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374 return v;
375}
376
Guido van Rossum0bd24411991-04-04 15:21:57 +0000377/* External C interface */
378
379object *
380filegetline(f, n)
381 object *f;
382 int n;
383{
384 if (f == NULL || !is_fileobject(f)) {
385 err_badcall();
386 return NULL;
387 }
Guido van Rossumd7297e61992-07-06 14:19:26 +0000388 if (((fileobject*)f)->f_fp == NULL)
389 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000390 return getline((fileobject *)f, n);
391}
392
393/* Python method */
394
395static object *
396file_readline(f, args)
397 fileobject *f;
398 object *args;
399{
400 int n;
401
Guido van Rossumd7297e61992-07-06 14:19:26 +0000402 if (f->f_fp == NULL)
403 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000404 if (args == NULL)
405 n = 0; /* Unlimited */
406 else {
407 if (!getintarg(args, &n))
408 return NULL;
409 if (n < 0) {
Guido van Rossumd7297e61992-07-06 14:19:26 +0000410 err_setstr(ValueError, "negative readline count");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000411 return NULL;
412 }
413 }
414
Guido van Rossum51415a71992-03-27 17:23:38 +0000415 return getline(f, n);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000416}
417
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000419file_readlines(f, args)
420 fileobject *f;
421 object *args;
422{
423 object *list;
424 object *line;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000425
Guido van Rossumd7297e61992-07-06 14:19:26 +0000426 if (f->f_fp == NULL)
427 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000428 if (!getnoarg(args))
429 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000430 if ((list = newlistobject(0)) == NULL)
431 return NULL;
432 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000433 line = getline(f, 0);
Guido van Rossumce5ba841991-03-06 13:06:18 +0000434 if (line != NULL && getstringsize(line) == 0) {
435 DECREF(line);
436 break;
437 }
438 if (line == NULL || addlistitem(list, line) != 0) {
439 DECREF(list);
440 XDECREF(line);
441 return NULL;
442 }
443 DECREF(line);
444 }
445 return list;
446}
447
448static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000449file_write(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450 fileobject *f;
451 object *args;
452{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000453 char *s;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454 int n, n2;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000455 if (f->f_fp == NULL)
456 return err_closed();
457 if (!getargs(args, "s#", &s, &n))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458 return NULL;
Guido van Rossumeb183da1991-04-04 10:44:06 +0000459 f->f_softspace = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460 errno = 0;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000461 n2 = fwrite(s, 1, n, f->f_fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000462 if (n2 != n) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000463 err_errno(IOError);
Guido van Rossumfebd5511992-03-04 16:39:24 +0000464 clearerr(f->f_fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000465 return NULL;
466 }
467 INCREF(None);
468 return None;
469}
470
Guido van Rossum3f5da241990-12-20 15:06:42 +0000471static struct methodlist file_methods[] = {
Guido van Rossumce5ba841991-03-06 13:06:18 +0000472 {"close", file_close},
473 {"flush", file_flush},
Guido van Rossumed233a51992-06-23 09:07:03 +0000474 {"fileno", file_fileno},
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000475 {"isatty", file_isatty},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000476 {"read", file_read},
477 {"readline", file_readline},
Guido van Rossumce5ba841991-03-06 13:06:18 +0000478 {"readlines", file_readlines},
479 {"seek", file_seek},
480 {"tell", file_tell},
481 {"write", file_write},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000482 {NULL, NULL} /* sentinel */
483};
484
485static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000486file_getattr(f, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487 fileobject *f;
488 char *name;
489{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000490 return findmethod(file_methods, (object *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000491}
492
493typeobject Filetype = {
494 OB_HEAD_INIT(&Typetype)
495 0,
496 "file",
497 sizeof(fileobject),
498 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000499 file_dealloc, /*tp_dealloc*/
500 file_print, /*tp_print*/
501 file_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000502 0, /*tp_setattr*/
503 0, /*tp_compare*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000504 file_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000505};
Guido van Rossumeb183da1991-04-04 10:44:06 +0000506
507/* Interface for the 'soft space' between print items. */
508
509int
510softspace(f, newflag)
511 object *f;
512 int newflag;
513{
514 int oldflag = 0;
515 if (f != NULL && is_fileobject(f)) {
516 oldflag = ((fileobject *)f)->f_softspace;
517 ((fileobject *)f)->f_softspace = newflag;
518 }
519 return oldflag;
520}