xref: /csrg-svn/usr.bin/pascal/pxp/yyerror.c (revision 22244)
12869Speter /*
2*22244Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22244Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22244Sdist  * specifies the terms and conditions for redistribution.
5*22244Sdist  */
6*22244Sdist 
7*22244Sdist #ifndef lint
8*22244Sdist static char sccsid[] = "@(#)yyerror.c	5.1 (Berkeley) 06/05/85";
9*22244Sdist #endif not lint
10*22244Sdist 
11*22244Sdist /*
122869Speter  * pi - Pascal interpreter code translator
132869Speter  *
142869Speter  * Charles Haley, Bill Joy UCB
152869Speter  * Version 1.2 January 1979
162869Speter  *
172869Speter  *
182869Speter  * pxp - Pascal execution profiler
192869Speter  *
202869Speter  * Bill Joy UCB
212869Speter  * Version 1.2 January 1979
222869Speter  */
232869Speter 
2412391Speter #include "whoami.h"
252869Speter #include "0.h"
262869Speter #include "yy.h"
272869Speter 
282869Speter /*
292869Speter  * Yerror prints an error
302869Speter  * message and then returns
312869Speter  * NIL for the tree if needed.
322869Speter  * The error is flagged on the
332869Speter  * current line which is printed
342869Speter  * if the listing is turned off.
352869Speter #ifdef PXP
362869Speter  *
372869Speter  * As is obvious from the fooling around
382869Speter  * with fout below, the Pascal system should
392869Speter  * be changed to use the new library "lS".
402869Speter #endif
412869Speter  */
422869Speter yerror(s, a1, a2, a3, a4, a5)
432869Speter 	char *s;
442869Speter {
452869Speter #ifdef PI
462869Speter 	char buf[256];
472869Speter #endif
482869Speter 	register int i, j;
492869Speter 	static yySerrs;
502869Speter #ifdef PXP
512869Speter /*
522869Speter 	int ofout;
532869Speter */
542869Speter #endif
552869Speter 
562869Speter 	if (errpfx == 'w' && opt('w') != 0)
572869Speter 		return;
582869Speter #ifdef PXP
592869Speter /*
602869Speter 	flush();
612869Speter 	ofout = fout[0];
622869Speter 	fout[0] = errout;
632869Speter */
642869Speter #endif
652869Speter 	yyResume = 0;
662869Speter #ifdef PI
672869Speter 	geterr(s, buf);
682869Speter 	s = buf;
692869Speter #endif
702869Speter 	yysync();
712869Speter 	putc(errpfx, stderr);
722869Speter 	putc(' ', stderr);
732869Speter 	for (i = 3; i < yyecol; i++)
742869Speter 		putc('-', stderr);
752869Speter 	fprintf(stderr, "^--- ");
762869Speter /*
772869Speter 	if (yyecol > 60)
782869Speter 		printf("\n\t");
792869Speter */
802869Speter 	fprintf(stderr, s, a1, a2, a3, a4, a5);
812869Speter 	putc('\n', stderr);
822869Speter 	if (errpfx == 'E')
832869Speter #ifdef PI
842869Speter 		eflg++, cgenflg++;
852869Speter #endif
862869Speter #ifdef PXP
872869Speter 		eflg++;
882869Speter #endif
892869Speter 	errpfx = 'E';
902869Speter 	yySerrs++;
912869Speter 	if (yySerrs >= MAXSYNERR) {
922869Speter 		yySerrs = 0;
932869Speter 		yerror("Too many syntax errors - QUIT");
942869Speter 		pexit(ERRS);
952869Speter 	}
962869Speter #ifdef PXP
972869Speter /*
982869Speter 	flush();
992869Speter 	fout[0] = ofout;
1002869Speter */
1012869Speter 	return (0);
1022869Speter #endif
1032869Speter }
1042869Speter 
1052869Speter /*
1062869Speter  * A bracketing error message
1072869Speter  */
1082869Speter brerror(where, what)
1092869Speter 	int where;
1102869Speter 	char *what;
1112869Speter {
1122869Speter 
1132869Speter 	if (where == 0) {
1142869Speter 		line = yyeline;
1152869Speter 		setpfx(' ');
1162869Speter 		error("End matched %s on line %d", what, where);
1172869Speter 		return;
1182869Speter 	}
1192869Speter 	if (where < 0)
1202869Speter 		where = -where;
1212869Speter 	yerror("Inserted keyword end matching %s on line %d", what, where);
1222869Speter }
123