blob: dd47905374f782f9985a9b766ca03728822cce68 [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 Rossum85a5fbb1990-10-14 12:07:46 +0000135static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000136file_repr(f)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137 fileobject *f;
138{
139 char buf[300];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140 sprintf(buf, "<%s file '%.256s', mode '%.10s'>",
141 f->f_fp == NULL ? "closed" : "open",
142 getstringvalue(f->f_name),
143 getstringvalue(f->f_mode));
144 return newstringobject(buf);
145}
146
147static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000148file_close(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149 fileobject *f;
150 object *args;
151{
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000152 int sts = 0;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000153 if (!getnoarg(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155 if (f->f_fp != NULL) {
Guido van Rossumff4949e1992-08-05 19:58:53 +0000156 if (f->f_close != NULL) {
157 BGN_SAVE
158 errno = 0;
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000159 sts = (*f->f_close)(f->f_fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000160 END_SAVE
161 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162 f->f_fp = NULL;
163 }
Guido van Rossumfebd5511992-03-04 16:39:24 +0000164 if (sts == EOF)
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000165 return err_errno(IOError);
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000166 if (sts != 0)
167 return newintobject((long)sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000168 INCREF(None);
169 return None;
170}
171
172static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000173file_seek(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174 fileobject *f;
175 object *args;
176{
Guido van Rossumce5ba841991-03-06 13:06:18 +0000177 long offset;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000178 int whence;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000179 int ret;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000180
Guido van Rossumd7297e61992-07-06 14:19:26 +0000181 if (f->f_fp == NULL)
182 return err_closed();
183 whence = 0;
184 if (!getargs(args, "l", &offset)) {
185 err_clear();
186 if (!getargs(args, "(li)", &offset, &whence))
Guido van Rossumce5ba841991-03-06 13:06:18 +0000187 return NULL;
188 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000189 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000190 errno = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000191 ret = fseek(f->f_fp, offset, whence);
192 END_SAVE
193 if (ret != 0) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000194 err_errno(IOError);
195 clearerr(f->f_fp);
196 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000197 }
198 INCREF(None);
199 return None;
200}
201
202static object *
203file_tell(f, args)
204 fileobject *f;
205 object *args;
206{
207 long offset;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000208 if (f->f_fp == NULL)
209 return err_closed();
210 if (!getnoarg(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000212 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000213 errno = 0;
214 offset = ftell(f->f_fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000215 END_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000216 if (offset == -1L) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000217 err_errno(IOError);
218 clearerr(f->f_fp);
219 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000220 }
221 return newintobject(offset);
222}
223
224static object *
Guido van Rossumed233a51992-06-23 09:07:03 +0000225file_fileno(f, args)
226 fileobject *f;
227 object *args;
228{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000229 if (f->f_fp == NULL)
230 return err_closed();
Guido van Rossumed233a51992-06-23 09:07:03 +0000231 if (!getnoarg(args))
232 return NULL;
233 return newintobject((long) fileno(f->f_fp));
234}
235
236static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000237file_flush(f, args)
238 fileobject *f;
239 object *args;
240{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000241 int res;
242
Guido van Rossumd7297e61992-07-06 14:19:26 +0000243 if (f->f_fp == NULL)
244 return err_closed();
245 if (!getnoarg(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000247 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000248 errno = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000249 res = fflush(f->f_fp);
250 END_SAVE
251 if (res != 0) {
Guido van Rossumfebd5511992-03-04 16:39:24 +0000252 err_errno(IOError);
253 clearerr(f->f_fp);
254 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000255 }
256 INCREF(None);
257 return None;
258}
259
260static object *
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000261file_isatty(f, args)
262 fileobject *f;
263 object *args;
264{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000265 long res;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000266 if (f->f_fp == NULL)
267 return err_closed();
268 if (!getnoarg(args))
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000269 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000270 BGN_SAVE
271 res = isatty((int)fileno(f->f_fp));
272 END_SAVE
273 return newintobject(res);
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000274}
275
276static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000277file_read(f, args)
278 fileobject *f;
279 object *args;
280{
281 int n, n1, n2, n3;
282 object *v;
283
Guido van Rossumd7297e61992-07-06 14:19:26 +0000284 if (f->f_fp == NULL)
285 return err_closed();
286 if (args == NULL) {
Guido van Rossumce5ba841991-03-06 13:06:18 +0000287 n = 0;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000288 if (n < 0) {
Guido van Rossumd7297e61992-07-06 14:19:26 +0000289 err_setstr(ValueError, "negative read count");
Guido van Rossumce5ba841991-03-06 13:06:18 +0000290 return NULL;
291 }
292 }
Guido van Rossumd7297e61992-07-06 14:19:26 +0000293 else if (!getargs(args, "i", &n))
294 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000295
296 n2 = n != 0 ? n : BUFSIZ;
297 v = newsizedstringobject((char *)NULL, n2);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000298 if (v == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000300 n1 = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000301 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000302 for (;;) {
303 n3 = fread(BUF(v)+n1, 1, n2-n1, f->f_fp);
304 /* XXX Error check? */
305 if (n3 == 0)
306 break;
307 n1 += n3;
308 if (n1 == n)
309 break;
310 if (n == 0) {
311 n2 = n1 + BUFSIZ;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000312 RET_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000313 if (resizestring(&v, n2) < 0)
314 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000315 RES_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000316 }
317 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000318 END_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000319 if (n1 != n2)
320 resizestring(&v, n1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 return v;
322}
323
Guido van Rossum0bd24411991-04-04 15:21:57 +0000324/* Internal routine to get a line.
325 Size argument interpretation:
326 > 0: max length;
327 = 0: read arbitrary line;
328 < 0: strip trailing '\n', raise EOFError if EOF reached immediately
Guido van Rossumce5ba841991-03-06 13:06:18 +0000329*/
330
Guido van Rossum0bd24411991-04-04 15:21:57 +0000331object *
332getline(f, n)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333 fileobject *f;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000334 int n;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335{
Guido van Rossumce5ba841991-03-06 13:06:18 +0000336 register FILE *fp;
337 register int c;
338 register char *buf, *end;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000339 int n1, n2;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340 object *v;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000341
Guido van Rossumc10aa771992-07-31 12:42:38 +0000342 fp = f->f_fp;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000343 n2 = n > 0 ? n : 100;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000344 v = newsizedstringobject((char *)NULL, n2);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000345 if (v == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000346 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000347 buf = BUF(v);
348 end = buf + n2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000349
Guido van Rossumff4949e1992-08-05 19:58:53 +0000350 BGN_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000351 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000352 if ((c = getc(fp)) == EOF) {
Guido van Rossum76ad8ed1991-06-03 10:54:55 +0000353 clearerr(fp);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000354 if (intrcheck()) {
Guido van Rossumff4949e1992-08-05 19:58:53 +0000355 RET_SAVE
Guido van Rossum0bd24411991-04-04 15:21:57 +0000356 DECREF(v);
357 err_set(KeyboardInterrupt);
358 return NULL;
359 }
360 if (n < 0 && buf == BUF(v)) {
Guido van Rossumff4949e1992-08-05 19:58:53 +0000361 RET_SAVE
Guido van Rossum0bd24411991-04-04 15:21:57 +0000362 DECREF(v);
Guido van Rossum201be051991-12-24 13:26:41 +0000363 err_setstr(EOFError,
364 "EOF when reading a line");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000365 return NULL;
366 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000367 break;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000368 }
369 if ((*buf++ = c) == '\n') {
370 if (n < 0)
371 buf--;
372 break;
373 }
Guido van Rossumce5ba841991-03-06 13:06:18 +0000374 if (buf == end) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000375 if (n > 0)
Guido van Rossumce5ba841991-03-06 13:06:18 +0000376 break;
377 n1 = n2;
378 n2 += 1000;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000379 RET_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000380 if (resizestring(&v, n2) < 0)
381 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000382 RES_SAVE
Guido van Rossumce5ba841991-03-06 13:06:18 +0000383 buf = BUF(v) + n1;
384 end = BUF(v) + n2;
385 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000386 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000387 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000388
Guido van Rossumce5ba841991-03-06 13:06:18 +0000389 n1 = buf - BUF(v);
390 if (n1 != n2)
391 resizestring(&v, n1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392 return v;
393}
394
Guido van Rossum0bd24411991-04-04 15:21:57 +0000395/* External C interface */
396
397object *
398filegetline(f, n)
399 object *f;
400 int n;
401{
402 if (f == NULL || !is_fileobject(f)) {
403 err_badcall();
404 return NULL;
405 }
Guido van Rossumd7297e61992-07-06 14:19:26 +0000406 if (((fileobject*)f)->f_fp == NULL)
407 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000408 return getline((fileobject *)f, n);
409}
410
411/* Python method */
412
413static object *
414file_readline(f, args)
415 fileobject *f;
416 object *args;
417{
418 int n;
419
Guido van Rossumd7297e61992-07-06 14:19:26 +0000420 if (f->f_fp == NULL)
421 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000422 if (args == NULL)
423 n = 0; /* Unlimited */
424 else {
425 if (!getintarg(args, &n))
426 return NULL;
427 if (n < 0) {
Guido van Rossumd7297e61992-07-06 14:19:26 +0000428 err_setstr(ValueError, "negative readline count");
Guido van Rossum0bd24411991-04-04 15:21:57 +0000429 return NULL;
430 }
431 }
432
Guido van Rossum51415a71992-03-27 17:23:38 +0000433 return getline(f, n);
Guido van Rossum0bd24411991-04-04 15:21:57 +0000434}
435
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436static object *
Guido van Rossumce5ba841991-03-06 13:06:18 +0000437file_readlines(f, args)
438 fileobject *f;
439 object *args;
440{
441 object *list;
442 object *line;
Guido van Rossum0bd24411991-04-04 15:21:57 +0000443
Guido van Rossumd7297e61992-07-06 14:19:26 +0000444 if (f->f_fp == NULL)
445 return err_closed();
Guido van Rossum0bd24411991-04-04 15:21:57 +0000446 if (!getnoarg(args))
447 return NULL;
Guido van Rossumce5ba841991-03-06 13:06:18 +0000448 if ((list = newlistobject(0)) == NULL)
449 return NULL;
450 for (;;) {
Guido van Rossum0bd24411991-04-04 15:21:57 +0000451 line = getline(f, 0);
Guido van Rossumce5ba841991-03-06 13:06:18 +0000452 if (line != NULL && getstringsize(line) == 0) {
453 DECREF(line);
454 break;
455 }
456 if (line == NULL || addlistitem(list, line) != 0) {
457 DECREF(list);
458 XDECREF(line);
459 return NULL;
460 }
461 DECREF(line);
462 }
463 return list;
464}
465
466static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000467file_write(f, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000468 fileobject *f;
469 object *args;
470{
Guido van Rossumd7297e61992-07-06 14:19:26 +0000471 char *s;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472 int n, n2;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000473 if (f->f_fp == NULL)
474 return err_closed();
475 if (!getargs(args, "s#", &s, &n))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000476 return NULL;
Guido van Rossumeb183da1991-04-04 10:44:06 +0000477 f->f_softspace = 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000478 BGN_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000479 errno = 0;
Guido van Rossumd7297e61992-07-06 14:19:26 +0000480 n2 = fwrite(s, 1, n, f->f_fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000481 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000482 if (n2 != n) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000483 err_errno(IOError);
Guido van Rossumfebd5511992-03-04 16:39:24 +0000484 clearerr(f->f_fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000485 return NULL;
486 }
487 INCREF(None);
488 return None;
489}
490
Guido van Rossum3f5da241990-12-20 15:06:42 +0000491static struct methodlist file_methods[] = {
Guido van Rossumce5ba841991-03-06 13:06:18 +0000492 {"close", file_close},
493 {"flush", file_flush},
Guido van Rossumed233a51992-06-23 09:07:03 +0000494 {"fileno", file_fileno},
Guido van Rossuma1ab7fa1991-06-04 19:37:39 +0000495 {"isatty", file_isatty},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000496 {"read", file_read},
497 {"readline", file_readline},
Guido van Rossumce5ba841991-03-06 13:06:18 +0000498 {"readlines", file_readlines},
499 {"seek", file_seek},
500 {"tell", file_tell},
501 {"write", file_write},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000502 {NULL, NULL} /* sentinel */
503};
504
505static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000506file_getattr(f, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000507 fileobject *f;
508 char *name;
509{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000510 return findmethod(file_methods, (object *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000511}
512
513typeobject Filetype = {
514 OB_HEAD_INIT(&Typetype)
515 0,
516 "file",
517 sizeof(fileobject),
518 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000519 file_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000520 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000521 file_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522 0, /*tp_setattr*/
523 0, /*tp_compare*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000524 file_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000525};
Guido van Rossumeb183da1991-04-04 10:44:06 +0000526
527/* Interface for the 'soft space' between print items. */
528
529int
530softspace(f, newflag)
531 object *f;
532 int newflag;
533{
534 int oldflag = 0;
535 if (f != NULL && is_fileobject(f)) {
536 oldflag = ((fileobject *)f)->f_softspace;
537 ((fileobject *)f)->f_softspace = newflag;
538 }
539 return oldflag;
540}