xref: /csrg-svn/usr.bin/f77/libI77/err.c (revision 20984)
1 /*
2 char id_err[] = "@(#)err.c	1.16";
3  *
4  * fatal(): i/o error routine
5  * flush_(): flush file buffer
6  */
7 
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <signal.h>
11 #include "fio.h"
12 
13 /*
14  * global definitions
15  */
16 
17 unit units[MXUNIT];	/*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 FILE *cf;		/*current file structure*/
28 unit *curunit;		/*current unit structure*/
29 int lunit;		/*current logical unit*/
30 char *lfname;		/*current filename*/
31 int recpos;		/*place in current record*/
32 ftnint recnum;		/* current record number */
33 int reclen;		/* current record length */
34 int cursor,scale;
35 int radix;
36 ioflag signit,tab,cplus,cblank,elist,errflag,endflag,lquit,l_first;
37 flag leof;
38 int lcount,line_len;
39 struct ioiflg ioiflg_;	/* initialization flags */
40 
41 /*error messages*/
42 
43 extern char *sys_errlist[];
44 extern int sys_nerr;
45 
46 extern char *f_errlist[];
47 extern int f_nerr;
48 
49 
50 fatal(n,s) char *s;
51 {
52 	ftnint lu;
53 
54 	for (lu=1; lu < MXUNIT; lu++)
55 		flush_(&lu);
56 	if(n<0)
57 		fprintf(stderr,"%s: [%d] end of file\n",s,n);
58 	else if(n>=0 && n<sys_nerr)
59 		fprintf(stderr,"%s: [%d] %s\n",s,n,sys_errlist[n]);
60 	else if(n>=F_ER && n<F_MAXERR)
61 		fprintf(stderr,"%s: [%d] %s\n",s,n,f_errlist[n-F_ER]);
62 	else
63 		fprintf(stderr,"%s: [%d] unknown error number\n",s,n);
64 	if(external)
65 	{
66 		if(!lfname) switch (lunit)
67 		{	case STDERR: lfname = "stderr";
68 					break;
69 			case STDIN:  lfname = "stdin";
70 					break;
71 			case STDOUT: lfname = "stdout";
72 					break;
73 			default:     lfname = "";
74 		}
75 		fprintf(stderr,"logical unit %d, named '%s'\n",lunit,lfname);
76 	}
77 	if (elist)
78 	{	fprintf(stderr,"lately: %s %s %s %s I/O\n",
79 			reading?"reading":"writing",
80 			sequential?"sequential":"direct",
81 			formatted>0?"formatted":(formatted<0?"list":"unformatted"),
82 			external?"external":"internal");
83 		if (formatted)
84 		{	if(fmtbuf) prnt_fmt(n);
85 			if (external)
86 			{	if(reading && curunit->useek)
87 					prnt_ext();  /* print external data */
88 			}
89 			else prnt_int();	/* print internal array */
90 		}
91 	}
92 	f77_abort(n);
93 }
94 
95 LOCAL
96 prnt_ext()
97 {	int ch;
98 	int i=1;
99 	long loc;
100 	fprintf (stderr, "part of last data: ");
101 	loc = ftell(curunit->ufd);
102 	if(loc)
103 	{	if(loc==1L) rewind(curunit->ufd);
104 		else for(;i<12 && last_char(curunit->ufd)!='\n';i++);
105 		while(i--) ffputc(fgetc(curunit->ufd),stderr);
106 	}
107 	fputc('|',stderr);
108 	for(i=0;i<5 && (ch=fgetc(curunit->ufd))!=EOF;i++) ffputc(ch,stderr);
109 	fputc('\n',stderr);
110 }
111 
112 LOCAL
113 prnt_int()
114 {	char *ep;
115 	fprintf (stderr,"part of last string: ");
116 	ep = icptr - (recpos<12?recpos:12);
117 	while (ep<icptr) ffputc(*ep++,stderr);
118 	fputc('|',stderr);
119 	while (ep<(icptr+5) && ep<icend) ffputc(*ep++,stderr);
120 	fputc('\n',stderr);
121 }
122 
123 LOCAL
124 prnt_fmt(n) int n;
125 {	int i; char *ep;
126 	fprintf(stderr, "format: ");
127 	if(n==F_ERFMT)
128 	{	i = fmtptr - fmtbuf;
129 		ep = fmtptr - (i<25?i:25);
130 		if(ep != fmtbuf) fprintf(stderr, "... ");
131 		i = i + 5;
132 	}
133 	else
134 	{	ep = fmtbuf;
135 		i = 25;
136 		fmtptr = fmtbuf - 1;
137 	}
138 	while(i && *ep)
139 	{	ffputc((*ep==GLITCH)?'"':*ep,stderr);
140 		if(ep==fmtptr) fputc('|',stderr);
141 		ep++; i--;
142 	}
143 	if(*ep) fprintf(stderr, " ...");
144 	fputc('\n',stderr);
145 }
146 
147 LOCAL
148 ffputc(c, f)
149 int	c;
150 FILE	*f;
151 {
152 	c &= 0177;
153 	if (c < ' ' || c == 0177)
154 	{
155 		fputc('^', f);
156 		c ^= 0100;
157 	}
158 	fputc(c, f);
159 }
160 
161 ftnint
162 flush_(u) ftnint *u;
163 {
164 	FILE *F;
165 
166 	if(not_legal(*u))
167 		return(F_ERUNIT);
168 	F = units[*u].ufd;
169 	if(F)
170 		return(fflush(F));
171 	else
172 		return(F_ERNOPEN);
173 }
174