source: trunk/third/gcc/libf2c/libI77/err.c @ 18477

Revision 18477, 6.5 KB checked in by ghudson, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18476, which included commits to RCS files with non-trunk default branches.
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.