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