OSDN Git Service

* Previous contents of gcc/f/runtime moved into toplevel
[pf3gnuchains/gcc-fork.git] / libf2c / libI77 / endfile.c
1 #include "f2c.h"
2 #include "fio.h"
3 #include <sys/types.h>
4 #include "rawio.h"
5
6 #ifdef KR_headers
7 extern char *strcpy();
8 #else
9 #undef abs
10 #undef min
11 #undef max
12 #include <stdlib.h>
13 #include <string.h>
14 #endif
15
16 #ifdef NON_UNIX_STDIO
17 #ifndef unlink
18 #define unlink remove
19 #endif
20 #else
21 #if defined (MSDOS) && !defined (GO32)
22 #include "io.h"
23 #endif
24 #endif
25
26 #ifdef NON_UNIX_STDIO
27 extern char *f__r_mode[], *f__w_mode[];
28 #endif
29
30 #ifdef KR_headers
31 integer f_end(a) alist *a;
32 #else
33 integer f_end(alist *a)
34 #endif
35 {
36         unit *b;
37         if (f__init & 2)
38                 f__fatal (131, "I/O recursion");
39         if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile");
40         b = &f__units[a->aunit];
41         if(b->ufd==NULL) {
42                 char nbuf[10];
43                 (void) sprintf(nbuf,"fort.%ld",a->aunit);
44 #ifdef NON_UNIX_STDIO
45                 { FILE *tf;
46                         if (tf = fopen(nbuf, f__w_mode[0]))
47                                 fclose(tf);
48                         }
49 #else
50                 close(creat(nbuf, 0666));
51 #endif
52                 return(0);
53                 }
54         b->uend=1;
55         return(b->useek ? t_runc(a) : 0);
56 }
57
58  static int
59 #ifdef NON_UNIX_STDIO
60 #ifdef KR_headers
61 copy(from, len, to) char *from, *to; register long len;
62 #else
63 copy(FILE *from, register long len, FILE *to)
64 #endif
65 {
66         int k, len1;
67         char buf[BUFSIZ];
68
69         while(fread(buf, len1 = len > BUFSIZ ? BUFSIZ : (int)len, 1, from)) {
70                 if (!fwrite(buf, len1, 1, to))
71                         return 1;
72                 if ((len -= len1) <= 0)
73                         break;
74                 }
75         return 0;
76         }
77 #else
78 #ifdef KR_headers
79 copy(from, len, to) char *from, *to; register long len;
80 #else
81 copy(char *from, register long len, char *to)
82 #endif
83 {
84         register size_t n;
85         int k, rc = 0, tmp;
86         char buf[BUFSIZ];
87
88         if ((k = open(from, O_RDONLY)) < 0)
89                 return 1;
90         if ((tmp = creat(to,0666)) < 0)
91                 return 1;
92         while((n = read(k, buf, (size_t) (len > BUFSIZ ? BUFSIZ : (int)len))) > 0) {
93                 if (write(tmp, buf, n) != n)
94                         { rc = 1; break; }
95                 if ((len -= n) <= 0)
96                         break;
97                 }
98         close(k);
99         close(tmp);
100         return n < 0 ? 1 : rc;
101         }
102 #endif
103
104 #ifndef L_tmpnam
105 #define L_tmpnam 16
106 #endif
107
108  int
109 #ifdef KR_headers
110 t_runc(a) alist *a;
111 #else
112 t_runc(alist *a)
113 #endif
114 {
115         char nm[L_tmpnam+12];   /* extra space in case L_tmpnam is tiny */
116         long loc, len;
117         unit *b;
118 #ifdef NON_UNIX_STDIO
119         FILE *bf, *tf;
120 #else
121         FILE *bf;
122 #endif
123         int rc = 0;
124
125         b = &f__units[a->aunit];
126         if(b->url)
127                 return(0);      /*don't truncate direct files*/
128         loc=ftell(bf = b->ufd);
129         fseek(bf,0L,SEEK_END);
130         len=ftell(bf);
131         if (loc >= len || b->useek == 0 || b->ufnm == NULL)
132                 return(0);
133 #ifdef NON_UNIX_STDIO
134         fclose(b->ufd);
135 #else
136         rewind(b->ufd); /* empty buffer */
137 #endif
138         if (!loc) {
139 #ifdef NON_UNIX_STDIO
140                 if (!(bf = fopen(b->ufnm, f__w_mode[b->ufmt])))
141 #else
142                 if (close(creat(b->ufnm,0666)))
143 #endif
144                         rc = 1;
145                 if (b->uwrt)
146                         b->uwrt = 1;
147                 goto done;
148                 }
149 #ifdef _POSIX_SOURCE
150         tmpnam(nm);
151 #else
152         strcpy(nm,"tmp.FXXXXXX");
153         mktemp(nm);
154 #endif
155 #ifdef NON_UNIX_STDIO
156         if (!(bf = fopen(b->ufnm, f__r_mode[0]))) {
157  bad:
158                 rc = 1;
159                 goto done;
160                 }
161         if (!(tf = fopen(nm, f__w_mode[0])))
162                 goto bad;
163         if (copy(bf, loc, tf)) {
164  bad1:
165                 rc = 1;
166                 goto done1;
167                 }
168         if (!(bf = freopen(b->ufnm, f__w_mode[0], bf)))
169                 goto bad1;
170         if (!(tf = freopen(nm, f__r_mode[0], tf)))
171                 goto bad1;
172         if (copy(tf, loc, bf))
173                 goto bad1;
174         if (f__w_mode[0] != f__w_mode[b->ufmt]) {
175                 if (!(bf = freopen(b->ufnm, f__w_mode[b->ufmt|2], bf)))
176                         goto bad1;
177                 fseek(bf, loc, SEEK_SET);
178                 }
179 done1:
180         fclose(tf);
181         unlink(nm);
182 done:
183         f__cf = b->ufd = bf;
184 #else
185         if (copy(b->ufnm, loc, nm)
186          || copy(nm, loc, b->ufnm))
187                 rc = 1;
188         unlink(nm);
189         fseek(b->ufd, loc, SEEK_SET);
190 done:
191 #endif
192         if (rc)
193                 err(a->aerr,111,"endfile");
194         return 0;
195         }