11648Smckusick /* Copyright (c) 1979 Regents of the University of California */ 21648Smckusick 3*2179Smckusic static char sccsid[] = "@(#)ERROR.c 1.2 01/16/81"; 41648Smckusick 5*2179Smckusic #include <stdio.h> 6*2179Smckusic #include <signal.h> 7*2179Smckusic #include "h00vars.h" 81648Smckusick #include "h01errs.h" 91648Smckusick 101648Smckusick /* 111648Smckusick * Routine ERROR is called from the runtime library when a runtime error 121648Smckusick * occurs. Its arguments are the internal number of the error which occurred, 131648Smckusick * and an error specific piece of error data. The error file is constructed 141648Smckusick * from errdata by the makefile using the editor script make.ed1. 151648Smckusick */ 161648Smckusick ERROR(errnum, errdata) 171648Smckusick 181648Smckusick long errnum; 191648Smckusick union cvt { 201648Smckusick long longdat; 211648Smckusick char *strngdat; 221648Smckusick double dbldat; 231648Smckusick } errdata; 241648Smckusick { 251648Smckusick PFLUSH(); 26*2179Smckusic if (_entry[errnum].entryaddr != 0) { 27*2179Smckusic (*_entry[errnum].entryaddr)(errdata); 28*2179Smckusic return; 29*2179Smckusic } 301648Smckusick fputc('\n',stderr); 311648Smckusick SETRACE(); 321648Smckusick switch (errnum) { 331648Smckusick case ECHR: 341648Smckusick fprintf(stderr, "Argument to chr of %d is out of range\n" 351648Smckusick ,errdata.longdat); 361648Smckusick return(errdata.longdat); 371648Smckusick case EHALT: 381648Smckusick fputs("Call to procedure halt\n",stderr); 391648Smckusick PCEXIT(0); 401648Smckusick case ENILPTR: 411648Smckusick fputs("Pointer value out of legal range\n",stderr); 421648Smckusick return(0); 431648Smckusick case EPASTEOF: 441648Smckusick fprintf(stderr,"%s: Tried to read past end of file\n" 451648Smckusick ,errdata.strngdat); 461648Smckusick return(0); 471648Smckusick case EREADIT: 481648Smckusick fprintf(stderr,"%s: Attempt to read, but open for writing\n" 491648Smckusick ,errdata.strngdat); 501648Smckusick return(0); 511648Smckusick case EWRITEIT: 521648Smckusick fprintf(stderr,"%s: Attempt to write, but open for reading\n" 531648Smckusick ,errdata.strngdat); 541648Smckusick return(0); 551648Smckusick case ECLOSE: 561648Smckusick fprintf(stderr,"%s: Close failed\n",errdata.strngdat); 571648Smckusick return(0); 581648Smckusick case ELLIMIT: 591648Smckusick fprintf(stderr,"%s: Line limit exceeded\n",errdata.strngdat); 601648Smckusick return(0); 611648Smckusick case ESQRT: 621648Smckusick fprintf(stderr,"Negative argument of %E to sqrt\n" 631648Smckusick ,errdata.dbldat); 641648Smckusick return(errdata.dbldat); 651648Smckusick case EREFINAF: 661648Smckusick fprintf(stderr,"%s: ",errdata.strngdat); 671648Smckusick case ENOFILE: 681648Smckusick fputs("Reference to an inactive file\n",stderr); 691648Smckusick return(0); 701648Smckusick case EWRITE: 711648Smckusick fputs("Could not write to ",stderr); 721648Smckusick perror(errdata.strngdat); 731648Smckusick return(0); 741648Smckusick case EOPEN: 751648Smckusick fputs("Could not open ",stderr); 761648Smckusick perror(errdata.strngdat); 771648Smckusick return(0); 781648Smckusick case ECREATE: 791648Smckusick fputs("Could not create ",stderr); 801648Smckusick perror(errdata.strngdat); 811648Smckusick return(0); 821648Smckusick case EREMOVE: 831648Smckusick fputs("Could not remove ",stderr); 841648Smckusick perror(errdata.strngdat); 851648Smckusick return(0); 861648Smckusick case ESEEK: 871648Smckusick fputs("Could not reset ",stderr); 881648Smckusick perror(errdata.strngdat); 891648Smckusick return(0); 901648Smckusick case ENAMESIZE: 911648Smckusick fprintf(stderr,"%s: File name too long\n",errdata.strngdat); 921648Smckusick return(0); 931648Smckusick case ELN: 941648Smckusick fprintf(stderr,"Non-positive argument of %E to ln\n" 951648Smckusick ,errdata.dbldat); 961648Smckusick return(errdata.dbldat); 971648Smckusick case EBADINUM: 981648Smckusick fprintf(stderr,"%s: Bad data found on integer read\n" 991648Smckusick ,errdata.strngdat); 1001648Smckusick return(0); 1011648Smckusick case EBADFNUM: 1021648Smckusick fprintf(stderr,"%s: Bad data found on real read\n" 1031648Smckusick ,errdata.strngdat); 1041648Smckusick return(0); 1051648Smckusick case ENUMNTFD: 1061648Smckusick fprintf(stderr, 1071648Smckusick "Unknown name \"%s\" found on enumerated type read\n", 1081648Smckusick errdata.strngdat); 1091648Smckusick return(0); 1101648Smckusick case ENAMRNG: 1111648Smckusick fprintf(stderr, 1121648Smckusick "Enumerated type value of %d is out of range on output\n", 1131648Smckusick errdata.longdat); 1141648Smckusick return(errdata.longdat); 1151648Smckusick case EFMTSIZE: 1161648Smckusick fprintf(stderr,"Negative format width: %d\n",errdata.longdat); 1171648Smckusick return(0); 1181648Smckusick case EGOTO: 1191648Smckusick fputs("Active frame not found in non-local goto\n", stderr); 1201648Smckusick return(0); 1211648Smckusick case ECASE: 1221648Smckusick fprintf(stderr,"Label of %d not found in case\n" 1231648Smckusick ,errdata.longdat); 1241648Smckusick return(errdata.longdat); 1251648Smckusick case EOUTOFMEM: 1261648Smckusick fputs("Ran out of memory\n",stderr); 1271648Smckusick return(0); 1281648Smckusick case ECTLWR: 1291648Smckusick fprintf(stderr, "Range lower bound of %d out of set bounds\n", 1301648Smckusick errdata.longdat); 1311648Smckusick return(0); 1321648Smckusick case ECTUPR: 1331648Smckusick fprintf(stderr, "Range upper bound of %d out of set bounds\n", 1341648Smckusick errdata.longdat); 1351648Smckusick return(0); 1361648Smckusick case ECTSNG: 1371648Smckusick fprintf(stderr, "Value of %d out of set bounds\n", 1381648Smckusick errdata.longdat); 1391648Smckusick return(0); 1401648Smckusick case ENARGS: 1411648Smckusick if (errdata.longdat < 0) 1421648Smckusick fprintf(stderr, 1431648Smckusick "There were %d too few arguments to formal routine\n", 1441648Smckusick -errdata.longdat); 1451648Smckusick else 1461648Smckusick fprintf(stderr, 1471648Smckusick "There were %d too many arguments to formal routine\n", 1481648Smckusick errdata.longdat); 1491648Smckusick return(0); 1501648Smckusick case EARGV: 1511648Smckusick fprintf(stderr,"Argument to argv of %d is out of range\n" 1521648Smckusick ,errdata.longdat); 1531648Smckusick return(errdata.longdat); 1541648Smckusick case EPACK: 1551648Smckusick fprintf(stderr,"i = %d: Bad i to pack(a,i,z)\n" 1561648Smckusick ,errdata.longdat); 1571648Smckusick return(errdata.longdat); 1581648Smckusick case EUNPACK: 1591648Smckusick fprintf(stderr,"i = %d: Bad i to unpack(z,a,i)\n" 1601648Smckusick ,errdata.longdat); 1611648Smckusick return(errdata.longdat); 1621648Smckusick case ERANGE: 1631648Smckusick fprintf(stderr,"Value of %d is out of range\n",errdata.longdat); 1641648Smckusick return(errdata.longdat); 1651648Smckusick case ESUBSC: 1661648Smckusick fprintf(stderr,"Subscript value of %d is out of range\n" 1671648Smckusick ,errdata.longdat); 1681648Smckusick return(errdata.longdat); 1691648Smckusick case EASRT: 1701648Smckusick fprintf(stderr,"Assertion failed: %s\n",errdata.strngdat); 1711648Smckusick return(0); 1721648Smckusick case ESTLIM: 1731648Smckusick fprintf(stderr, 1741648Smckusick "Statement count limit exceeded, %d statements executed\n", 1751648Smckusick errdata.longdat); 1761648Smckusick return(errdata.longdat); 1771648Smckusick default: 1781648Smckusick fputs("Panic: unknown error\n",stderr); 1791648Smckusick return(0); 1801648Smckusick } 1811648Smckusick } 182