8 extern FILE *tmpfile();
17 extern char *f__r_mode[], *f__w_mode[];
20 integer f_end(a) alist *a;
22 integer f_end(alist *a)
29 f__fatal (131, "I/O recursion");
30 if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile");
31 b = &f__units[a->aunit];
34 sprintf(nbuf,"fort.%ld",(long)a->aunit);
35 if (tf = fopen(nbuf, f__w_mode[0]))
40 return(b->useek ? t_runc(a) : 0);
43 #ifndef HAVE_FTRUNCATE
46 copy(from, len, to) FILE *from, *to; register long len;
48 copy(FILE *from, register long len, FILE *to)
54 while(fread(buf, len1 = len > BUFSIZ ? BUFSIZ : (int)len, 1, from)) {
55 if (!fwrite(buf, len1, 1, to))
57 if ((len -= len1) <= 0)
62 #endif /* !defined(HAVE_FTRUNCATE) */
75 #ifndef HAVE_FTRUNCATE
77 #endif /* !defined(HAVE_FTRUNCATE) */
79 b = &f__units[a->aunit];
81 return(0); /*don't truncate direct files*/
82 loc=ftell(bf = b->ufd);
83 fseek(bf,0L,SEEK_END);
85 if (loc >= len || b->useek == 0 || b->ufnm == NULL)
87 #ifndef HAVE_FTRUNCATE
91 if (!(bf = fopen(b->ufnm, f__w_mode[b->ufmt])))
97 if (!(bf = fopen(b->ufnm, f__r_mode[0]))
98 || !(tf = tmpfile())) {
105 if (copy(bf, loc, tf)) {
110 if (!(bf = freopen(b->ufnm, f__w_mode[0], bf)))
113 if (copy(tf, loc, bf))
117 #ifdef NON_UNIX_STDIO
120 if (!(bf = fopen(b->ufnm, f__w_mode[3])))
122 fseek(bf,0L,SEEK_END);
130 #else /* !defined(HAVE_FTRUNCATE) */
132 rc = ftruncate(fileno(b->ufd),loc);
133 #endif /* !defined(HAVE_FTRUNCATE) */
135 err(a->aerr,111,"endfile");