xref: /csrg-svn/usr.bin/pascal/src/error.c (revision 751)
1*751Speter /* Copyright (c) 1979 Regents of the University of California */
2*751Speter 
3*751Speter static	char sccsid[] = "@(#)error.c 1.1 08/27/80";
4*751Speter 
5*751Speter #include "whoami.h"
6*751Speter #include "0.h"
7*751Speter #ifndef PI1
8*751Speter #include "yy.h"
9*751Speter #endif
10*751Speter 
11*751Speter char	errpfx	= 'E';
12*751Speter extern	int yyline;
13*751Speter /*
14*751Speter  * Panic is called when impossible
15*751Speter  * (supposedly, anyways) situations
16*751Speter  * are encountered.
17*751Speter  * Panic messages should be short
18*751Speter  * as they do not go to the message
19*751Speter  * file.
20*751Speter  */
21*751Speter panic(s)
22*751Speter 	char *s;
23*751Speter {
24*751Speter 
25*751Speter #ifdef DEBUG
26*751Speter #ifdef PI1
27*751Speter 	printf("Snark (%s) line=%d\n", s, line);
28*751Speter 	abort();
29*751Speter #else
30*751Speter 	printf("Snark (%s) line=%d, yyline=%d\n", s, line, yyline);
31*751Speter 	abort () ;	/* die horribly */
32*751Speter #endif
33*751Speter #endif
34*751Speter #ifdef PI1
35*751Speter 	Perror( "Snark in pi1", s);
36*751Speter #else
37*751Speter 	Perror( "Snark in pi", s);
38*751Speter #endif
39*751Speter 	pexit(DIED);
40*751Speter }
41*751Speter 
42*751Speter extern	char *errfile;
43*751Speter /*
44*751Speter  * Error is called for
45*751Speter  * semantic errors and
46*751Speter  * prints the error and
47*751Speter  * a line number.
48*751Speter  */
49*751Speter 
50*751Speter /*VARARGS*/
51*751Speter 
52*751Speter error(a1, a2, a3, a4)
53*751Speter 	register char *a1;
54*751Speter {
55*751Speter 	char errbuf[256]; 		/* was extern. why? ...pbk */
56*751Speter 	register int i;
57*751Speter 
58*751Speter 	if (errpfx == 'w' && opt('w') != 0) {
59*751Speter 		errpfx = 'E';
60*751Speter 		return;
61*751Speter 	}
62*751Speter 	Enocascade = 0;
63*751Speter 	geterr(a1, errbuf);
64*751Speter 	a1 = errbuf;
65*751Speter 	if (line < 0)
66*751Speter 		line = -line;
67*751Speter #ifndef PI1
68*751Speter 	if (opt('l'))
69*751Speter 		yyoutline();
70*751Speter #endif
71*751Speter 	yysetfile(filename);
72*751Speter 	if (errpfx == ' ') {
73*751Speter 		printf("  ");
74*751Speter 		for (i = line; i >= 10; i /= 10)
75*751Speter 			pchr( ' ' );
76*751Speter 		printf("... ");
77*751Speter 	} else if (Enoline)
78*751Speter 		printf("  %c - ", errpfx);
79*751Speter 	else
80*751Speter 		printf("%c %d - ", errpfx, line);
81*751Speter 	printf(a1, a2, a3, a4);
82*751Speter 	if (errpfx == 'E')
83*751Speter #ifndef PI0
84*751Speter 		eflg++, codeoff();
85*751Speter #else
86*751Speter 		eflg++;
87*751Speter #endif
88*751Speter 	errpfx = 'E';
89*751Speter 	if (Eholdnl)
90*751Speter 		Eholdnl = 0;
91*751Speter 	else
92*751Speter 		pchr( '\n' );
93*751Speter }
94*751Speter 
95*751Speter /*VARAGRS*/
96*751Speter 
97*751Speter cerror(a1, a2, a3, a4)
98*751Speter {
99*751Speter 
100*751Speter 	if (Enocascade)
101*751Speter 		return;
102*751Speter 	setpfx(' ');
103*751Speter 	error(a1, a2, a3, a4);
104*751Speter }
105*751Speter 
106*751Speter #ifdef PI1
107*751Speter 
108*751Speter /*VARARGS*/
109*751Speter 
110*751Speter derror(a1, a2, a3, a4)
111*751Speter {
112*751Speter 
113*751Speter 	if (!holdderr)
114*751Speter 		error(a1, a2, a3, a4);
115*751Speter 	errpfx = 'E';
116*751Speter }
117*751Speter 
118*751Speter char	*lastname, printed, hadsome;
119*751Speter 
120*751Speter     /*
121*751Speter      *	this yysetfile for PI1 only.
122*751Speter      *	the real yysetfile is in yyput.c
123*751Speter      */
124*751Speter yysetfile(name)
125*751Speter 	char *name;
126*751Speter {
127*751Speter 
128*751Speter 	if (lastname == name)
129*751Speter 		return;
130*751Speter 	printed =| 1;
131*751Speter 	gettime( name );
132*751Speter 	printf("%s  %s:\n" , myctime( &tvec ) , name );
133*751Speter 	lastname = name;
134*751Speter }
135*751Speter #endif
136