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