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