Commit | Line | Data |
---|---|---|
bd899150 | 1 | /* |
d8e31067 | 2 | char id_err[] = "@(#)err.c 1.7"; |
bd899150 DW |
3 | * |
4 | * file i/o error and initialization routines | |
5 | */ | |
6 | ||
7 | #include <sys/types.h> | |
8 | #include <sys/stat.h> | |
9 | #include <signal.h> | |
10 | #include "fiodefs.h" | |
11 | ||
12 | /* | |
13 | * global definitions | |
14 | */ | |
15 | ||
16 | char *tmplate = "tmp.FXXXXXX"; /* scratch file template */ | |
17 | char *fortfile = "fort.%d"; /* default file template */ | |
18 | ||
19 | unit units[MXUNIT] = 0; /*unit table*/ | |
20 | flag reading; /*1 if reading, 0 if writing*/ | |
21 | flag external; /*1 if external io, 0 if internal */ | |
22 | flag sequential; /*1 if sequential io, 0 if direct*/ | |
23 | flag formatted; /*1 if formatted io, 0 if unformatted, -1 if list*/ | |
24 | char *fmtbuf, *icptr, *icend, *fmtptr; | |
25 | int (*doed)(),(*doned)(); | |
26 | int (*doend)(),(*donewrec)(),(*dorevert)(),(*dotab)(); | |
27 | int (*lioproc)(); | |
28 | int (*getn)(),(*putn)(),(*ungetn)(); /*for formatted io*/ | |
29 | icilist *svic; /* active internal io list */ | |
30 | FILE *cf; /*current file structure*/ | |
31 | unit *curunit; /*current unit structure*/ | |
32 | int lunit; /*current logical unit*/ | |
33 | char *lfname; /*current filename*/ | |
34 | int recpos; /*place in current record*/ | |
35 | ftnint recnum; /* current record number */ | |
36 | int reclen; /* current record length */ | |
37 | int cursor,scale; | |
38 | int radix; | |
39 | ioflag signit,tab,cplus,cblank,elist,errflag,endflag,lquit,l_first; | |
40 | flag leof; | |
41 | int lcount,line_len; | |
42 | ||
43 | /*error messages*/ | |
44 | ||
45 | extern char *sys_errlist[]; | |
46 | extern int sys_nerr; | |
47 | ||
278ccb77 DW |
48 | extern char *f_errlist[]; |
49 | extern int f_nerr; | |
bd899150 DW |
50 | |
51 | ||
52 | fatal(n,s) char *s; | |
53 | { | |
54 | ftnint lu; | |
55 | ||
56 | for (lu=1; lu < MXUNIT; lu++) | |
57 | flush_(&lu); | |
58 | if(n<0) | |
59 | fprintf(stderr,"%s: [%d] end of file\n",s,n); | |
60 | else if(n>=0 && n<sys_nerr) | |
61 | fprintf(stderr,"%s: [%d] %s\n",s,n,sys_errlist[n]); | |
278ccb77 | 62 | else if(n>=F_ER && n<F_MAXERR) |
bd899150 DW |
63 | fprintf(stderr,"%s: [%d] %s\n",s,n,f_errlist[n-F_ER]); |
64 | else | |
65 | fprintf(stderr,"%s: [%d] unknown error number\n",s,n); | |
66 | if(external) | |
67 | { | |
68 | if(!lfname) switch (lunit) | |
69 | { case STDERR: lfname = "stderr"; | |
70 | break; | |
71 | case STDIN: lfname = "stdin"; | |
72 | break; | |
73 | case STDOUT: lfname = "stdout"; | |
74 | break; | |
75 | default: lfname = ""; | |
76 | } | |
77 | fprintf(stderr,"logical unit %d, named '%s'\n",lunit,lfname); | |
78 | } | |
79 | if (elist) | |
80 | { fprintf(stderr,"lately: %s %s %s %s IO\n", | |
81 | reading?"reading":"writing", | |
82 | sequential?"sequential":"direct", | |
83 | formatted>0?"formatted":(formatted<0?"list":"unformatted"), | |
84 | external?"external":"internal"); | |
85 | if (formatted) | |
86 | { if(fmtbuf) prnt_fmt(n); | |
87 | if (external) | |
88 | { if(reading && curunit->useek) | |
89 | prnt_ext(); /* print external data */ | |
90 | } | |
91 | else prnt_int(); /* print internal array */ | |
92 | } | |
93 | } | |
94 | f_exit(); | |
95 | _cleanup(); | |
96 | abort(); | |
97 | } | |
98 | ||
99 | prnt_ext() | |
100 | { int ch; | |
101 | int i=1; | |
102 | long loc; | |
103 | fprintf (stderr, "part of last data: "); | |
104 | loc = ftell(curunit->ufd); | |
105 | if(loc) | |
106 | { if(loc==1L) rewind(curunit->ufd); | |
107 | else for(;i<12 && last_char(curunit->ufd)!='\n';i++); | |
e2841838 | 108 | while(i--) ffputc(fgetc(curunit->ufd),stderr); |
bd899150 DW |
109 | } |
110 | fputc('|',stderr); | |
e2841838 | 111 | for(i=0;i<5 && (ch=fgetc(curunit->ufd))!=EOF;i++) ffputc(ch,stderr); |
bd899150 DW |
112 | fputc('\n',stderr); |
113 | } | |
114 | ||
115 | prnt_int() | |
116 | { char *ep; | |
117 | fprintf (stderr,"part of last string: "); | |
118 | ep = icptr - (recpos<12?recpos:12); | |
e2841838 | 119 | while (ep<icptr) ffputc(*ep++,stderr); |
bd899150 | 120 | fputc('|',stderr); |
e2841838 | 121 | while (ep<(icptr+5) && ep<icend) ffputc(*ep++,stderr); |
bd899150 DW |
122 | fputc('\n',stderr); |
123 | } | |
124 | ||
125 | prnt_fmt(n) int n; | |
126 | { int i; char *ep; | |
127 | fprintf(stderr, "part of last format: "); | |
43666f58 | 128 | if(n==F_ERFMT) |
bd899150 DW |
129 | { i = fmtptr - fmtbuf; |
130 | ep = fmtptr - (i<20?i:20); | |
131 | i = i + 5; | |
132 | } | |
133 | else | |
134 | { ep = fmtbuf; | |
135 | i = 25; | |
136 | fmtptr = fmtbuf - 1; | |
137 | } | |
138 | while(i && *ep) | |
e2841838 | 139 | { ffputc((*ep==GLITCH)?'"':*ep,stderr); |
bd899150 DW |
140 | if(ep==fmtptr) fputc('|',stderr); |
141 | ep++; i--; | |
142 | } | |
143 | fputc('\n',stderr); | |
144 | } | |
145 | ||
e2841838 DW |
146 | ffputc(c, f) |
147 | int c; | |
148 | FILE *f; | |
149 | { | |
150 | c &= 0177; | |
151 | if (c < ' ' || c == 0177) | |
152 | { | |
153 | fputc('^', f); | |
154 | c ^= 0100; | |
155 | } | |
156 | fputc(c, f); | |
157 | } | |
158 | ||
bd899150 | 159 | /*initialization routine*/ |
d8e31067 | 160 | short init66_; |
bd899150 | 161 | f_init() |
d8e31067 | 162 | { |
739a5366 DW |
163 | ini_std(STDERR, stderr, WRITE, 0); |
164 | ini_std(STDIN, stdin, READ, 0); | |
165 | ini_std(STDOUT, stdout, WRITE, init66_); | |
bd899150 DW |
166 | } |
167 |