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