14 extern char *f__r_mode[], *f__w_mode[];
16 integer f_end(alist *a)
22 f__fatal (131, "I/O recursion");
23 if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile");
24 b = &f__units[a->aunit];
27 sprintf(nbuf,"fort.%ld",(long)a->aunit);
28 if (tf = fopen(nbuf, f__w_mode[0]))
33 return(b->useek ? t_runc(a) : 0);
36 #ifndef HAVE_FTRUNCATE
38 copy(FILE *from, register long len, FILE *to)
43 while(fread(buf, len1 = len > BUFSIZ ? BUFSIZ : (int)len, 1, from)) {
44 if (!fwrite(buf, len1, 1, to))
46 if ((len -= len1) <= 0)
51 #endif /* !defined(HAVE_FTRUNCATE) */
60 #ifndef HAVE_FTRUNCATE
62 #endif /* !defined(HAVE_FTRUNCATE) */
64 b = &f__units[a->aunit];
66 return(0); /*don't truncate direct files*/
67 loc=FTELL(bf = b->ufd);
70 if (loc >= len || b->useek == 0 || b->ufnm == NULL)
72 #ifndef HAVE_FTRUNCATE
76 if (!(bf = fopen(b->ufnm, f__w_mode[b->ufmt])))
82 if (!(bf = fopen(b->ufnm, f__r_mode[0]))
83 || !(tf = tmpfile())) {
90 if (copy(bf, loc, tf)) {
95 if (!(bf = freopen(b->ufnm, f__w_mode[0], bf)))
97 FSEEK(tf, 0, SEEK_SET);
98 if (copy(tf, loc, bf))
102 #ifdef NON_UNIX_STDIO
105 if (!(bf = fopen(b->ufnm, f__w_mode[3])))
107 FSEEK(bf,0,SEEK_END);
115 #else /* !defined(HAVE_FTRUNCATE) */
117 rc = ftruncate(fileno(b->ufd), loc);
118 FSEEK(bf,loc,SEEK_SET);
119 #endif /* !defined(HAVE_FTRUNCATE) */
121 err(a->aerr,111,"endfile");