xref: /csrg-svn/usr.bin/pascal/pxp/error.c (revision 2853)
1*2853Speter static	char *sccsid = "@(#)error.c	1.1 (Berkeley) 03/02/81";
2*2853Speter /* Copyright (c) 1979 Regents of the University of California */
3*2853Speter /*
4*2853Speter  * pi - Pascal interpreter code translator
5*2853Speter  *
6*2853Speter  * Charles Haley, Bill Joy UCB
7*2853Speter  * Version 1.2 January 1979
8*2853Speter  *
9*2853Speter  *
10*2853Speter  * pxp - Pascal execution profiler
11*2853Speter  *
12*2853Speter  * Bill Joy UCB
13*2853Speter  * Version 1.2 January 1979
14*2853Speter  */
15*2853Speter 
16*2853Speter #include "0.h"
17*2853Speter #include "yy.h"
18*2853Speter 
19*2853Speter #ifdef PXP
20*2853Speter extern	int yyline;
21*2853Speter extern	char errout;
22*2853Speter #endif
23*2853Speter 
24*2853Speter char	errpfx	'E';
25*2853Speter extern	int yyline;
26*2853Speter /*
27*2853Speter  * Panic is called when impossible
28*2853Speter  * (supposedly, anyways) situations
29*2853Speter  * are encountered.
30*2853Speter #ifdef PI
31*2853Speter  * Panic messages should be short
32*2853Speter  * as they do not go to the message
33*2853Speter  * file.
34*2853Speter #endif
35*2853Speter  */
36*2853Speter panic(s)
37*2853Speter 	char *s;
38*2853Speter {
39*2853Speter 
40*2853Speter #ifdef DEBUG
41*2853Speter 	fprintf(stderr, "Snark (%s) line=%d yyline=%d\n", s, line, yyline);
42*2853Speter #endif
43*2853Speter #ifdef PXP
44*2853Speter 	Perror( "Snark in pxp", s);
45*2853Speter #endif
46*2853Speter #ifdef PI
47*2853Speter 	Perror( "Snark in pi", s);
48*2853Speter #endif
49*2853Speter 	pexit(DIED);
50*2853Speter }
51*2853Speter 
52*2853Speter extern	char *errfile;
53*2853Speter /*
54*2853Speter  * Error is called for
55*2853Speter  * semantic errors and
56*2853Speter  * prints the error and
57*2853Speter  * a line number.
58*2853Speter  */
59*2853Speter error(a1, a2, a3, a4)
60*2853Speter {
61*2853Speter #ifdef PI
62*2853Speter 	char buf[256];
63*2853Speter 	register int i;
64*2853Speter #endif
65*2853Speter #ifdef PXP
66*2853Speter /*
67*2853Speter 	int ofout;
68*2853Speter */
69*2853Speter #endif
70*2853Speter 
71*2853Speter 	if (errpfx == 'w' && opt('w') != 0)
72*2853Speter 		return;
73*2853Speter #ifdef PXP
74*2853Speter /*
75*2853Speter 	flush();
76*2853Speter 	ofout = fout[0];
77*2853Speter 	fout[0] = errout;
78*2853Speter */
79*2853Speter #endif
80*2853Speter #ifdef PI
81*2853Speter 	Enocascade = 0;
82*2853Speter 	geterr(a1, buf);
83*2853Speter 	a1 = buf;
84*2853Speter #endif
85*2853Speter 	if (line < 0)
86*2853Speter 		line = -line;
87*2853Speter 	yySsync();
88*2853Speter 	yysetfile(filename);
89*2853Speter #ifdef PI
90*2853Speter 	if (errpfx == ' ') {
91*2853Speter 		printf("  ");
92*2853Speter 		for (i = line; i >= 10; i =/ 10)
93*2853Speter 			putchar(' ');
94*2853Speter 		printf("... ");
95*2853Speter 	} else if (Enoline)
96*2853Speter 		printf("  %c - ", errpfx);
97*2853Speter 	else
98*2853Speter #endif
99*2853Speter 		fprintf(stderr, "%c %d - ", errpfx, line);
100*2853Speter 	fprintf(stderr, a1, a2, a3, a4);
101*2853Speter 	if (errpfx == 'E')
102*2853Speter #ifdef PI
103*2853Speter 		eflg++, cgenflg++;
104*2853Speter #endif
105*2853Speter #ifdef PXP
106*2853Speter 		eflg++;
107*2853Speter #endif
108*2853Speter 	errpfx = 'E';
109*2853Speter #ifdef PI
110*2853Speter 	if (Eholdnl)
111*2853Speter 		Eholdnl = 0;
112*2853Speter 	else
113*2853Speter #endif
114*2853Speter 		putc('\n', stderr);
115*2853Speter #ifdef PXP
116*2853Speter /*
117*2853Speter 	flush();
118*2853Speter 	fout[0] = ofout;
119*2853Speter */
120*2853Speter #endif
121*2853Speter }
122*2853Speter 
123*2853Speter #ifdef PI
124*2853Speter cerror(a1, a2, a3, a4)
125*2853Speter {
126*2853Speter 
127*2853Speter 	if (Enocascade)
128*2853Speter 		return;
129*2853Speter 	setpfx(' ');
130*2853Speter 	error(a1, a2, a3, a4);
131*2853Speter }
132*2853Speter #endif
133