xref: /original-bsd/usr.bin/f77/libI77/err.c (revision 0b685140)
1 /*
2 char id_err[] = "@(#)err.c	1.6";
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 
48 extern char *f_errlist[];
49 extern int f_nerr;
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]);
62 	else if(n>=F_ER && n<F_MAXERR)
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++);
108 		while(i--) ffputc(fgetc(curunit->ufd),stderr);
109 	}
110 	fputc('|',stderr);
111 	for(i=0;i<5 && (ch=fgetc(curunit->ufd))!=EOF;i++) ffputc(ch,stderr);
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);
119 	while (ep<icptr) ffputc(*ep++,stderr);
120 	fputc('|',stderr);
121 	while (ep<(icptr+5) && ep<icend) ffputc(*ep++,stderr);
122 	fputc('\n',stderr);
123 }
124 
125 prnt_fmt(n) int n;
126 {	int i; char *ep;
127 	fprintf(stderr, "part of last format: ");
128 	if(n==F_ERFMT)
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)
139 	{	ffputc((*ep==GLITCH)?'"':*ep,stderr);
140 		if(ep==fmtptr) fputc('|',stderr);
141 		ep++; i--;
142 	}
143 	fputc('\n',stderr);
144 }
145 
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 
159 /*initialization routine*/
160 f_init()
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_);
165 }
166 
167