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