11648Smckusick /* Copyright (c) 1979 Regents of the University of California */ 21648Smckusick 3*3002Smckusic static char sccsid[] = "@(#)ERROR.c 1.3 03/07/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 */ 16*3002Smckusic long 17*3002Smckusic ERROR(errnum, errordata) 181648Smckusick 19*3002Smckusic short errnum; 20*3002Smckusic double errordata; 21*3002Smckusic { 221648Smckusick union cvt { 231648Smckusick long longdat; 241648Smckusick char *strngdat; 251648Smckusick double dbldat; 261648Smckusick } errdata; 27*3002Smckusic 28*3002Smckusic errdata.dbldat = errordata; 291648Smckusick PFLUSH(); 302179Smckusic if (_entry[errnum].entryaddr != 0) { 312179Smckusic (*_entry[errnum].entryaddr)(errdata); 322179Smckusic return; 332179Smckusic } 341648Smckusick fputc('\n',stderr); 351648Smckusick SETRACE(); 361648Smckusick switch (errnum) { 371648Smckusick case ECHR: 38*3002Smckusic fprintf(stderr, "Argument to chr of %D is out of range\n" 391648Smckusick ,errdata.longdat); 401648Smckusick return(errdata.longdat); 411648Smckusick case EHALT: 421648Smckusick fputs("Call to procedure halt\n",stderr); 431648Smckusick PCEXIT(0); 441648Smckusick case ENILPTR: 451648Smckusick fputs("Pointer value out of legal range\n",stderr); 461648Smckusick return(0); 471648Smckusick case EPASTEOF: 481648Smckusick fprintf(stderr,"%s: Tried to read past end of file\n" 491648Smckusick ,errdata.strngdat); 501648Smckusick return(0); 511648Smckusick case EREADIT: 521648Smckusick fprintf(stderr,"%s: Attempt to read, but open for writing\n" 531648Smckusick ,errdata.strngdat); 541648Smckusick return(0); 551648Smckusick case EWRITEIT: 561648Smckusick fprintf(stderr,"%s: Attempt to write, but open for reading\n" 571648Smckusick ,errdata.strngdat); 581648Smckusick return(0); 591648Smckusick case ECLOSE: 601648Smckusick fprintf(stderr,"%s: Close failed\n",errdata.strngdat); 611648Smckusick return(0); 621648Smckusick case ELLIMIT: 631648Smckusick fprintf(stderr,"%s: Line limit exceeded\n",errdata.strngdat); 641648Smckusick return(0); 651648Smckusick case ESQRT: 66*3002Smckusic fprintf(stderr,"Negative argument of %e to sqrt\n" 671648Smckusick ,errdata.dbldat); 681648Smckusick return(errdata.dbldat); 691648Smckusick case EREFINAF: 701648Smckusick fprintf(stderr,"%s: ",errdata.strngdat); 711648Smckusick case ENOFILE: 721648Smckusick fputs("Reference to an inactive file\n",stderr); 731648Smckusick return(0); 741648Smckusick case EWRITE: 751648Smckusick fputs("Could not write to ",stderr); 761648Smckusick perror(errdata.strngdat); 771648Smckusick return(0); 781648Smckusick case EOPEN: 791648Smckusick fputs("Could not open ",stderr); 801648Smckusick perror(errdata.strngdat); 811648Smckusick return(0); 821648Smckusick case ECREATE: 831648Smckusick fputs("Could not create ",stderr); 841648Smckusick perror(errdata.strngdat); 851648Smckusick return(0); 861648Smckusick case EREMOVE: 871648Smckusick fputs("Could not remove ",stderr); 881648Smckusick perror(errdata.strngdat); 891648Smckusick return(0); 901648Smckusick case ESEEK: 911648Smckusick fputs("Could not reset ",stderr); 921648Smckusick perror(errdata.strngdat); 931648Smckusick return(0); 941648Smckusick case ENAMESIZE: 951648Smckusick fprintf(stderr,"%s: File name too long\n",errdata.strngdat); 961648Smckusick return(0); 971648Smckusick case ELN: 98*3002Smckusic fprintf(stderr,"Non-positive argument of %e to ln\n" 991648Smckusick ,errdata.dbldat); 1001648Smckusick return(errdata.dbldat); 1011648Smckusick case EBADINUM: 1021648Smckusick fprintf(stderr,"%s: Bad data found on integer read\n" 1031648Smckusick ,errdata.strngdat); 1041648Smckusick return(0); 1051648Smckusick case EBADFNUM: 1061648Smckusick fprintf(stderr,"%s: Bad data found on real read\n" 1071648Smckusick ,errdata.strngdat); 1081648Smckusick return(0); 1091648Smckusick case ENUMNTFD: 1101648Smckusick fprintf(stderr, 1111648Smckusick "Unknown name \"%s\" found on enumerated type read\n", 1121648Smckusick errdata.strngdat); 1131648Smckusick return(0); 1141648Smckusick case ENAMRNG: 1151648Smckusick fprintf(stderr, 116*3002Smckusic "Enumerated type value of %D is out of range on output\n", 1171648Smckusick errdata.longdat); 1181648Smckusick return(errdata.longdat); 1191648Smckusick case EFMTSIZE: 120*3002Smckusic fprintf(stderr,"Negative format width: %D\n",errdata.longdat); 1211648Smckusick return(0); 1221648Smckusick case EGOTO: 1231648Smckusick fputs("Active frame not found in non-local goto\n", stderr); 1241648Smckusick return(0); 1251648Smckusick case ECASE: 126*3002Smckusic fprintf(stderr,"Label of %D not found in case\n" 1271648Smckusick ,errdata.longdat); 1281648Smckusick return(errdata.longdat); 1291648Smckusick case EOUTOFMEM: 1301648Smckusick fputs("Ran out of memory\n",stderr); 1311648Smckusick return(0); 1321648Smckusick case ECTLWR: 133*3002Smckusic fprintf(stderr, "Range lower bound of %D out of set bounds\n", 1341648Smckusick errdata.longdat); 1351648Smckusick return(0); 1361648Smckusick case ECTUPR: 137*3002Smckusic fprintf(stderr, "Range upper bound of %D out of set bounds\n", 1381648Smckusick errdata.longdat); 1391648Smckusick return(0); 1401648Smckusick case ECTSNG: 141*3002Smckusic fprintf(stderr, "Value of %D out of set bounds\n", 1421648Smckusick errdata.longdat); 1431648Smckusick return(0); 1441648Smckusick case ENARGS: 1451648Smckusick if (errdata.longdat < 0) 1461648Smckusick fprintf(stderr, 147*3002Smckusic "There were %D too few arguments to formal routine\n", 1481648Smckusick -errdata.longdat); 1491648Smckusick else 1501648Smckusick fprintf(stderr, 151*3002Smckusic "There were %D too many arguments to formal routine\n", 1521648Smckusick errdata.longdat); 1531648Smckusick return(0); 1541648Smckusick case EARGV: 155*3002Smckusic fprintf(stderr,"Argument to argv of %D is out of range\n" 1561648Smckusick ,errdata.longdat); 1571648Smckusick return(errdata.longdat); 1581648Smckusick case EPACK: 159*3002Smckusic fprintf(stderr,"i = %D: Bad i to pack(a,i,z)\n" 1601648Smckusick ,errdata.longdat); 1611648Smckusick return(errdata.longdat); 1621648Smckusick case EUNPACK: 163*3002Smckusic fprintf(stderr,"i = %D: Bad i to unpack(z,a,i)\n" 1641648Smckusick ,errdata.longdat); 1651648Smckusick return(errdata.longdat); 1661648Smckusick case ERANGE: 167*3002Smckusic fprintf(stderr,"Value of %D is out of range\n",errdata.longdat); 1681648Smckusick return(errdata.longdat); 1691648Smckusick case ESUBSC: 170*3002Smckusic fprintf(stderr,"Subscript value of %D is out of range\n" 1711648Smckusick ,errdata.longdat); 1721648Smckusick return(errdata.longdat); 1731648Smckusick case EASRT: 1741648Smckusick fprintf(stderr,"Assertion failed: %s\n",errdata.strngdat); 1751648Smckusick return(0); 1761648Smckusick case ESTLIM: 1771648Smckusick fprintf(stderr, 178*3002Smckusic "Statement count limit exceeded, %D statements executed\n", 1791648Smckusick errdata.longdat); 1801648Smckusick return(errdata.longdat); 1811648Smckusick default: 1821648Smckusick fputs("Panic: unknown error\n",stderr); 1831648Smckusick return(0); 1841648Smckusick } 1851648Smckusick } 186