11648Smckusick /* Copyright (c) 1979 Regents of the University of California */ 21648Smckusick 3*3178Smckusic static char sccsid[] = "@(#)ERROR.c 1.5 03/10/81"; 41648Smckusick 52179Smckusic #include <stdio.h> 62179Smckusic #include <signal.h> 72179Smckusic #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 */ 163002Smckusic long 173070Smckusic ERROR(errnum, errdata) 181648Smckusick 193070Smckusic int errnum; 201648Smckusick union cvt { 211648Smckusick long longdat; 221648Smckusick char *strngdat; 231648Smckusick double dbldat; 241648Smckusick } errdata; 253070Smckusic { 261648Smckusick PFLUSH(); 272179Smckusic if (_entry[errnum].entryaddr != 0) { 282179Smckusic (*_entry[errnum].entryaddr)(errdata); 292179Smckusic return; 302179Smckusic } 311648Smckusick fputc('\n',stderr); 321648Smckusick SETRACE(); 331648Smckusick switch (errnum) { 341648Smckusick case ECHR: 353002Smckusic fprintf(stderr, "Argument to chr of %D is out of range\n" 361648Smckusick ,errdata.longdat); 371648Smckusick return(errdata.longdat); 381648Smckusick case EHALT: 391648Smckusick fputs("Call to procedure halt\n",stderr); 401648Smckusick PCEXIT(0); 411648Smckusick case ENILPTR: 421648Smckusick fputs("Pointer value out of legal range\n",stderr); 431648Smckusick return(0); 441648Smckusick case EPASTEOF: 451648Smckusick fprintf(stderr,"%s: Tried to read past end of file\n" 461648Smckusick ,errdata.strngdat); 471648Smckusick return(0); 481648Smckusick case EREADIT: 491648Smckusick fprintf(stderr,"%s: Attempt to read, but open for writing\n" 501648Smckusick ,errdata.strngdat); 511648Smckusick return(0); 521648Smckusick case EWRITEIT: 531648Smckusick fprintf(stderr,"%s: Attempt to write, but open for reading\n" 541648Smckusick ,errdata.strngdat); 551648Smckusick return(0); 561648Smckusick case ECLOSE: 571648Smckusick fprintf(stderr,"%s: Close failed\n",errdata.strngdat); 581648Smckusick return(0); 591648Smckusick case ELLIMIT: 601648Smckusick fprintf(stderr,"%s: Line limit exceeded\n",errdata.strngdat); 611648Smckusick return(0); 621648Smckusick case ESQRT: 633002Smckusic fprintf(stderr,"Negative argument of %e to sqrt\n" 641648Smckusick ,errdata.dbldat); 651648Smckusick return(errdata.dbldat); 661648Smckusick case EREFINAF: 671648Smckusick fprintf(stderr,"%s: ",errdata.strngdat); 681648Smckusick case ENOFILE: 691648Smckusick fputs("Reference to an inactive file\n",stderr); 701648Smckusick return(0); 711648Smckusick case EWRITE: 721648Smckusick fputs("Could not write to ",stderr); 731648Smckusick perror(errdata.strngdat); 741648Smckusick return(0); 751648Smckusick case EOPEN: 761648Smckusick fputs("Could not open ",stderr); 771648Smckusick perror(errdata.strngdat); 781648Smckusick return(0); 791648Smckusick case ECREATE: 801648Smckusick fputs("Could not create ",stderr); 811648Smckusick perror(errdata.strngdat); 821648Smckusick return(0); 831648Smckusick case EREMOVE: 841648Smckusick fputs("Could not remove ",stderr); 851648Smckusick perror(errdata.strngdat); 861648Smckusick return(0); 871648Smckusick case ESEEK: 881648Smckusick fputs("Could not reset ",stderr); 891648Smckusick perror(errdata.strngdat); 901648Smckusick return(0); 911648Smckusick case ENAMESIZE: 921648Smckusick fprintf(stderr,"%s: File name too long\n",errdata.strngdat); 931648Smckusick return(0); 941648Smckusick case ELN: 953002Smckusic fprintf(stderr,"Non-positive argument of %e to ln\n" 961648Smckusick ,errdata.dbldat); 971648Smckusick return(errdata.dbldat); 981648Smckusick case EBADINUM: 991648Smckusick fprintf(stderr,"%s: Bad data found on integer read\n" 1001648Smckusick ,errdata.strngdat); 1011648Smckusick return(0); 1021648Smckusick case EBADFNUM: 1031648Smckusick fprintf(stderr,"%s: Bad data found on real read\n" 1041648Smckusick ,errdata.strngdat); 1051648Smckusick return(0); 1061648Smckusick case ENUMNTFD: 1071648Smckusick fprintf(stderr, 1081648Smckusick "Unknown name \"%s\" found on enumerated type read\n", 1091648Smckusick errdata.strngdat); 1101648Smckusick return(0); 1111648Smckusick case ENAMRNG: 1121648Smckusick fprintf(stderr, 1133002Smckusic "Enumerated type value of %D is out of range on output\n", 1141648Smckusick errdata.longdat); 1151648Smckusick return(errdata.longdat); 1161648Smckusick case EFMTSIZE: 117*3178Smckusic fprintf(stderr,"Non-positive format width: %D\n",errdata.longdat); 1181648Smckusick return(0); 1191648Smckusick case EGOTO: 1201648Smckusick fputs("Active frame not found in non-local goto\n", stderr); 1211648Smckusick return(0); 1221648Smckusick case ECASE: 1233002Smckusic fprintf(stderr,"Label of %D not found in case\n" 1241648Smckusick ,errdata.longdat); 1251648Smckusick return(errdata.longdat); 1261648Smckusick case EOUTOFMEM: 1271648Smckusick fputs("Ran out of memory\n",stderr); 1281648Smckusick return(0); 1291648Smckusick case ECTLWR: 1303002Smckusic fprintf(stderr, "Range lower bound of %D out of set bounds\n", 1311648Smckusick errdata.longdat); 1321648Smckusick return(0); 1331648Smckusick case ECTUPR: 1343002Smckusic fprintf(stderr, "Range upper bound of %D out of set bounds\n", 1351648Smckusick errdata.longdat); 1361648Smckusick return(0); 1371648Smckusick case ECTSNG: 1383002Smckusic fprintf(stderr, "Value of %D out of set bounds\n", 1391648Smckusick errdata.longdat); 1401648Smckusick return(0); 1411648Smckusick case ENARGS: 1421648Smckusick if (errdata.longdat < 0) 1431648Smckusick fprintf(stderr, 1443002Smckusic "There were %D too few arguments to formal routine\n", 1451648Smckusick -errdata.longdat); 1461648Smckusick else 1471648Smckusick fprintf(stderr, 1483002Smckusic "There were %D too many arguments to formal routine\n", 1491648Smckusick errdata.longdat); 1501648Smckusick return(0); 1511648Smckusick case EARGV: 1523002Smckusic fprintf(stderr,"Argument to argv of %D is out of range\n" 1531648Smckusick ,errdata.longdat); 1541648Smckusick return(errdata.longdat); 1551648Smckusick case EPACK: 1563002Smckusic fprintf(stderr,"i = %D: Bad i to pack(a,i,z)\n" 1571648Smckusick ,errdata.longdat); 1581648Smckusick return(errdata.longdat); 1591648Smckusick case EUNPACK: 1603002Smckusic fprintf(stderr,"i = %D: Bad i to unpack(z,a,i)\n" 1611648Smckusick ,errdata.longdat); 1621648Smckusick return(errdata.longdat); 1631648Smckusick case ERANGE: 1643002Smckusic fprintf(stderr,"Value of %D is out of range\n",errdata.longdat); 1651648Smckusick return(errdata.longdat); 1661648Smckusick case ESUBSC: 1673002Smckusic fprintf(stderr,"Subscript value of %D is out of range\n" 1681648Smckusick ,errdata.longdat); 1691648Smckusick return(errdata.longdat); 1701648Smckusick case EASRT: 1711648Smckusick fprintf(stderr,"Assertion failed: %s\n",errdata.strngdat); 1721648Smckusick return(0); 1731648Smckusick case ESTLIM: 1741648Smckusick fprintf(stderr, 1753002Smckusic "Statement count limit exceeded, %D statements executed\n", 1761648Smckusick errdata.longdat); 1771648Smckusick return(errdata.longdat); 1781648Smckusick default: 1791648Smckusick fputs("Panic: unknown error\n",stderr); 1801648Smckusick return(0); 1811648Smckusick } 1821648Smckusick } 183