blob: e64979244bc323c80dd4d40c6848c0f3802bf474 [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 Rossumff4949e1992-08-05 19:58:53 +000029#include "ceval.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030
Guido van Rossumce5ba841991-03-06 13:06:18 +000031#define BUF(v) GETSTRINGVALUE((stringobject *)v)
32
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "errno.h"
34#ifndef errno
35extern int errno;
36#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037
38typedef struct {
39 OB_HEAD
40 FILE *f_fp;
41 object *f_name;
42 object *f_mode;
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000043 int (*f_close) PROTO((FILE *));
Guido van Rossumeb183da1991-04-04 10:44:06 +000044 int f_softspace; /* Flag used by 'print' command */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045} fileobject;
46
47FILE *
48getfilefile(f)
49 object *f;
50{
Guido van Rossumd7297e61992-07-06 14:19:26 +000051 if (!is_fileobject(f) || ((fileobject *)f)->f_fp == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +000052 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053 return NULL;
54 }
55 return ((fileobject *)f)->f_fp;
56}
57
58object *
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000059newopenfileobject(fp, name, mode, close)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060 FILE *fp;
61 char *name;
62 char *mode;
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000063 int (*close) FPROTO((FILE *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064{
65 fileobject *f = NEWOBJ(fileobject, &Filetype);
66 if (f == NULL)
67 return NULL;
68 f->f_fp = NULL;
69 f->f_name = newstringobject(name);
70 f->f_mode = newstringobject(mode);
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000071 f->f_close = close;
Guido van Rossumeb183da1991-04-04 10:44:06 +000072 f->f_softspace = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 if (f->f_name == NULL || f->f_mode == NULL) {
74 DECREF(f);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075 return NULL;
76 }
77 f->f_fp = fp;
78 return (object *) f;
79}
80
81object *
82newfileobject(name, mode)
83 char *name, *mode;
84{
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000085 extern int fclose PROTO((FILE *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086 fileobject *f;
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +000087 f = (fileobject *) newopenfileobject((FILE *)NULL, name, mode, fclose);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088 if (f == NULL)
89 return NULL;
Guido van Rossuma08095a1991-02-13 23:25:27 +000090#ifdef THINK_C
91 if (*mode == '*') {
92 FILE *fopenRF();
93 f->f_fp = fopenRF(name, mode+1);
94 }
95 else
96#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +000097 {
98 BGN_SAVE
99 f->f_fp = fopen(name, mode);
100 END_SAVE
101 }
Guido van Rossuma08095a1991-02-13 23:25:27 +0000102 if (f->f_fp == NULL) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000103 err_errno(IOError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104 DECREF(f);
105 return NULL;
106 }
107 return (object *)f;
108}
109
Guido van Rossumd7297e61992-07-06 14:19:26 +0000110static object *
111err_closed()
112{
113 err_setstr(ValueError, "I/O operation on closed file");
114 return NULL;
115}
116
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117/* Methods */
118
119static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000120file_dealloc(f)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121 fileobject *f;
122{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000123 if (f->f_fp != NULL && f->f_close != NULL) {
124 BGN_SAVE
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000125 (*f->f_close)(f->f_fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000126 END_SAVE
127 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 if (f->f_name != NULL)
129 DECREF(f->f_name);
130 if (f->f_mode != NULL)
131 DECREF(f->f_mode);
132 free((char *)f);
133}
134
Guido van Rossum90933611991-06-07 16:10:43 +0000135static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000136file_print(f, fp, flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137 fileobject *f;
138 FILE *fp;
139 int flags;
140{
141 fprintf(fp, "<%s file ", f->f_fp == NULL ? "closed" : "open");
Guido van Rossum90933611991-06-07 16:10:43 +0000142 if (printobject(f->f_name, fp, flags) != 0)
143 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144 fprintf(fp, ", mode ");
Guido van Rossum90933611991-06-07 16:10:43 +0000145 if (printobject(f->f_mode, fp, flags) != 0)
146 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147 fprintf(fp, ">");
Guido van Rossum90933611991-06-07 16:10:43 +0000148 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149}
150
151static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000152file_repr(f)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 fileobject *f;
154{
155 char buf[300];
Guido van Rossum3f5da241990-12-20 15:06:42 +0000156 /* XXX This differs from file_print if the filename contains
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157 quotes or other funny characters. */
158 sprintf(buf, "<%s file '%.256s', mode '%.10s'>",
159 f->f_fp == NULL ? "closed" : "open",
160 getstringvalue(f->f_name),
161 getstringvalue(f->f_mode));
162 return newstringobject(buf);
163}
164
165static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000166file_close(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167 fileobject *f;
168 object *args;
169{
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000170 int sts = 0;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000171 if (!getnoarg(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173 if (f->f_fp != NULL) {
Guido van Rossumff4949e1992-08-05 19:58:53 +0000174 if (f->f_close != NULL) {
175 BGN_SAVE
176 errno = 0;
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000177 sts = (*f->f_close)(f->f_fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000178 END_SAVE
179 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180 f->f_fp = NULL;
181 }
Guido van Rossumfebd5511992-03-04 16:39:24 +0000182 if (sts == EOF)
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000183 return err_errno(IOError);
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000184 if (sts != 0)
185 return newintobject((long)sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186 INCREF(None);
187 return None;
188}
189
190static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000191file_seek(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192 fileobject *f;
193 object *args;
194{
Guido van Rossumce5ba841991-03-06 13:06:18 +0000195 long offset;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000196 int whence;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000197 int ret;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000198
Guido van Rossumd7297e61992-07-06 14:19:26 +0000199 if (f->f_fp == NULL)
200 return err_closed();
201 whence = 0;
202 if (!getargs(args, "l", &offset)) {
203 err_clear();
204 if (!getargs(args, "(li)", &offset, &whence))
Guido van Rossumce5ba841991-03-06 13:06:18 +0000205 return NULL;
206 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000207 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000208 errno = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000209 ret = fseek(f->f_fp, offset, whence);
210 END_SAVE
211 if (ret != 0) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000212 err_errno(IOError);
213 clearerr(f->f_fp);
214 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000215 }
216 INCREF(None);
217 return None;
218}
219
220static object *
221file_tell(f, args)
222 fileobject *f;
223 object *args;
224{
225 long offset;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000226 if (f->f_fp == NULL)
227 return err_closed();
228 if (!getnoarg(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000230 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000231 errno = 0;
232 offset = ftell(f->f_fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000233 END_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000234 if (offset == -1L) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000235 err_errno(IOError);
236 clearerr(f->f_fp);
237 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000238 }
239 return newintobject(offset);
240}
241
242static object *
Guido van Rossumed233a51992-06-23 09:07:03 +0000243file_fileno(f, args)
244 fileobject *f;
245 object *args;
246{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000247 if (f->f_fp == NULL)
248 return err_closed();
Guido van Rossumed233a51992-06-23 09:07:03 +0000249 if (!getnoarg(args))
250 return NULL;
251 return newintobject((long) fileno(f->f_fp));
252}
253
254static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000255file_flush(f, args)
256 fileobject *f;
257 object *args;
258{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000259 int res;
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 Rossum85a5fbb1990-10-14 12:07:46 +0000264 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000265 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000266 errno = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000267 res = fflush(f->f_fp);
268 END_SAVE
269 if (res != 0) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000270 err_errno(IOError);
271 clearerr(f->f_fp);
272 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000273 }
274 INCREF(None);
275 return None;
276}
277
278static object *
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000279file_isatty(f, args)
280 fileobject *f;
281 object *args;
282{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000283 long res;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000284 if (f->f_fp == NULL)
285 return err_closed();
286 if (!getnoarg(args))
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000287 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000288 BGN_SAVE
289 res = isatty((int)fileno(f->f_fp));
290 END_SAVE
291 return newintobject(res);
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000292}
293
294static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000295file_read(f, args)
296 fileobject *f;
297 object *args;
298{
299 int n, n1, n2, n3;
300 object *v;
301
Guido van Rossumd7297e61992-07-06 14:19:26 +0000302 if (f->f_fp == NULL)
303 return err_closed();
304 if (args == NULL) {
Guido van Rossumce5ba841991-03-06 13:06:18 +0000305 n = 0;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000306 if (n < 0) {
Guido van Rossumd7297e61992-07-06 14:19:26 +0000307 err_setstr(ValueError, "negative read count");
Guido van Rossumce5ba841991-03-06 13:06:18 +0000308 return NULL;
309 }
310 }
Guido van Rossumd7297e61992-07-06 14:19:26 +0000311 else if (!getargs(args, "i", &n))
312 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000313
314 n2 = n != 0 ? n : BUFSIZ;
315 v = newsizedstringobject((char *)NULL, n2);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000316 if (v == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000318 n1 = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000319 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000320 for (;;) {
321 n3 = fread(BUF(v)+n1, 1, n2-n1, f->f_fp);
322 /* XXX Error check? */
323 if (n3 == 0)
324 break;
325 n1 += n3;
326 if (n1 == n)
327 break;
328 if (n == 0) {
329 n2 = n1 + BUFSIZ;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000330 RET_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000331 if (resizestring(&v, n2) < 0)
332 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000333 RES_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000334 }
335 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000336 END_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000337 if (n1 != n2)
338 resizestring(&v, n1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339 return v;
340}
341
Guido van Rossum0bd24411991-04-04 15:21:57 +0000342/* Internal routine to get a line.
343 Size argument interpretation:
344 > 0: max length;
345 = 0: read arbitrary line;
346 < 0: strip trailing '\n', raise EOFError if EOF reached immediately
Guido van Rossumce5ba841991-03-06 13:06:18 +0000347*/
348
Guido van Rossum0bd24411991-04-04 15:21:57 +0000349object *
350getline(f, n)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351 fileobject *f;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000352 int n;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353{
Guido van Rossumce5ba841991-03-06 13:06:18 +0000354 register FILE *fp;
355 register int c;
356 register char *buf, *end;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000357 int n1, n2;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358 object *v;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000359
Guido van Rossumc10aa771992-07-31 12:42:38 +0000360 fp = f->f_fp;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000361 n2 = n > 0 ? n : 100;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000362 v = newsizedstringobject((char *)NULL, n2);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000363 if (v == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000365 buf = BUF(v);
366 end = buf + n2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000367
Guido van Rossumff4949e1992-08-05 19:58:53 +0000368 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000369 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000370 if ((c = getc(fp)) == EOF) {
Guido van Rossum76ad8ed1991-06-03 10:54:55 +0000371 clearerr(fp);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000372 if (intrcheck()) {
Guido van Rossumff4949e1992-08-05 19:58:53 +0000373 RET_SAVE
Guido van Rossum0bd24411991-04-04 15:21:57 +0000374 DECREF(v);
375 err_set(KeyboardInterrupt);
376 return NULL;
377 }
378 if (n < 0 && buf == BUF(v)) {
Guido van Rossumff4949e1992-08-05 19:58:53 +0000379 RET_SAVE
Guido van Rossum0bd24411991-04-04 15:21:57 +0000380 DECREF(v);
Guido van Rossum201be051991-12-24 13:26:41 +0000381 err_setstr(EOFError,
382 "EOF when reading a line");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000383 return NULL;
384 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000385 break;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000386 }
387 if ((*buf++ = c) == '\n') {
388 if (n < 0)
389 buf--;
390 break;
391 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000392 if (buf == end) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000393 if (n > 0)
Guido van Rossumce5ba841991-03-06 13:06:18 +0000394 break;
395 n1 = n2;
396 n2 += 1000;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000397 RET_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000398 if (resizestring(&v, n2) < 0)
399 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000400 RES_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000401 buf = BUF(v) + n1;
402 end = BUF(v) + n2;
403 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000405 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000406
Guido van Rossumce5ba841991-03-06 13:06:18 +0000407 n1 = buf - BUF(v);
408 if (n1 != n2)
409 resizestring(&v, n1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410 return v;
411}
412
Guido van Rossum0bd24411991-04-04 15:21:57 +0000413/* External C interface */
414
415object *
416filegetline(f, n)
417 object *f;
418 int n;
419{
420 if (f == NULL || !is_fileobject(f)) {
421 err_badcall();
422 return NULL;
423 }
Guido van Rossumd7297e61992-07-06 14:19:26 +0000424 if (((fileobject*)f)->f_fp == NULL)
425 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000426 return getline((fileobject *)f, n);
427}
428
429/* Python method */
430
431static object *
432file_readline(f, args)
433 fileobject *f;
434 object *args;
435{
436 int n;
437
Guido van Rossumd7297e61992-07-06 14:19:26 +0000438 if (f->f_fp == NULL)
439 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000440 if (args == NULL)
441 n = 0; /* Unlimited */
442 else {
443 if (!getintarg(args, &n))
444 return NULL;
445 if (n < 0) {
Guido van Rossumd7297e61992-07-06 14:19:26 +0000446 err_setstr(ValueError, "negative readline count");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000447 return NULL;
448 }
449 }
450
Guido van Rossum51415a71992-03-27 17:23:38 +0000451 return getline(f, n);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000452}
453
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000455file_readlines(f, args)
456 fileobject *f;
457 object *args;
458{
459 object *list;
460 object *line;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000461
Guido van Rossumd7297e61992-07-06 14:19:26 +0000462 if (f->f_fp == NULL)
463 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000464 if (!getnoarg(args))
465 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000466 if ((list = newlistobject(0)) == NULL)
467 return NULL;
468 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000469 line = getline(f, 0);
Guido van Rossumce5ba841991-03-06 13:06:18 +0000470 if (line != NULL && getstringsize(line) == 0) {
471 DECREF(line);
472 break;
473 }
474 if (line == NULL || addlistitem(list, line) != 0) {
475 DECREF(list);
476 XDECREF(line);
477 return NULL;
478 }
479 DECREF(line);
480 }
481 return list;
482}
483
484static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000485file_write(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486 fileobject *f;
487 object *args;
488{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000489 char *s;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490 int n, n2;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000491 if (f->f_fp == NULL)
492 return err_closed();
493 if (!getargs(args, "s#", &s, &n))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000494 return NULL;
Guido van Rossumeb183da1991-04-04 10:44:06 +0000495 f->f_softspace = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000496 BGN_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000497 errno = 0;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000498 n2 = fwrite(s, 1, n, f->f_fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000499 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000500 if (n2 != n) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000501 err_errno(IOError);
Guido van Rossumfebd5511992-03-04 16:39:24 +0000502 clearerr(f->f_fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000503 return NULL;
504 }
505 INCREF(None);
506 return None;
507}
508
Guido van Rossum3f5da241990-12-20 15:06:42 +0000509static struct methodlist file_methods[] = {
Guido van Rossumce5ba841991-03-06 13:06:18 +0000510 {"close", file_close},
511 {"flush", file_flush},
Guido van Rossumed233a51992-06-23 09:07:03 +0000512 {"fileno", file_fileno},
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000513 {"isatty", file_isatty},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000514 {"read", file_read},
515 {"readline", file_readline},
Guido van Rossumce5ba841991-03-06 13:06:18 +0000516 {"readlines", file_readlines},
517 {"seek", file_seek},
518 {"tell", file_tell},
519 {"write", file_write},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000520 {NULL, NULL} /* sentinel */
521};
522
523static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000524file_getattr(f, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000525 fileobject *f;
526 char *name;
527{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000528 return findmethod(file_methods, (object *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000529}
530
531typeobject Filetype = {
532 OB_HEAD_INIT(&Typetype)
533 0,
534 "file",
535 sizeof(fileobject),
536 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000537 file_dealloc, /*tp_dealloc*/
538 file_print, /*tp_print*/
539 file_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000540 0, /*tp_setattr*/
541 0, /*tp_compare*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000542 file_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000543};
Guido van Rossumeb183da1991-04-04 10:44:06 +0000544
545/* Interface for the 'soft space' between print items. */
546
547int
548softspace(f, newflag)
549 object *f;
550 int newflag;
551{
552 int oldflag = 0;
553 if (f != NULL && is_fileobject(f)) {
554 oldflag = ((fileobject *)f)->f_softspace;
555 ((fileobject *)f)->f_softspace = newflag;
556 }
557 return oldflag;
558}