xref: /csrg-svn/usr.bin/pascal/pxp/yyerror.c (revision 2869)
1*2869Speter static	char *sccsid = "@(#)yyerror.c	1.1 (Berkeley) 03/02/81";
2*2869Speter /* Copyright (c) 1979 Regents of the University of California */
3*2869Speter /*
4*2869Speter  * pi - Pascal interpreter code translator
5*2869Speter  *
6*2869Speter  * Charles Haley, Bill Joy UCB
7*2869Speter  * Version 1.2 January 1979
8*2869Speter  *
9*2869Speter  *
10*2869Speter  * pxp - Pascal execution profiler
11*2869Speter  *
12*2869Speter  * Bill Joy UCB
13*2869Speter  * Version 1.2 January 1979
14*2869Speter  */
15*2869Speter 
16*2869Speter #include "0.h"
17*2869Speter #include "yy.h"
18*2869Speter 
19*2869Speter /*
20*2869Speter  * Yerror prints an error
21*2869Speter  * message and then returns
22*2869Speter  * NIL for the tree if needed.
23*2869Speter  * The error is flagged on the
24*2869Speter  * current line which is printed
25*2869Speter  * if the listing is turned off.
26*2869Speter #ifdef PXP
27*2869Speter  *
28*2869Speter  * As is obvious from the fooling around
29*2869Speter  * with fout below, the Pascal system should
30*2869Speter  * be changed to use the new library "lS".
31*2869Speter #endif
32*2869Speter  */
33*2869Speter yerror(s, a1, a2, a3, a4, a5)
34*2869Speter 	char *s;
35*2869Speter {
36*2869Speter #ifdef PI
37*2869Speter 	char buf[256];
38*2869Speter #endif
39*2869Speter 	register int i, j;
40*2869Speter 	static yySerrs;
41*2869Speter #ifdef PXP
42*2869Speter /*
43*2869Speter 	int ofout;
44*2869Speter */
45*2869Speter #endif
46*2869Speter 
47*2869Speter 	if (errpfx == 'w' && opt('w') != 0)
48*2869Speter 		return;
49*2869Speter #ifdef PXP
50*2869Speter /*
51*2869Speter 	flush();
52*2869Speter 	ofout = fout[0];
53*2869Speter 	fout[0] = errout;
54*2869Speter */
55*2869Speter #endif
56*2869Speter 	yyResume = 0;
57*2869Speter #ifdef PI
58*2869Speter 	geterr(s, buf);
59*2869Speter 	s = buf;
60*2869Speter #endif
61*2869Speter 	yysync();
62*2869Speter 	putc(errpfx, stderr);
63*2869Speter 	putc(' ', stderr);
64*2869Speter 	for (i = 3; i < yyecol; i++)
65*2869Speter 		putc('-', stderr);
66*2869Speter 	fprintf(stderr, "^--- ");
67*2869Speter /*
68*2869Speter 	if (yyecol > 60)
69*2869Speter 		printf("\n\t");
70*2869Speter */
71*2869Speter 	fprintf(stderr, s, a1, a2, a3, a4, a5);
72*2869Speter 	putc('\n', stderr);
73*2869Speter 	if (errpfx == 'E')
74*2869Speter #ifdef PI
75*2869Speter 		eflg++, cgenflg++;
76*2869Speter #endif
77*2869Speter #ifdef PXP
78*2869Speter 		eflg++;
79*2869Speter #endif
80*2869Speter 	errpfx = 'E';
81*2869Speter 	yySerrs++;
82*2869Speter 	if (yySerrs >= MAXSYNERR) {
83*2869Speter 		yySerrs = 0;
84*2869Speter 		yerror("Too many syntax errors - QUIT");
85*2869Speter 		pexit(ERRS);
86*2869Speter 	}
87*2869Speter #ifdef PXP
88*2869Speter /*
89*2869Speter 	flush();
90*2869Speter 	fout[0] = ofout;
91*2869Speter */
92*2869Speter 	return (0);
93*2869Speter #endif
94*2869Speter }
95*2869Speter 
96*2869Speter /*
97*2869Speter  * A bracketing error message
98*2869Speter  */
99*2869Speter brerror(where, what)
100*2869Speter 	int where;
101*2869Speter 	char *what;
102*2869Speter {
103*2869Speter 
104*2869Speter 	if (where == 0) {
105*2869Speter 		line = yyeline;
106*2869Speter 		setpfx(' ');
107*2869Speter 		error("End matched %s on line %d", what, where);
108*2869Speter 		return;
109*2869Speter 	}
110*2869Speter 	if (where < 0)
111*2869Speter 		where = -where;
112*2869Speter 	yerror("Inserted keyword end matching %s on line %d", what, where);
113*2869Speter }
114