fixed err prnt bug & added display of non-prnt chars. DLW
[unix-history] / usr / src / usr.bin / f77 / libI77 / err.c
CommitLineData
bd899150 1/*
e2841838 2char id_err[] = "@(#)err.c 1.6";
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
16char *tmplate = "tmp.FXXXXXX"; /* scratch file template */
17char *fortfile = "fort.%d"; /* default file template */
18
19unit units[MXUNIT] = 0; /*unit table*/
20flag reading; /*1 if reading, 0 if writing*/
21flag external; /*1 if external io, 0 if internal */
22flag sequential; /*1 if sequential io, 0 if direct*/
23flag formatted; /*1 if formatted io, 0 if unformatted, -1 if list*/
24char *fmtbuf, *icptr, *icend, *fmtptr;
25int (*doed)(),(*doned)();
26int (*doend)(),(*donewrec)(),(*dorevert)(),(*dotab)();
27int (*lioproc)();
28int (*getn)(),(*putn)(),(*ungetn)(); /*for formatted io*/
29icilist *svic; /* active internal io list */
30FILE *cf; /*current file structure*/
31unit *curunit; /*current unit structure*/
32int lunit; /*current logical unit*/
33char *lfname; /*current filename*/
34int recpos; /*place in current record*/
35ftnint recnum; /* current record number */
36int reclen; /* current record length */
37int cursor,scale;
38int radix;
39ioflag signit,tab,cplus,cblank,elist,errflag,endflag,lquit,l_first;
40flag leof;
41int lcount,line_len;
42
43/*error messages*/
44
45extern char *sys_errlist[];
46extern int sys_nerr;
47
278ccb77
DW
48extern char *f_errlist[];
49extern int f_nerr;
bd899150
DW
50
51
52fatal(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
99prnt_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
115prnt_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
125prnt_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
146ffputc(c, f)
147int c;
148FILE *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
DW
159/*initialization routine*/
160f_init()
739a5366
DW
161{ extern short init66_;
162 ini_std(STDERR, stderr, WRITE, 0);
163 ini_std(STDIN, stdin, READ, 0);
164 ini_std(STDOUT, stdout, WRITE, init66_);
bd899150
DW
165}
166