blob: 99f4e5e07a88dd8c44be8312631760fa258ac440 [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 Rossum1984f1e1992-08-04 12:41:02 +0000324 void *save, *save_thread(), restore_thread();
Guido van Rossumce5ba841991-03-06 13:06:18 +0000325 register FILE *fp;
326 register int c;
327 register char *buf, *end;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000328 int n1, n2;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329 object *v;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000330
Guido van Rossumc10aa771992-07-31 12:42:38 +0000331 fp = f->f_fp;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000332 n2 = n > 0 ? n : 100;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000333 v = newsizedstringobject((char *)NULL, n2);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000334 if (v == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000336 buf = BUF(v);
337 end = buf + n2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000338
339 save = save_thread();
Guido van Rossumce5ba841991-03-06 13:06:18 +0000340 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000341 if ((c = getc(fp)) == EOF) {
Guido van Rossum76ad8ed1991-06-03 10:54:55 +0000342 clearerr(fp);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000343 if (intrcheck()) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344 restore_thread(save);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000345 DECREF(v);
346 err_set(KeyboardInterrupt);
347 return NULL;
348 }
349 if (n < 0 && buf == BUF(v)) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000350 restore_thread(save);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000351 DECREF(v);
Guido van Rossum201be051991-12-24 13:26:41 +0000352 err_setstr(EOFError,
353 "EOF when reading a line");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000354 return NULL;
355 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000356 break;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000357 }
358 if ((*buf++ = c) == '\n') {
359 if (n < 0)
360 buf--;
361 break;
362 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000363 if (buf == end) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000364 if (n > 0)
Guido van Rossumce5ba841991-03-06 13:06:18 +0000365 break;
366 n1 = n2;
367 n2 += 1000;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000368 restore_thread(save);
Guido van Rossumce5ba841991-03-06 13:06:18 +0000369 if (resizestring(&v, n2) < 0)
370 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000371 save = save_thread();
Guido van Rossumce5ba841991-03-06 13:06:18 +0000372 buf = BUF(v) + n1;
373 end = BUF(v) + n2;
374 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000376 restore_thread(save);
377
Guido van Rossumce5ba841991-03-06 13:06:18 +0000378 n1 = buf - BUF(v);
379 if (n1 != n2)
380 resizestring(&v, n1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000381 return v;
382}
383
Guido van Rossum0bd24411991-04-04 15:21:57 +0000384/* External C interface */
385
386object *
387filegetline(f, n)
388 object *f;
389 int n;
390{
391 if (f == NULL || !is_fileobject(f)) {
392 err_badcall();
393 return NULL;
394 }
Guido van Rossumd7297e61992-07-06 14:19:26 +0000395 if (((fileobject*)f)->f_fp == NULL)
396 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000397 return getline((fileobject *)f, n);
398}
399
400/* Python method */
401
402static object *
403file_readline(f, args)
404 fileobject *f;
405 object *args;
406{
407 int n;
408
Guido van Rossumd7297e61992-07-06 14:19:26 +0000409 if (f->f_fp == NULL)
410 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000411 if (args == NULL)
412 n = 0; /* Unlimited */
413 else {
414 if (!getintarg(args, &n))
415 return NULL;
416 if (n < 0) {
Guido van Rossumd7297e61992-07-06 14:19:26 +0000417 err_setstr(ValueError, "negative readline count");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000418 return NULL;
419 }
420 }
421
Guido van Rossum51415a71992-03-27 17:23:38 +0000422 return getline(f, n);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000423}
424
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000425static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000426file_readlines(f, args)
427 fileobject *f;
428 object *args;
429{
430 object *list;
431 object *line;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000432
Guido van Rossumd7297e61992-07-06 14:19:26 +0000433 if (f->f_fp == NULL)
434 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000435 if (!getnoarg(args))
436 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000437 if ((list = newlistobject(0)) == NULL)
438 return NULL;
439 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000440 line = getline(f, 0);
Guido van Rossumce5ba841991-03-06 13:06:18 +0000441 if (line != NULL && getstringsize(line) == 0) {
442 DECREF(line);
443 break;
444 }
445 if (line == NULL || addlistitem(list, line) != 0) {
446 DECREF(list);
447 XDECREF(line);
448 return NULL;
449 }
450 DECREF(line);
451 }
452 return list;
453}
454
455static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000456file_write(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457 fileobject *f;
458 object *args;
459{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000460 char *s;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461 int n, n2;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000462 if (f->f_fp == NULL)
463 return err_closed();
464 if (!getargs(args, "s#", &s, &n))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000465 return NULL;
Guido van Rossumeb183da1991-04-04 10:44:06 +0000466 f->f_softspace = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000467 errno = 0;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000468 n2 = fwrite(s, 1, n, f->f_fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469 if (n2 != n) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000470 err_errno(IOError);
Guido van Rossumfebd5511992-03-04 16:39:24 +0000471 clearerr(f->f_fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472 return NULL;
473 }
474 INCREF(None);
475 return None;
476}
477
Guido van Rossum3f5da241990-12-20 15:06:42 +0000478static struct methodlist file_methods[] = {
Guido van Rossumce5ba841991-03-06 13:06:18 +0000479 {"close", file_close},
480 {"flush", file_flush},
Guido van Rossumed233a51992-06-23 09:07:03 +0000481 {"fileno", file_fileno},
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000482 {"isatty", file_isatty},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000483 {"read", file_read},
484 {"readline", file_readline},
Guido van Rossumce5ba841991-03-06 13:06:18 +0000485 {"readlines", file_readlines},
486 {"seek", file_seek},
487 {"tell", file_tell},
488 {"write", file_write},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489 {NULL, NULL} /* sentinel */
490};
491
492static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000493file_getattr(f, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000494 fileobject *f;
495 char *name;
496{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000497 return findmethod(file_methods, (object *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498}
499
500typeobject Filetype = {
501 OB_HEAD_INIT(&Typetype)
502 0,
503 "file",
504 sizeof(fileobject),
505 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000506 file_dealloc, /*tp_dealloc*/
507 file_print, /*tp_print*/
508 file_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000509 0, /*tp_setattr*/
510 0, /*tp_compare*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000511 file_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512};
Guido van Rossumeb183da1991-04-04 10:44:06 +0000513
514/* Interface for the 'soft space' between print items. */
515
516int
517softspace(f, newflag)
518 object *f;
519 int newflag;
520{
521 int oldflag = 0;
522 if (f != NULL && is_fileobject(f)) {
523 oldflag = ((fileobject *)f)->f_softspace;
524 ((fileobject *)f)->f_softspace = newflag;
525 }
526 return oldflag;
527}