|
|
1.1 root 1: /*
2: * file i/o error and initialization routines
3: */
4:
5: #include <sys/types.h>
6: #include <sys/stat.h>
7: #include <signal.h>
8: #include "fiodefs.h"
9:
10: /*
11: * global definitions
12: */
13:
14: char *tmplate = "tmp.FXXXXXX"; /* scratch file template */
15: char *fortfile = "fort.%d"; /* default file template */
16:
17: unit units[MXUNIT] = 0; /*unit table*/
18: flag reading; /*1 if reading, 0 if writing*/
19: flag external; /*1 if external io, 0 if internal */
20: flag sequential; /*1 if sequential io, 0 if direct*/
21: flag formatted; /*1 if formatted io, 0 if unformatted, -1 if list*/
22: char *fmtbuf, *icptr, *icend, *fmtptr;
23: int (*doed)(),(*doned)();
24: int (*doend)(),(*donewrec)(),(*dorevert)(),(*dotab)();
25: int (*lioproc)();
26: int (*getn)(),(*putn)(),(*ungetn)(); /*for formatted io*/
27: icilist *svic; /* active internal io list */
28: FILE *cf; /*current file structure*/
29: unit *curunit; /*current unit structure*/
30: int lunit; /*current logical unit*/
31: char *lfname; /*current filename*/
32: int recpos; /*place in current record*/
33: ftnint recnum; /* current record number */
34: int reclen; /* current record length */
35: int cursor,scale;
36: int radix;
37: ioflag signit,tab,cplus,cblank,elist,errflag,endflag,lquit,l_first;
38: flag leof;
39: int lcount,line_len;
40:
41: /*error messages*/
42:
43: extern char *sys_errlist[];
44:
45: char *F_err[] =
46: {
47: /* 100 */ "error in format",
48: /* 101 */ "illegal unit number",
49: /* 102 */ "formatted io not allowed",
50: /* 103 */ "unformatted io not allowed",
51: /* 104 */ "direct io not allowed",
52: /* 105 */ "sequential io not allowed",
53: /* 106 */ "can't backspace file",
54: /* 107 */ "off beginning of record",
55: /* 108 */ "can't stat file",
56: /* 109 */ "no * after repeat count",
57: /* 110 */ "off end of record",
58: /* 111 */ "truncation failed",
59: /* 112 */ "incomprehensible list input",
60: /* 113 */ "out of free space",
61: /* 114 */ "unit not connected",
62: /* 115 */ "read unexpected character",
63: /* 116 */ "blank logical input field",
64: /* 117 */ "'new' file exists",
65: /* 118 */ "can't find 'old' file",
66: /* 119 */ "unknown system error",
67: /* 120 */ "requires seek ability",
68: /* 121 */ "illegal argument",
69: /* 122 */ "negative repeat count",
70: };
71:
72: #define MAXERR (sizeof(F_err)/sizeof(char *)+100)
73:
74:
75: fatal(n,s) char *s;
76: {
77: ftnint lu;
78:
79: for (lu=1; lu < MXUNIT; lu++)
80: flush_(&lu);
81: if(n<100 && n>=0)
82: fprintf(stderr,"%s: [%d] %s\n",s,n,sys_errlist[n]);
83: else if(n>=(int)MAXERR)
84: fprintf(stderr,"%s: [%d] illegal error number\n",s,n);
85: else if(n<0)
86: fprintf(stderr,"%s: [%d] end of file\n",s,n);
87: else
88: fprintf(stderr,"%s: [%d] %s\n",s,n,F_err[n-100]);
89: if(external)
90: {
91: if(!lfname) switch (lunit)
92: { case STDERR: lfname = "stderr";
93: break;
94: case STDIN: lfname = "stdin";
95: break;
96: case STDOUT: lfname = "stdout";
97: break;
98: default: lfname = "";
99: }
100: fprintf(stderr,"logical unit %d, named '%s'\n",lunit,lfname);
101: }
102: if (elist)
103: { fprintf(stderr,"lately: %s %s %s %s IO\n",
104: reading?"reading":"writing",
105: sequential?"sequential":"direct",
106: formatted>0?"formatted":(formatted<0?"list":"unformatted"),
107: external?"external":"internal");
108: if (formatted)
109: { if(fmtbuf) prnt_fmt(n);
110: if (external)
111: { if(reading && curunit->useek)
112: prnt_ext(); /* print external data */
113: }
114: else prnt_int(); /* print internal array */
115: }
116: }
117: f_exit();
118: _cleanup();
119: abort();
120: }
121:
122: prnt_ext()
123: { int ch;
124: int i=1;
125: long loc;
126: fprintf (stderr, "part of last data: ");
127: loc = ftell(curunit->ufd);
128: if(loc)
129: { if(loc==1L) rewind(curunit->ufd);
130: else for(;i<12 && last_char(curunit->ufd)!='\n';i++);
131: while(i--) fputc(fgetc(curunit->ufd),stderr);
132: }
133: fputc('|',stderr);
134: for(i=0;i<5 && (ch=fgetc(curunit->ufd)!=EOF);i++) fputc(ch,stderr);
135: fputc('\n',stderr);
136: }
137:
138: prnt_int()
139: { char *ep;
140: fprintf (stderr,"part of last string: ");
141: ep = icptr - (recpos<12?recpos:12);
142: while (ep<icptr) fputc(*ep++,stderr);
143: fputc('|',stderr);
144: while (ep<(icptr+5) && ep<icend) fputc(*ep++,stderr);
145: fputc('\n',stderr);
146: }
147:
148: prnt_fmt(n) int n;
149: { int i; char *ep;
150: fprintf(stderr, "part of last format: ");
151: if(n==100)
152: { i = fmtptr - fmtbuf;
153: ep = fmtptr - (i<20?i:20);
154: i = i + 5;
155: }
156: else
157: { ep = fmtbuf;
158: i = 25;
159: fmtptr = fmtbuf - 1;
160: }
161: while(i && *ep)
162: { fputc((*ep==GLITCH)?'"':*ep,stderr);
163: if(ep==fmtptr) fputc('|',stderr);
164: ep++; i--;
165: }
166: fputc('\n',stderr);
167: }
168:
169: /*initialization routine*/
170: f_init()
171: { ini_std(STDERR, stderr, WRITE);
172: ini_std(STDIN, stdin, READ);
173: ini_std(STDOUT, stdout, WRITE);
174: }
175:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.