blob: 52dd668bfe81a4b310b1cc49fc7d34233043c6f7 [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 Rossum3165fe61992-09-25 21:59:05 +000051 if (f == NULL || !is_fileobject(f))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052 return NULL;
Guido van Rossum3165fe61992-09-25 21:59:05 +000053 else
54 return ((fileobject *)f)->f_fp;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055}
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
Guido van Rossumff4949e1992-08-05 19:58:53 +000096 {
97 BGN_SAVE
98 f->f_fp = fopen(name, mode);
99 END_SAVE
100 }
Guido van Rossuma08095a1991-02-13 23:25:27 +0000101 if (f->f_fp == NULL) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000102 err_errno(IOError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103 DECREF(f);
104 return NULL;
105 }
106 return (object *)f;
107}
108
Guido van Rossumd7297e61992-07-06 14:19:26 +0000109static object *
110err_closed()
111{
112 err_setstr(ValueError, "I/O operation on closed file");
113 return NULL;
114}
115
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116/* Methods */
117
118static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000119file_dealloc(f)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120 fileobject *f;
121{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000122 if (f->f_fp != NULL && f->f_close != NULL) {
123 BGN_SAVE
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000124 (*f->f_close)(f->f_fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000125 END_SAVE
126 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127 if (f->f_name != NULL)
128 DECREF(f->f_name);
129 if (f->f_mode != NULL)
130 DECREF(f->f_mode);
131 free((char *)f);
132}
133
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000135file_repr(f)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136 fileobject *f;
137{
138 char buf[300];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139 sprintf(buf, "<%s file '%.256s', mode '%.10s'>",
140 f->f_fp == NULL ? "closed" : "open",
141 getstringvalue(f->f_name),
142 getstringvalue(f->f_mode));
143 return newstringobject(buf);
144}
145
146static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000147file_close(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 fileobject *f;
149 object *args;
150{
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000151 int sts = 0;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000152 if (!getnoarg(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154 if (f->f_fp != NULL) {
Guido van Rossumff4949e1992-08-05 19:58:53 +0000155 if (f->f_close != NULL) {
156 BGN_SAVE
157 errno = 0;
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000158 sts = (*f->f_close)(f->f_fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000159 END_SAVE
160 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161 f->f_fp = NULL;
162 }
Guido van Rossumfebd5511992-03-04 16:39:24 +0000163 if (sts == EOF)
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000164 return err_errno(IOError);
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000165 if (sts != 0)
166 return newintobject((long)sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167 INCREF(None);
168 return None;
169}
170
171static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000172file_seek(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173 fileobject *f;
174 object *args;
175{
Guido van Rossumce5ba841991-03-06 13:06:18 +0000176 long offset;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000177 int whence;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000178 int ret;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000179
Guido van Rossumd7297e61992-07-06 14:19:26 +0000180 if (f->f_fp == NULL)
181 return err_closed();
182 whence = 0;
183 if (!getargs(args, "l", &offset)) {
184 err_clear();
185 if (!getargs(args, "(li)", &offset, &whence))
Guido van Rossumce5ba841991-03-06 13:06:18 +0000186 return NULL;
187 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000188 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000189 errno = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000190 ret = fseek(f->f_fp, offset, whence);
191 END_SAVE
192 if (ret != 0) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000193 err_errno(IOError);
194 clearerr(f->f_fp);
195 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000196 }
197 INCREF(None);
198 return None;
199}
200
201static object *
202file_tell(f, args)
203 fileobject *f;
204 object *args;
205{
206 long offset;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000207 if (f->f_fp == NULL)
208 return err_closed();
209 if (!getnoarg(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000211 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000212 errno = 0;
213 offset = ftell(f->f_fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000214 END_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000215 if (offset == -1L) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000216 err_errno(IOError);
217 clearerr(f->f_fp);
218 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000219 }
220 return newintobject(offset);
221}
222
223static object *
Guido van Rossumed233a51992-06-23 09:07:03 +0000224file_fileno(f, args)
225 fileobject *f;
226 object *args;
227{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000228 if (f->f_fp == NULL)
229 return err_closed();
Guido van Rossumed233a51992-06-23 09:07:03 +0000230 if (!getnoarg(args))
231 return NULL;
232 return newintobject((long) fileno(f->f_fp));
233}
234
235static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000236file_flush(f, args)
237 fileobject *f;
238 object *args;
239{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000240 int res;
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 Rossumff4949e1992-08-05 19:58:53 +0000246 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000247 errno = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000248 res = fflush(f->f_fp);
249 END_SAVE
250 if (res != 0) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000251 err_errno(IOError);
252 clearerr(f->f_fp);
253 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000254 }
255 INCREF(None);
256 return None;
257}
258
259static object *
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000260file_isatty(f, args)
261 fileobject *f;
262 object *args;
263{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000264 long res;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000265 if (f->f_fp == NULL)
266 return err_closed();
267 if (!getnoarg(args))
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000268 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000269 BGN_SAVE
270 res = isatty((int)fileno(f->f_fp));
271 END_SAVE
272 return newintobject(res);
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000273}
274
275static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000276file_read(f, args)
277 fileobject *f;
278 object *args;
279{
280 int n, n1, n2, n3;
281 object *v;
282
Guido van Rossumd7297e61992-07-06 14:19:26 +0000283 if (f->f_fp == NULL)
284 return err_closed();
285 if (args == NULL) {
Guido van Rossumce5ba841991-03-06 13:06:18 +0000286 n = 0;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000287 if (n < 0) {
Guido van Rossumd7297e61992-07-06 14:19:26 +0000288 err_setstr(ValueError, "negative read count");
Guido van Rossumce5ba841991-03-06 13:06:18 +0000289 return NULL;
290 }
291 }
Guido van Rossumd7297e61992-07-06 14:19:26 +0000292 else if (!getargs(args, "i", &n))
293 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000294
295 n2 = n != 0 ? n : BUFSIZ;
296 v = newsizedstringobject((char *)NULL, n2);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000297 if (v == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000299 n1 = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000300 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000301 for (;;) {
302 n3 = fread(BUF(v)+n1, 1, n2-n1, f->f_fp);
303 /* XXX Error check? */
304 if (n3 == 0)
305 break;
306 n1 += n3;
307 if (n1 == n)
308 break;
309 if (n == 0) {
310 n2 = n1 + BUFSIZ;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000311 RET_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000312 if (resizestring(&v, n2) < 0)
313 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000314 RES_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000315 }
316 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000317 END_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000318 if (n1 != n2)
319 resizestring(&v, n1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320 return v;
321}
322
Guido van Rossum0bd24411991-04-04 15:21:57 +0000323/* Internal routine to get a line.
324 Size argument interpretation:
325 > 0: max length;
326 = 0: read arbitrary line;
327 < 0: strip trailing '\n', raise EOFError if EOF reached immediately
Guido van Rossumce5ba841991-03-06 13:06:18 +0000328*/
329
Guido van Rossum0bd24411991-04-04 15:21:57 +0000330object *
331getline(f, n)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332 fileobject *f;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000333 int n;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334{
Guido van Rossumce5ba841991-03-06 13:06:18 +0000335 register FILE *fp;
336 register int c;
337 register char *buf, *end;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000338 int n1, n2;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339 object *v;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000340
Guido van Rossumc10aa771992-07-31 12:42:38 +0000341 fp = f->f_fp;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000342 n2 = n > 0 ? n : 100;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000343 v = newsizedstringobject((char *)NULL, n2);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000344 if (v == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000346 buf = BUF(v);
347 end = buf + n2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000348
Guido van Rossumff4949e1992-08-05 19:58:53 +0000349 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000350 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000351 if ((c = getc(fp)) == EOF) {
Guido van Rossum76ad8ed1991-06-03 10:54:55 +0000352 clearerr(fp);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000353 if (intrcheck()) {
Guido van Rossumff4949e1992-08-05 19:58:53 +0000354 RET_SAVE
Guido van Rossum0bd24411991-04-04 15:21:57 +0000355 DECREF(v);
356 err_set(KeyboardInterrupt);
357 return NULL;
358 }
359 if (n < 0 && buf == BUF(v)) {
Guido van Rossumff4949e1992-08-05 19:58:53 +0000360 RET_SAVE
Guido van Rossum0bd24411991-04-04 15:21:57 +0000361 DECREF(v);
Guido van Rossum201be051991-12-24 13:26:41 +0000362 err_setstr(EOFError,
363 "EOF when reading a line");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000364 return NULL;
365 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000366 break;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000367 }
368 if ((*buf++ = c) == '\n') {
369 if (n < 0)
370 buf--;
371 break;
372 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000373 if (buf == end) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000374 if (n > 0)
Guido van Rossumce5ba841991-03-06 13:06:18 +0000375 break;
376 n1 = n2;
377 n2 += 1000;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000378 RET_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000379 if (resizestring(&v, n2) < 0)
380 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000381 RES_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000382 buf = BUF(v) + n1;
383 end = BUF(v) + n2;
384 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000386 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000387
Guido van Rossumce5ba841991-03-06 13:06:18 +0000388 n1 = buf - BUF(v);
389 if (n1 != n2)
390 resizestring(&v, n1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391 return v;
392}
393
Guido van Rossum0bd24411991-04-04 15:21:57 +0000394/* External C interface */
395
396object *
397filegetline(f, n)
398 object *f;
399 int n;
400{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000401 if (f == NULL) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000402 err_badcall();
403 return NULL;
404 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000405 if (!is_fileobject(f)) {
406 object *reader;
407 object *args;
408 object *result;
409 reader = getattr(f, "readline");
410 if (reader == NULL)
411 return NULL;
412 if (n <= 0)
413 args = mkvalue("()");
414 else
415 args = mkvalue("(i)", n);
416 if (args == NULL) {
417 DECREF(reader);
418 return NULL;
419 }
420 result = call_object(reader, args);
421 DECREF(reader);
422 DECREF(args);
423 if (result != NULL && !is_stringobject(result)) {
424 DECREF(result);
425 result = NULL;
426 err_setstr(TypeError,
427 "object.readline() returned non-string");
428 }
429 if (n < 0 && result != NULL) {
430 char *s = getstringvalue(result);
431 int len = getstringsize(result);
432 if (len == 0) {
433 DECREF(result);
434 result = NULL;
435 err_setstr(EOFError,
436 "EOF when reading a line");
437 }
438 else if (s[len-1] == '\n') {
439 if (result->ob_refcnt == 1)
440 resizestring(&result, len-1);
441 else {
442 object *v;
443 v == newsizedstringobject(s, len-1);
444 DECREF(result);
445 result = v;
446 }
447 }
448 }
449 return result;
450 }
Guido van Rossumd7297e61992-07-06 14:19:26 +0000451 if (((fileobject*)f)->f_fp == NULL)
452 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000453 return getline((fileobject *)f, n);
454}
455
456/* Python method */
457
458static object *
459file_readline(f, args)
460 fileobject *f;
461 object *args;
462{
463 int n;
464
Guido van Rossumd7297e61992-07-06 14:19:26 +0000465 if (f->f_fp == NULL)
466 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000467 if (args == NULL)
468 n = 0; /* Unlimited */
469 else {
470 if (!getintarg(args, &n))
471 return NULL;
472 if (n < 0) {
Guido van Rossumd7297e61992-07-06 14:19:26 +0000473 err_setstr(ValueError, "negative readline count");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000474 return NULL;
475 }
476 }
477
Guido van Rossum51415a71992-03-27 17:23:38 +0000478 return getline(f, n);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000479}
480
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000482file_readlines(f, args)
483 fileobject *f;
484 object *args;
485{
486 object *list;
487 object *line;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000488
Guido van Rossumd7297e61992-07-06 14:19:26 +0000489 if (f->f_fp == NULL)
490 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000491 if (!getnoarg(args))
492 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000493 if ((list = newlistobject(0)) == NULL)
494 return NULL;
495 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000496 line = getline(f, 0);
Guido van Rossumce5ba841991-03-06 13:06:18 +0000497 if (line != NULL && getstringsize(line) == 0) {
498 DECREF(line);
499 break;
500 }
501 if (line == NULL || addlistitem(list, line) != 0) {
502 DECREF(list);
503 XDECREF(line);
504 return NULL;
505 }
506 DECREF(line);
507 }
508 return list;
509}
510
511static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000512file_write(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000513 fileobject *f;
514 object *args;
515{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000516 char *s;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000517 int n, n2;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000518 if (f->f_fp == NULL)
519 return err_closed();
520 if (!getargs(args, "s#", &s, &n))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000521 return NULL;
Guido van Rossumeb183da1991-04-04 10:44:06 +0000522 f->f_softspace = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000523 BGN_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000524 errno = 0;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000525 n2 = fwrite(s, 1, n, f->f_fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000526 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000527 if (n2 != n) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000528 err_errno(IOError);
Guido van Rossumfebd5511992-03-04 16:39:24 +0000529 clearerr(f->f_fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000530 return NULL;
531 }
532 INCREF(None);
533 return None;
534}
535
Guido van Rossum3f5da241990-12-20 15:06:42 +0000536static struct methodlist file_methods[] = {
Guido van Rossumce5ba841991-03-06 13:06:18 +0000537 {"close", file_close},
538 {"flush", file_flush},
Guido van Rossumed233a51992-06-23 09:07:03 +0000539 {"fileno", file_fileno},
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000540 {"isatty", file_isatty},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000541 {"read", file_read},
542 {"readline", file_readline},
Guido van Rossumce5ba841991-03-06 13:06:18 +0000543 {"readlines", file_readlines},
544 {"seek", file_seek},
545 {"tell", file_tell},
546 {"write", file_write},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000547 {NULL, NULL} /* sentinel */
548};
549
550static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000551file_getattr(f, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000552 fileobject *f;
553 char *name;
554{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000555 return findmethod(file_methods, (object *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556}
557
558typeobject Filetype = {
559 OB_HEAD_INIT(&Typetype)
560 0,
561 "file",
562 sizeof(fileobject),
563 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000564 file_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000565 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000566 file_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000567 0, /*tp_setattr*/
568 0, /*tp_compare*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000569 file_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000570};
Guido van Rossumeb183da1991-04-04 10:44:06 +0000571
572/* Interface for the 'soft space' between print items. */
573
574int
575softspace(f, newflag)
576 object *f;
577 int newflag;
578{
579 int oldflag = 0;
Guido van Rossum3165fe61992-09-25 21:59:05 +0000580 if (f == NULL) {
581 /* Do nothing */
582 }
583 if (is_fileobject(f)) {
Guido van Rossumeb183da1991-04-04 10:44:06 +0000584 oldflag = ((fileobject *)f)->f_softspace;
585 ((fileobject *)f)->f_softspace = newflag;
586 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000587 else {
588 object *v;
589 v = getattr(f, "softspace");
590 if (v == NULL)
591 err_clear();
592 else {
593 if (is_intobject(v))
594 oldflag = getintvalue(v);
595 DECREF(v);
596 }
597 v = newintobject((long)newflag);
598 if (v == NULL)
599 err_clear();
600 else {
601 if (setattr(f, "softspace", v) != 0)
602 err_clear();
603 DECREF(v);
604 }
605 }
Guido van Rossumeb183da1991-04-04 10:44:06 +0000606 return oldflag;
607}
Guido van Rossum3165fe61992-09-25 21:59:05 +0000608
609/* Interfaces to write objects/strings to file-like objects */
610
611int
612writeobject(v, f, flags)
613 object *v;
614 object *f;
615 int flags;
616{
617 object *writer, *value, *result;
618 if (f == NULL) {
619 err_setstr(TypeError, "writeobject with NULL file");
620 return -1;
621 }
622 else if (is_fileobject(f)) {
623 FILE *fp = getfilefile(f);
624 if (fp == NULL) {
625 err_closed();
626 return -1;
627 }
628 return printobject(v, fp, flags);
629 }
630 writer = getattr(f, "write");
631 if (writer == NULL)
632 return -1;
633 if ((flags & PRINT_RAW) && is_stringobject(v)) {
634 value = v;
635 INCREF(value);
636 }
637 else {
638 value = reprobject(v);
639 if (value == NULL) {
640 DECREF(writer);
641 return -1;
642 }
643 }
644 result = call_object(writer, value);
645 DECREF(writer);
646 DECREF(value);
647 if (result == NULL)
648 return -1;
649 DECREF(result);
650 return 0;
651}
652
653void
654writestring(s, f)
655 char *s;
656 object *f;
657{
658 if (f == NULL) {
659 /* Do nothing */
660 }
661 else if (is_fileobject(f)) {
662 FILE *fp = getfilefile(f);
663 if (fp != NULL)
664 fputs(s, fp);
665 }
666 else {
667 object *v = newstringobject(s);
668 if (v == NULL) {
669 err_clear();
670 }
671 else {
672 if (writeobject(v, f, PRINT_RAW) != NULL)
673 err_clear();
674 DECREF(v);
675 }
676 }
677}