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