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