xref: /csrg-svn/usr.bin/pascal/src/yyerror.c (revision 14747)
1784Speter /* Copyright (c) 1979 Regents of the University of California */
2784Speter 
3*14747Sthien #ifndef lint
4*14747Sthien static	char sccsid[] = "@(#)yyerror.c 1.3 08/19/83";
5*14747Sthien #endif
6784Speter 
7784Speter #include "whoami.h"
8784Speter #include "0.h"
9*14747Sthien #include "tree_ty.h"	/* must be included for yy.h */
10784Speter #include "yy.h"
11784Speter 
12784Speter /*
13784Speter  * Yerror prints an error
14784Speter  * message and then returns
15784Speter  * NIL for the tree if needed.
16784Speter  * The error is flagged on the
17784Speter  * current line which is printed
18784Speter  * if the listing is turned off.
19784Speter #ifdef PXP
20784Speter  *
21784Speter  * As is obvious from the fooling around
22784Speter  * with fout below, the Pascal system should
23784Speter  * be changed to use the new library "lS".
24784Speter #endif
25784Speter  */
26*14747Sthien /*VARARGS*/
27784Speter yerror(s, a1, a2, a3, a4, a5)
28784Speter 	char *s;
29*14747Sthien 	char *a1, *a2, *a3, *a4, *a5;
30784Speter {
31784Speter #ifdef PI
32784Speter 	char buf[256];
33784Speter #endif
34*14747Sthien 	register int i;
35784Speter 	static yySerrs;
36784Speter #ifdef PXP
37784Speter 	int ofout;
38784Speter #endif
39784Speter 
40784Speter 	if (errpfx == 'w' && opt('w') != 0) {
41784Speter 		errpfx = 'E';
42784Speter 		return;
43784Speter 	}
44784Speter #ifdef PXP
45784Speter 	flush();
46784Speter 	ofout = fout[0];
47784Speter 	fout[0] = errout;
48784Speter #endif
49784Speter 	yyResume = 0;
50784Speter #ifdef PI
51*14747Sthien 	geterr((int) s, buf);
52784Speter 	s = buf;
53784Speter #endif
54784Speter 	yysync();
55784Speter 	pchr(errpfx);
56784Speter 	pchr(' ');
57784Speter 	for (i = 3; i < yyecol; i++)
58784Speter 		pchr('-');
59784Speter 	printf("^--- ");
60784Speter /*
61784Speter 	if (yyecol > 60)
62784Speter 		printf("\n\t");
63784Speter */
64784Speter 	printf(s, a1, a2, a3, a4, a5);
65784Speter 	pchr('\n');
66784Speter 	if (errpfx == 'E')
67784Speter #ifdef PI
683085Smckusic 		eflg = TRUE, codeoff();
69784Speter #endif
70784Speter #ifdef PXP
713085Smckusic 		eflg = TRUE;
72784Speter #endif
73784Speter 	errpfx = 'E';
74784Speter 	yySerrs++;
75784Speter 	if (yySerrs >= MAXSYNERR) {
76784Speter 		yySerrs = 0;
77784Speter 		yerror("Too many syntax errors - QUIT");
78784Speter 		pexit(ERRS);
79784Speter 	}
80784Speter #ifdef PXP
81784Speter 	flush();
82784Speter 	fout[0] = ofout;
83784Speter 	return (0);
84784Speter #endif
85784Speter }
86784Speter 
87784Speter /*
88784Speter  * A bracketing error message
89784Speter  */
90784Speter brerror(where, what)
91784Speter 	int where;
92784Speter 	char *what;
93784Speter {
94784Speter 
95784Speter 	if (where == 0) {
96784Speter 		line = yyeline;
97784Speter 		setpfx(' ');
98*14747Sthien 		error("End matched %s on line %d", what, (char *) where);
99784Speter 		return;
100784Speter 	}
101784Speter 	if (where < 0)
102784Speter 		where = -where;
103*14747Sthien 	yerror("Inserted keyword end matching %s on line %d", what, (char *) where);
104784Speter }
105