source: vendor/gcc/3.2.2/libf2c/libI77/err.c

Last change on this file was 2, checked in by bird, 22 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 6.5 KB
Line 
1#include "config.h"
2#ifndef NON_UNIX_STDIO
3#define _INCLUDE_POSIX_SOURCE /* for HP-UX */
4#define _INCLUDE_XOPEN_SOURCE /* for HP-UX */
5#include <sys/types.h>
6#include <sys/stat.h>
7#endif
8#include "f2c.h"
9#ifdef KR_headers
10extern char *malloc();
11#else
12#undef abs
13#undef min
14#undef max
15#include <stdlib.h>
16#endif
17#include "fio.h"
18#include "fmt.h" /* for struct syl */
19
20/*global definitions*/
21unit f__units[MXUNIT]; /*unit table*/
22int f__init; /*bit 0: set after initializations;
23 bit 1: set during I/O involving returns to
24 caller of library (or calls to user code)*/
25cilist *f__elist; /*active external io list*/
26icilist *f__svic; /*active internal io list*/
27flag f__reading; /*1 if reading, 0 if writing*/
28flag f__cplus,f__cblank;
29char *f__fmtbuf;
30int f__fmtlen;
31flag f__external; /*1 if external io, 0 if internal */
32#ifdef KR_headers
33int (*f__doed)(),(*f__doned)();
34int (*f__doend)(),(*f__donewrec)(),(*f__dorevert)();
35int (*f__getn)(); /* for formatted input */
36void (*f__putn)(); /* for formatted output */
37#else
38int (*f__getn)(void); /* for formatted input */
39void (*f__putn)(int); /* for formatted output */
40int (*f__doed)(struct syl*, char*, ftnlen),(*f__doned)(struct syl*);
41int (*f__dorevert)(void),(*f__donewrec)(void),(*f__doend)(void);
42#endif
43flag f__sequential; /*1 if sequential io, 0 if direct*/
44flag f__formatted; /*1 if formatted io, 0 if unformatted*/
45FILE *f__cf; /*current file*/
46unit *f__curunit; /*current unit*/
47int f__recpos; /*place in current record*/
48int f__cursor, f__hiwater, f__scale;
49char *f__icptr;
50
51/*error messages*/
52char *F_err[] =
53{
54 "error in format", /* 100 */
55 "illegal unit number", /* 101 */
56 "formatted io not allowed", /* 102 */
57 "unformatted io not allowed", /* 103 */
58 "direct io not allowed", /* 104 */
59 "sequential io not allowed", /* 105 */
60 "can't backspace file", /* 106 */
61 "null file name", /* 107 */
62 "can't stat file", /* 108 */
63 "unit not connected", /* 109 */
64 "off end of record", /* 110 */
65 "truncation failed in endfile", /* 111 */
66 "incomprehensible list input", /* 112 */
67 "out of free space", /* 113 */
68 "unit not connected", /* 114 */
69 "read unexpected character", /* 115 */
70 "bad logical input field", /* 116 */
71 "bad variable type", /* 117 */
72 "bad namelist name", /* 118 */
73 "variable not in namelist", /* 119 */
74 "no end record", /* 120 */
75 "variable count incorrect", /* 121 */
76 "subscript for scalar variable", /* 122 */
77 "invalid array section", /* 123 */
78 "substring out of bounds", /* 124 */
79 "subscript out of bounds", /* 125 */
80 "can't read file", /* 126 */
81 "can't write file", /* 127 */
82 "'new' file exists", /* 128 */
83 "can't append to file", /* 129 */
84 "non-positive record number", /* 130 */
85 "I/O started while already doing I/O", /* 131 */
86 "Temporary file name (TMPDIR?) too long" /* 132 */
87};
88#define MAXERR (sizeof(F_err)/sizeof(char *)+100)
89
90#ifdef KR_headers
91f__canseek(f) FILE *f; /*SYSDEP*/
92#else
93f__canseek(FILE *f) /*SYSDEP*/
94#endif
95{
96#ifdef NON_UNIX_STDIO
97 return !isatty(fileno(f));
98#else
99 struct stat x;
100
101 if (fstat(fileno(f),&x) < 0)
102 return(0);
103#ifdef S_IFMT
104 switch(x.st_mode & S_IFMT) {
105 case S_IFDIR:
106 case S_IFREG:
107 if(x.st_nlink > 0) /* !pipe */
108 return(1);
109 else
110 return(0);
111 case S_IFCHR:
112 if(isatty(fileno(f)))
113 return(0);
114 return(1);
115#ifdef S_IFBLK
116 case S_IFBLK:
117 return(1);
118#endif
119 }
120#else
121#ifdef S_ISDIR
122 /* POSIX version */
123 if (S_ISREG(x.st_mode) || S_ISDIR(x.st_mode)) {
124 if(x.st_nlink > 0) /* !pipe */
125 return(1);
126 else
127 return(0);
128 }
129 if (S_ISCHR(x.st_mode)) {
130 if(isatty(fileno(f)))
131 return(0);
132 return(1);
133 }
134 if (S_ISBLK(x.st_mode))
135 return(1);
136#else
137 Help! How does fstat work on this system?
138#endif
139#endif
140 return(0); /* who knows what it is? */
141#endif
142}
143
144 void
145#ifdef KR_headers
146f__fatal(n,s) char *s;
147#else
148f__fatal(int n, char *s)
149#endif
150{
151 static int dead = 0;
152
153 if(n<100 && n>=0) perror(s); /*SYSDEP*/
154 else if(n >= (int)MAXERR || n < -1)
155 { fprintf(stderr,"%s: illegal error number %d\n",s,n);
156 }
157 else if(n == -1) fprintf(stderr,"%s: end of file\n",s);
158 else
159 fprintf(stderr,"%s: %s\n",s,F_err[n-100]);
160 if (dead) {
161 fprintf (stderr, "(libf2c f__fatal already called, aborting.)");
162 abort();
163 }
164 dead = 1;
165 if (f__init & 1) {
166 if (f__curunit) {
167 fprintf(stderr,"apparent state: unit %d ",
168 (int)(f__curunit-f__units));
169 fprintf(stderr, f__curunit->ufnm ? "named %s\n" : "(unnamed)\n",
170 f__curunit->ufnm);
171 }
172 else
173 fprintf(stderr,"apparent state: internal I/O\n");
174 if (f__fmtbuf)
175 fprintf(stderr,"last format: %.*s\n",f__fmtlen,f__fmtbuf);
176 fprintf(stderr,"lately %s %s %s %s",f__reading?"reading":"writing",
177 f__sequential?"sequential":"direct",f__formatted?"formatted":"unformatted",
178 f__external?"external":"internal");
179 }
180 f__init &= ~2; /* No longer doing I/O (no more user code to be called). */
181 sig_die(" IO", 1);
182}
183/*initialization routine*/
184 VOID
185f_init(Void)
186{ unit *p;
187
188 if (f__init & 2)
189 f__fatal (131, "I/O recursion");
190 f__init = 1;
191 p= &f__units[0];
192 p->ufd=stderr;
193 p->useek=f__canseek(stderr);
194 p->ufmt=1;
195 p->uwrt=1;
196 p = &f__units[5];
197 p->ufd=stdin;
198 p->useek=f__canseek(stdin);
199 p->ufmt=1;
200 p->uwrt=0;
201 p= &f__units[6];
202 p->ufd=stdout;
203 p->useek=f__canseek(stdout);
204 p->ufmt=1;
205 p->uwrt=1;
206}
207#ifdef KR_headers
208f__nowreading(x) unit *x;
209#else
210f__nowreading(unit *x)
211#endif
212{
213 off_t loc;
214 int ufmt, urw;
215 extern char *f__r_mode[], *f__w_mode[];
216
217 if (x->urw & 1)
218 goto done;
219 if (!x->ufnm)
220 goto cantread;
221 ufmt = x->url ? 0 : x->ufmt;
222 loc = FTELL(x->ufd);
223 urw = 3;
224 if (!freopen(x->ufnm, f__w_mode[ufmt|2], x->ufd)) {
225 urw = 1;
226 if(!freopen(x->ufnm, f__r_mode[ufmt], x->ufd)) {
227 cantread:
228 errno = 126;
229 return 1;
230 }
231 }
232 FSEEK(x->ufd,loc,SEEK_SET);
233 x->urw = urw;
234 done:
235 x->uwrt = 0;
236 return 0;
237}
238#ifdef KR_headers
239f__nowwriting(x) unit *x;
240#else
241f__nowwriting(unit *x)
242#endif
243{
244 off_t loc;
245 int ufmt;
246 extern char *f__w_mode[];
247
248 if (x->urw & 2)
249 goto done;
250 if (!x->ufnm)
251 goto cantwrite;
252 ufmt = x->url ? 0 : x->ufmt;
253 if (x->uwrt == 3) { /* just did write, rewind */
254 if (!(f__cf = x->ufd =
255 freopen(x->ufnm,f__w_mode[ufmt],x->ufd)))
256 goto cantwrite;
257 x->urw = 2;
258 }
259 else {
260 loc=FTELL(x->ufd);
261 if (!(f__cf = x->ufd =
262 freopen(x->ufnm, f__w_mode[ufmt |= 2], x->ufd)))
263 {
264 x->ufd = NULL;
265 cantwrite:
266 errno = 127;
267 return(1);
268 }
269 x->urw = 3;
270 FSEEK(x->ufd,loc,SEEK_SET);
271 }
272 done:
273 x->uwrt = 1;
274 return 0;
275}
276
277 int
278#ifdef KR_headers
279err__fl(f, m, s) int f, m; char *s;
280#else
281err__fl(int f, int m, char *s)
282#endif
283{
284 if (!f)
285 f__fatal(m, s);
286 if (f__doend)
287 (*f__doend)();
288 f__init &= ~2;
289 return errno = m;
290 }
Note: See TracBrowser for help on using the repository browser.