1*48112Sbostic /*- 2*48112Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48112Sbostic * All rights reserved. 4*48112Sbostic * 5*48112Sbostic * %sccs.include.redist.c% 622227Sdist */ 722227Sdist 822227Sdist #ifndef lint 9*48112Sbostic static char sccsid[] = "@(#)error.c 5.3 (Berkeley) 04/16/91"; 10*48112Sbostic #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 */ 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 */ 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 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