OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / libf2c / libI77 / endfile.c
1 #include "config.h"
2 #include "f2c.h"
3 #include "fio.h"
4
5 #include <sys/types.h>
6 #include <unistd.h>
7
8 #undef abs
9 #undef min
10 #undef max
11 #include <stdlib.h>
12 #include <string.h>
13
14 extern char *f__r_mode[], *f__w_mode[];
15
16 integer f_end(alist *a)
17 {
18         unit *b;
19         FILE *tf;
20
21         if (f__init & 2)
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];
25         if(b->ufd==NULL) {
26                 char nbuf[10];
27                 sprintf(nbuf,"fort.%ld",(long)a->aunit);
28                 if (tf = fopen(nbuf, f__w_mode[0]))
29                         fclose(tf);
30                 return(0);
31                 }
32         b->uend=1;
33         return(b->useek ? t_runc(a) : 0);
34 }
35
36 #ifndef HAVE_FTRUNCATE
37  static int
38 copy(FILE *from, register long len, FILE *to)
39 {
40         int len1;
41         char buf[BUFSIZ];
42
43         while(fread(buf, len1 = len > BUFSIZ ? BUFSIZ : (int)len, 1, from)) {
44                 if (!fwrite(buf, len1, 1, to))
45                         return 1;
46                 if ((len -= len1) <= 0)
47                         break;
48                 }
49         return 0;
50         }
51 #endif /* !defined(HAVE_FTRUNCATE) */
52
53  int
54 t_runc(alist *a)
55 {
56         off_t loc, len;
57         unit *b;
58         int rc;
59         FILE *bf;
60 #ifndef HAVE_FTRUNCATE
61         FILE *tf;
62 #endif /* !defined(HAVE_FTRUNCATE) */
63
64         b = &f__units[a->aunit];
65         if(b->url)
66                 return(0);      /*don't truncate direct files*/
67         loc=FTELL(bf = b->ufd);
68         FSEEK(bf,0,SEEK_END);
69         len=FTELL(bf);
70         if (loc >= len || b->useek == 0 || b->ufnm == NULL)
71                 return(0);
72 #ifndef HAVE_FTRUNCATE
73         rc = 0;
74         fclose(b->ufd);
75         if (!loc) {
76                 if (!(bf = fopen(b->ufnm, f__w_mode[b->ufmt])))
77                         rc = 1;
78                 if (b->uwrt)
79                         b->uwrt = 1;
80                 goto done;
81                 }
82         if (!(bf = fopen(b->ufnm, f__r_mode[0]))
83          || !(tf = tmpfile())) {
84 #ifdef NON_UNIX_STDIO
85  bad:
86 #endif
87                 rc = 1;
88                 goto done;
89                 }
90         if (copy(bf, loc, tf)) {
91  bad1:
92                 rc = 1;
93                 goto done1;
94                 }
95         if (!(bf = freopen(b->ufnm, f__w_mode[0], bf)))
96                 goto bad1;
97         FSEEK(tf, 0, SEEK_SET);
98         if (copy(tf, loc, bf))
99                 goto bad1;
100         b->uwrt = 1;
101         b->urw = 2;
102 #ifdef NON_UNIX_STDIO
103         if (b->ufmt) {
104                 fclose(bf);
105                 if (!(bf = fopen(b->ufnm, f__w_mode[3])))
106                         goto bad;
107                 FSEEK(bf,0,SEEK_END);
108                 b->urw = 3;
109                 }
110 #endif
111 done1:
112         fclose(tf);
113 done:
114         f__cf = b->ufd = bf;
115 #else  /* !defined(HAVE_FTRUNCATE) */
116         fflush(b->ufd);
117         rc = ftruncate(fileno(b->ufd), loc);
118         FSEEK(bf,loc,SEEK_SET);
119 #endif /* !defined(HAVE_FTRUNCATE) */
120         if (rc)
121                 err(a->aerr,111,"endfile");
122         return 0;
123         }