| 1 | /* Copyright (c) 1979 Regents of the University of California */ |
| 2 | |
| 3 | static char sccsid[] = "@(#)ERROR.c 1.1 %G%"; |
| 4 | |
| 5 | #include "stdio.h" |
| 6 | #include "signal.h" |
| 7 | #include "h01errs.h" |
| 8 | |
| 9 | /* |
| 10 | * Routine ERROR is called from the runtime library when a runtime error |
| 11 | * occurs. Its arguments are the internal number of the error which occurred, |
| 12 | * and an error specific piece of error data. The error file is constructed |
| 13 | * from errdata by the makefile using the editor script make.ed1. |
| 14 | */ |
| 15 | ERROR(errnum, errdata) |
| 16 | |
| 17 | long errnum; |
| 18 | union cvt { |
| 19 | long longdat; |
| 20 | char *strngdat; |
| 21 | double dbldat; |
| 22 | } errdata; |
| 23 | { |
| 24 | PFLUSH(); |
| 25 | fputc('\n',stderr); |
| 26 | SETRACE(); |
| 27 | switch (errnum) { |
| 28 | case ECHR: |
| 29 | fprintf(stderr, "Argument to chr of %d is out of range\n" |
| 30 | ,errdata.longdat); |
| 31 | return(errdata.longdat); |
| 32 | case EHALT: |
| 33 | fputs("Call to procedure halt\n",stderr); |
| 34 | PCEXIT(0); |
| 35 | case ENILPTR: |
| 36 | fputs("Pointer value out of legal range\n",stderr); |
| 37 | return(0); |
| 38 | case EPASTEOF: |
| 39 | fprintf(stderr,"%s: Tried to read past end of file\n" |
| 40 | ,errdata.strngdat); |
| 41 | return(0); |
| 42 | case EREADIT: |
| 43 | fprintf(stderr,"%s: Attempt to read, but open for writing\n" |
| 44 | ,errdata.strngdat); |
| 45 | return(0); |
| 46 | case EWRITEIT: |
| 47 | fprintf(stderr,"%s: Attempt to write, but open for reading\n" |
| 48 | ,errdata.strngdat); |
| 49 | return(0); |
| 50 | case ECLOSE: |
| 51 | fprintf(stderr,"%s: Close failed\n",errdata.strngdat); |
| 52 | return(0); |
| 53 | case ELLIMIT: |
| 54 | fprintf(stderr,"%s: Line limit exceeded\n",errdata.strngdat); |
| 55 | return(0); |
| 56 | case ESQRT: |
| 57 | fprintf(stderr,"Negative argument of %E to sqrt\n" |
| 58 | ,errdata.dbldat); |
| 59 | return(errdata.dbldat); |
| 60 | case EREFINAF: |
| 61 | fprintf(stderr,"%s: ",errdata.strngdat); |
| 62 | case ENOFILE: |
| 63 | fputs("Reference to an inactive file\n",stderr); |
| 64 | return(0); |
| 65 | case EWRITE: |
| 66 | fputs("Could not write to ",stderr); |
| 67 | perror(errdata.strngdat); |
| 68 | return(0); |
| 69 | case EOPEN: |
| 70 | fputs("Could not open ",stderr); |
| 71 | perror(errdata.strngdat); |
| 72 | return(0); |
| 73 | case ECREATE: |
| 74 | fputs("Could not create ",stderr); |
| 75 | perror(errdata.strngdat); |
| 76 | return(0); |
| 77 | case EREMOVE: |
| 78 | fputs("Could not remove ",stderr); |
| 79 | perror(errdata.strngdat); |
| 80 | return(0); |
| 81 | case ESEEK: |
| 82 | fputs("Could not reset ",stderr); |
| 83 | perror(errdata.strngdat); |
| 84 | return(0); |
| 85 | case ENAMESIZE: |
| 86 | fprintf(stderr,"%s: File name too long\n",errdata.strngdat); |
| 87 | return(0); |
| 88 | case ELN: |
| 89 | fprintf(stderr,"Non-positive argument of %E to ln\n" |
| 90 | ,errdata.dbldat); |
| 91 | return(errdata.dbldat); |
| 92 | case EBADINUM: |
| 93 | fprintf(stderr,"%s: Bad data found on integer read\n" |
| 94 | ,errdata.strngdat); |
| 95 | return(0); |
| 96 | case EBADFNUM: |
| 97 | fprintf(stderr,"%s: Bad data found on real read\n" |
| 98 | ,errdata.strngdat); |
| 99 | return(0); |
| 100 | case ENUMNTFD: |
| 101 | fprintf(stderr, |
| 102 | "Unknown name \"%s\" found on enumerated type read\n", |
| 103 | errdata.strngdat); |
| 104 | return(0); |
| 105 | case ENAMRNG: |
| 106 | fprintf(stderr, |
| 107 | "Enumerated type value of %d is out of range on output\n", |
| 108 | errdata.longdat); |
| 109 | return(errdata.longdat); |
| 110 | case EFMTSIZE: |
| 111 | fprintf(stderr,"Negative format width: %d\n",errdata.longdat); |
| 112 | return(0); |
| 113 | case EGOTO: |
| 114 | fputs("Active frame not found in non-local goto\n", stderr); |
| 115 | return(0); |
| 116 | case ECASE: |
| 117 | fprintf(stderr,"Label of %d not found in case\n" |
| 118 | ,errdata.longdat); |
| 119 | return(errdata.longdat); |
| 120 | case EOUTOFMEM: |
| 121 | fputs("Ran out of memory\n",stderr); |
| 122 | return(0); |
| 123 | case ECTLWR: |
| 124 | fprintf(stderr, "Range lower bound of %d out of set bounds\n", |
| 125 | errdata.longdat); |
| 126 | return(0); |
| 127 | case ECTUPR: |
| 128 | fprintf(stderr, "Range upper bound of %d out of set bounds\n", |
| 129 | errdata.longdat); |
| 130 | return(0); |
| 131 | case ECTSNG: |
| 132 | fprintf(stderr, "Value of %d out of set bounds\n", |
| 133 | errdata.longdat); |
| 134 | return(0); |
| 135 | case ENARGS: |
| 136 | if (errdata.longdat < 0) |
| 137 | fprintf(stderr, |
| 138 | "There were %d too few arguments to formal routine\n", |
| 139 | -errdata.longdat); |
| 140 | else |
| 141 | fprintf(stderr, |
| 142 | "There were %d too many arguments to formal routine\n", |
| 143 | errdata.longdat); |
| 144 | return(0); |
| 145 | case EARGV: |
| 146 | fprintf(stderr,"Argument to argv of %d is out of range\n" |
| 147 | ,errdata.longdat); |
| 148 | return(errdata.longdat); |
| 149 | case EPACK: |
| 150 | fprintf(stderr,"i = %d: Bad i to pack(a,i,z)\n" |
| 151 | ,errdata.longdat); |
| 152 | return(errdata.longdat); |
| 153 | case EUNPACK: |
| 154 | fprintf(stderr,"i = %d: Bad i to unpack(z,a,i)\n" |
| 155 | ,errdata.longdat); |
| 156 | return(errdata.longdat); |
| 157 | case ERANGE: |
| 158 | fprintf(stderr,"Value of %d is out of range\n",errdata.longdat); |
| 159 | return(errdata.longdat); |
| 160 | case ESUBSC: |
| 161 | fprintf(stderr,"Subscript value of %d is out of range\n" |
| 162 | ,errdata.longdat); |
| 163 | return(errdata.longdat); |
| 164 | case EASRT: |
| 165 | fprintf(stderr,"Assertion failed: %s\n",errdata.strngdat); |
| 166 | return(0); |
| 167 | case ESTLIM: |
| 168 | fprintf(stderr, |
| 169 | "Statement count limit exceeded, %d statements executed\n", |
| 170 | errdata.longdat); |
| 171 | return(errdata.longdat); |
| 172 | default: |
| 173 | fputs("Panic: unknown error\n",stderr); |
| 174 | return(0); |
| 175 | } |
| 176 | } |