xref: /csrg-svn/usr.bin/pascal/pxp/error.c (revision 2913)
1*2913Speter static	char *sccsid = "@(#)error.c	1.2 (Berkeley) 03/05/81";
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 
162853Speter #include "0.h"
172853Speter #include "yy.h"
182853Speter 
192853Speter #ifdef PXP
202853Speter extern	int yyline;
212853Speter extern	char errout;
222853Speter #endif
232853Speter 
242853Speter char	errpfx	'E';
252853Speter extern	int yyline;
262853Speter /*
272853Speter  * Panic is called when impossible
282853Speter  * (supposedly, anyways) situations
292853Speter  * are encountered.
302853Speter #ifdef PI
312853Speter  * Panic messages should be short
322853Speter  * as they do not go to the message
332853Speter  * file.
342853Speter #endif
352853Speter  */
362853Speter panic(s)
372853Speter 	char *s;
382853Speter {
392853Speter 
402853Speter #ifdef DEBUG
412853Speter 	fprintf(stderr, "Snark (%s) line=%d yyline=%d\n", s, line, yyline);
422853Speter #endif
432853Speter #ifdef PXP
442853Speter 	Perror( "Snark in pxp", s);
452853Speter #endif
462853Speter #ifdef PI
472853Speter 	Perror( "Snark in pi", s);
482853Speter #endif
492853Speter 	pexit(DIED);
502853Speter }
512853Speter 
522853Speter extern	char *errfile;
532853Speter /*
542853Speter  * Error is called for
552853Speter  * semantic errors and
562853Speter  * prints the error and
572853Speter  * a line number.
582853Speter  */
592853Speter error(a1, a2, a3, a4)
602853Speter {
612853Speter #ifdef PI
622853Speter 	char buf[256];
632853Speter 	register int i;
642853Speter #endif
652853Speter #ifdef PXP
662853Speter /*
672853Speter 	int ofout;
682853Speter */
692853Speter #endif
702853Speter 
71*2913Speter 	if (errpfx == 'w' && opt('w') != 0) {
72*2913Speter 		errpfx == 'E';
732853Speter 		return;
74*2913Speter 	}
752853Speter #ifdef PXP
762853Speter /*
772853Speter 	flush();
782853Speter 	ofout = fout[0];
792853Speter 	fout[0] = errout;
802853Speter */
812853Speter #endif
822853Speter #ifdef PI
832853Speter 	Enocascade = 0;
842853Speter 	geterr(a1, buf);
852853Speter 	a1 = buf;
862853Speter #endif
872853Speter 	if (line < 0)
882853Speter 		line = -line;
892853Speter 	yySsync();
902853Speter 	yysetfile(filename);
912853Speter #ifdef PI
922853Speter 	if (errpfx == ' ') {
932853Speter 		printf("  ");
942853Speter 		for (i = line; i >= 10; i =/ 10)
952853Speter 			putchar(' ');
962853Speter 		printf("... ");
972853Speter 	} else if (Enoline)
982853Speter 		printf("  %c - ", errpfx);
992853Speter 	else
1002853Speter #endif
1012853Speter 		fprintf(stderr, "%c %d - ", errpfx, line);
1022853Speter 	fprintf(stderr, a1, a2, a3, a4);
1032853Speter 	if (errpfx == 'E')
1042853Speter #ifdef PI
1052853Speter 		eflg++, cgenflg++;
1062853Speter #endif
1072853Speter #ifdef PXP
1082853Speter 		eflg++;
1092853Speter #endif
1102853Speter 	errpfx = 'E';
1112853Speter #ifdef PI
1122853Speter 	if (Eholdnl)
1132853Speter 		Eholdnl = 0;
1142853Speter 	else
1152853Speter #endif
1162853Speter 		putc('\n', stderr);
1172853Speter #ifdef PXP
1182853Speter /*
1192853Speter 	flush();
1202853Speter 	fout[0] = ofout;
1212853Speter */
1222853Speter #endif
1232853Speter }
1242853Speter 
1252853Speter #ifdef PI
1262853Speter cerror(a1, a2, a3, a4)
1272853Speter {
1282853Speter 
1292853Speter 	if (Enocascade)
1302853Speter 		return;
1312853Speter 	setpfx(' ');
1322853Speter 	error(a1, a2, a3, a4);
1332853Speter }
1342853Speter #endif
135