148112Sbostic /*-
2*62189Sbostic * Copyright (c) 1980, 1993
3*62189Sbostic * The Regents of the University of California. All rights reserved.
448112Sbostic *
548112Sbostic * %sccs.include.redist.c%
622227Sdist */
722227Sdist
822227Sdist #ifndef lint
9*62189Sbostic static char sccsid[] = "@(#)error.c 8.1 (Berkeley) 06/06/93";
1048112Sbostic #endif /* not lint */
1122227Sdist
1222227Sdist /*
132853Speter * pi - Pascal interpreter code translator
142853Speter *
152853Speter * Charles Haley, Bill Joy UCB
162853Speter * Version 1.2 January 1979
172853Speter *
182853Speter *
192853Speter * pxp - Pascal execution profiler
202853Speter *
212853Speter * Bill Joy UCB
222853Speter * Version 1.2 January 1979
232853Speter */
242853Speter
2512391Speter #include "whoami.h"
262853Speter #include "0.h"
272853Speter #include "yy.h"
282853Speter
292853Speter #ifdef PXP
302853Speter extern int yyline;
312853Speter extern char errout;
322853Speter #endif
332853Speter
343050Smckusic char errpfx = 'E';
352853Speter extern int yyline;
362853Speter /*
372853Speter * Panic is called when impossible
382853Speter * (supposedly, anyways) situations
392853Speter * are encountered.
402853Speter #ifdef PI
412853Speter * Panic messages should be short
422853Speter * as they do not go to the message
432853Speter * file.
442853Speter #endif
452853Speter */
panic(s)462853Speter panic(s)
472853Speter char *s;
482853Speter {
492853Speter
502853Speter #ifdef DEBUG
512853Speter fprintf(stderr, "Snark (%s) line=%d yyline=%d\n", s, line, yyline);
522853Speter #endif
532853Speter #ifdef PXP
542853Speter Perror( "Snark in pxp", s);
552853Speter #endif
562853Speter #ifdef PI
572853Speter Perror( "Snark in pi", s);
582853Speter #endif
592853Speter pexit(DIED);
602853Speter }
612853Speter
622853Speter extern char *errfile;
632853Speter /*
642853Speter * Error is called for
652853Speter * semantic errors and
662853Speter * prints the error and
672853Speter * a line number.
682853Speter */
error(a1,a2,a3,a4)692853Speter error(a1, a2, a3, a4)
702853Speter {
712853Speter #ifdef PI
722853Speter char buf[256];
732853Speter register int i;
742853Speter #endif
752853Speter #ifdef PXP
762853Speter /*
772853Speter int ofout;
782853Speter */
792853Speter #endif
802853Speter
812913Speter if (errpfx == 'w' && opt('w') != 0) {
822913Speter errpfx == 'E';
832853Speter return;
842913Speter }
852853Speter #ifdef PXP
862853Speter /*
872853Speter flush();
882853Speter ofout = fout[0];
892853Speter fout[0] = errout;
902853Speter */
912853Speter #endif
922853Speter #ifdef PI
932853Speter Enocascade = 0;
942853Speter geterr(a1, buf);
952853Speter a1 = buf;
962853Speter #endif
972853Speter if (line < 0)
982853Speter line = -line;
992853Speter yySsync();
1002853Speter yysetfile(filename);
1012853Speter #ifdef PI
1022853Speter if (errpfx == ' ') {
1032853Speter printf(" ");
10432761Sbostic for (i = line; i >= 10; i /= 10)
1052853Speter putchar(' ');
1062853Speter printf("... ");
1072853Speter } else if (Enoline)
1082853Speter printf(" %c - ", errpfx);
1092853Speter else
1102853Speter #endif
1112853Speter fprintf(stderr, "%c %d - ", errpfx, line);
1122853Speter fprintf(stderr, a1, a2, a3, a4);
1132853Speter if (errpfx == 'E')
1142853Speter #ifdef PI
1152853Speter eflg++, cgenflg++;
1162853Speter #endif
1172853Speter #ifdef PXP
1182853Speter eflg++;
1192853Speter #endif
1202853Speter errpfx = 'E';
1212853Speter #ifdef PI
1222853Speter if (Eholdnl)
1232853Speter Eholdnl = 0;
1242853Speter else
1252853Speter #endif
1262853Speter putc('\n', stderr);
1272853Speter #ifdef PXP
1282853Speter /*
1292853Speter flush();
1302853Speter fout[0] = ofout;
1312853Speter */
1322853Speter #endif
1332853Speter }
1342853Speter
1352853Speter #ifdef PI
cerror(a1,a2,a3,a4)1362853Speter cerror(a1, a2, a3, a4)
1372853Speter {
1382853Speter
1392853Speter if (Enocascade)
1402853Speter return;
1412853Speter setpfx(' ');
1422853Speter error(a1, a2, a3, a4);
1432853Speter }
1442853Speter #endif
145