xref: /csrg-svn/usr.bin/pascal/pxp/error.c (revision 12391)
1*12391Speter static	char *sccsid = "@(#)error.c	1.4 (Berkeley) 05/11/83";
22853Speter /* Copyright (c) 1979 Regents of the University of California */
32853Speter /*
42853Speter  * pi - Pascal interpreter code translator
52853Speter  *
62853Speter  * Charles Haley, Bill Joy UCB
72853Speter  * Version 1.2 January 1979
82853Speter  *
92853Speter  *
102853Speter  * pxp - Pascal execution profiler
112853Speter  *
122853Speter  * Bill Joy UCB
132853Speter  * Version 1.2 January 1979
142853Speter  */
152853Speter 
16*12391Speter #include "whoami.h"
172853Speter #include "0.h"
182853Speter #include "yy.h"
192853Speter 
202853Speter #ifdef PXP
212853Speter extern	int yyline;
222853Speter extern	char errout;
232853Speter #endif
242853Speter 
253050Smckusic char	errpfx	= 'E';
262853Speter extern	int yyline;
272853Speter /*
282853Speter  * Panic is called when impossible
292853Speter  * (supposedly, anyways) situations
302853Speter  * are encountered.
312853Speter #ifdef PI
322853Speter  * Panic messages should be short
332853Speter  * as they do not go to the message
342853Speter  * file.
352853Speter #endif
362853Speter  */
372853Speter panic(s)
382853Speter 	char *s;
392853Speter {
402853Speter 
412853Speter #ifdef DEBUG
422853Speter 	fprintf(stderr, "Snark (%s) line=%d yyline=%d\n", s, line, yyline);
432853Speter #endif
442853Speter #ifdef PXP
452853Speter 	Perror( "Snark in pxp", s);
462853Speter #endif
472853Speter #ifdef PI
482853Speter 	Perror( "Snark in pi", s);
492853Speter #endif
502853Speter 	pexit(DIED);
512853Speter }
522853Speter 
532853Speter extern	char *errfile;
542853Speter /*
552853Speter  * Error is called for
562853Speter  * semantic errors and
572853Speter  * prints the error and
582853Speter  * a line number.
592853Speter  */
602853Speter error(a1, a2, a3, a4)
612853Speter {
622853Speter #ifdef PI
632853Speter 	char buf[256];
642853Speter 	register int i;
652853Speter #endif
662853Speter #ifdef PXP
672853Speter /*
682853Speter 	int ofout;
692853Speter */
702853Speter #endif
712853Speter 
722913Speter 	if (errpfx == 'w' && opt('w') != 0) {
732913Speter 		errpfx == 'E';
742853Speter 		return;
752913Speter 	}
762853Speter #ifdef PXP
772853Speter /*
782853Speter 	flush();
792853Speter 	ofout = fout[0];
802853Speter 	fout[0] = errout;
812853Speter */
822853Speter #endif
832853Speter #ifdef PI
842853Speter 	Enocascade = 0;
852853Speter 	geterr(a1, buf);
862853Speter 	a1 = buf;
872853Speter #endif
882853Speter 	if (line < 0)
892853Speter 		line = -line;
902853Speter 	yySsync();
912853Speter 	yysetfile(filename);
922853Speter #ifdef PI
932853Speter 	if (errpfx == ' ') {
942853Speter 		printf("  ");
952853Speter 		for (i = line; i >= 10; i =/ 10)
962853Speter 			putchar(' ');
972853Speter 		printf("... ");
982853Speter 	} else if (Enoline)
992853Speter 		printf("  %c - ", errpfx);
1002853Speter 	else
1012853Speter #endif
1022853Speter 		fprintf(stderr, "%c %d - ", errpfx, line);
1032853Speter 	fprintf(stderr, a1, a2, a3, a4);
1042853Speter 	if (errpfx == 'E')
1052853Speter #ifdef PI
1062853Speter 		eflg++, cgenflg++;
1072853Speter #endif
1082853Speter #ifdef PXP
1092853Speter 		eflg++;
1102853Speter #endif
1112853Speter 	errpfx = 'E';
1122853Speter #ifdef PI
1132853Speter 	if (Eholdnl)
1142853Speter 		Eholdnl = 0;
1152853Speter 	else
1162853Speter #endif
1172853Speter 		putc('\n', stderr);
1182853Speter #ifdef PXP
1192853Speter /*
1202853Speter 	flush();
1212853Speter 	fout[0] = ofout;
1222853Speter */
1232853Speter #endif
1242853Speter }
1252853Speter 
1262853Speter #ifdef PI
1272853Speter cerror(a1, a2, a3, a4)
1282853Speter {
1292853Speter 
1302853Speter 	if (Enocascade)
1312853Speter 		return;
1322853Speter 	setpfx(' ');
1332853Speter 	error(a1, a2, a3, a4);
1342853Speter }
1352853Speter #endif
136