Commit | Line | Data |
---|---|---|
6516b261 CH |
1 | #include "stdio.h" |
2 | #include "signal.h" | |
3 | #include "h00vars.h" | |
4 | #include "h01errs.h" | |
5 | ||
6 | /* | |
7 | * Routine error is called from the interpreter when a runtime error occurs. | |
8 | * Its argument is the internal number of the error which occurred. | |
9 | * See Edata, Emake etc. | |
10 | */ | |
11 | error(errnum) | |
12 | long errnum; | |
13 | { | |
14 | register long i; | |
15 | extern long errno; | |
16 | ||
17 | signal(SIGINT,SIG_IGN); | |
18 | signal(SIGSEGV,SIG_DFL); | |
19 | signal(SIGFPE,SIG_DFL); | |
20 | i = errno; | |
21 | pflush(); | |
22 | errno = i; | |
23 | fputs("\n\n",stderr); | |
24 | switch (errnum) { | |
25 | case EINTR: | |
26 | break; | |
27 | case ECHR: | |
28 | fputs("Argument to chr out of range\n",stderr); | |
29 | break; | |
30 | case EASSIGN: | |
31 | fputs("Overflow during assignment conversion\n",stderr); | |
32 | break; | |
33 | case EFIXADD: | |
34 | fputs("Overflow in fixed point addition\n",stderr); | |
35 | break; | |
36 | case EFLTADD: | |
37 | fputs("Floating point addition out of range\n",stderr); | |
38 | break; | |
39 | case EFIXSUB: | |
40 | fputs("Overflow in fixed point subtraction\n",stderr); | |
41 | break; | |
42 | case EFLTSUB: | |
43 | fputs("Floating point subtraction out of range\n",stderr); | |
44 | break; | |
45 | case EFIXMUL: | |
46 | fputs("Overflow in fixed point multiplication\n",stderr); | |
47 | break; | |
48 | case EFLTMUL: | |
49 | fputs("Floating point multiplication out of range\n",stderr); | |
50 | break; | |
51 | case EFIXDIV: | |
52 | fputs("Fixed point division by zero\n",stderr); | |
53 | break; | |
54 | case EFLTDIV: | |
55 | fputs("Floating point division error\n",stderr); | |
56 | break; | |
57 | case EMODDIV: | |
58 | fputs("Fixed point modulo by zero\n",stderr); | |
59 | break; | |
60 | case EFIXNEG: | |
61 | fputs("Overflow in fixed point negation\n",stderr); | |
62 | break; | |
63 | case ESYSTEM: | |
64 | fputs("Panic: Computational error in interpreter\n",stderr); | |
65 | break; | |
66 | case EBUILTIN: | |
67 | fputs("Overflow in builtin function\n",stderr); | |
68 | break; | |
69 | case EHALT: | |
70 | /* | |
71 | nodump = 0; | |
72 | */ | |
73 | fputs("Call to procedure halt\n",stderr); | |
74 | break; | |
75 | case ENILPTR: | |
76 | fputs("Reference through a nil pointer\n",stderr); | |
77 | break; | |
78 | case EPASTEOF: | |
79 | fprintf(stderr,"%s: Tried to read past end of file\n",file); | |
80 | break; | |
81 | case EREADIT: | |
82 | fprintf(stderr,"%s: Attempt to read, but open for writing\n",file); | |
83 | break; | |
84 | case EWRITEIT: | |
85 | fprintf(stderr,"%s: Attempt to write, but open for reading\n",file); | |
86 | break; | |
87 | case ECLOSE: | |
88 | fprintf(stderr,"%s: Close failed\n",file); | |
89 | break; | |
90 | case ELLIMIT: | |
91 | fprintf(stderr,"%s: Line limit exceeded\n",file); | |
92 | break; | |
93 | case ESQRT: | |
94 | fputs("Negative argument to sqrt\n",stderr); | |
95 | break; | |
96 | case ESTKNEMP: | |
97 | fputs("Panic: stack not empty between statements\n",stderr); | |
98 | break; | |
99 | case ESUBSCR: | |
100 | fputs("Subscript out of range\n",stderr); | |
101 | break; | |
102 | case EREFINAF: | |
103 | fputs("Reference to an inactive file\n",stderr); | |
104 | break; | |
105 | case EWRITE: | |
106 | fputs("Could not write to ",stderr); | |
107 | perror(file); | |
108 | break; | |
109 | case EOPEN: | |
110 | fputs("Could not open ",stderr); | |
111 | perror(file); | |
112 | break; | |
113 | case ECREATE: | |
114 | fputs("Could not create ",stderr); | |
115 | perror(file); | |
116 | break; | |
117 | case EREMOVE: | |
118 | fputs("Could not remove ",stderr); | |
119 | perror(file); | |
120 | break; | |
121 | case ESEEK: | |
122 | fputs("Could not reset ",stderr); | |
123 | perror(file); | |
124 | break; | |
125 | case ENAMESIZE: | |
126 | fputs("File name too long\n",stderr); | |
127 | break; | |
128 | case ELN: | |
129 | fputs("Non-positive argument to ln\n",stderr); | |
130 | break; | |
131 | case EBADOP: | |
132 | fputs("Panic: bad op code\n",stderr); | |
133 | break; | |
134 | case EBADINUM: | |
135 | fputs("Bad data found on integer read\n",stderr); | |
136 | break; | |
137 | case EBADFNUM: | |
138 | fputs("Bad data found on real read\n",stderr); | |
139 | break; | |
140 | case EGOTO: | |
141 | fputs("Panic: active frame not found in goto\n",stderr); | |
142 | break; | |
143 | case ECASE: | |
144 | fputs("Label not found in case\n",stderr); | |
145 | break; | |
146 | case EOUTOFMEM: | |
147 | fputs("Ran out of memory\n",stderr); | |
148 | break; | |
149 | case ETRASHHEAP: | |
150 | fputs("Attempt to dispose of previously deallocated memory\n",stderr); | |
151 | break; | |
152 | case ECTTOT: | |
153 | fputs("Constructed set argument exceeds set bounds\n",stderr); | |
154 | break; | |
155 | case EARGV: | |
156 | fputs("Argument to argv out of range\n",stderr); | |
157 | break; | |
158 | case EPACK: | |
159 | fputs("Bad i to pack(a,i,z)\n",stderr); | |
160 | break; | |
161 | case EUNPACK: | |
162 | fputs("Bad i to unpack(z,a,i)\n",stderr); | |
163 | break; | |
164 | case ERANGE: | |
165 | fputs("Value out of range\n",stderr); | |
166 | break; | |
167 | case EASRT: | |
168 | fputs("Assertion failed\n",stderr); | |
169 | break; | |
170 | case ESTLIM: | |
171 | fputs("Statement count limit exceeded\n",stderr); | |
172 | break; | |
173 | case ESTKOVFLO: | |
174 | fputs("Runtime stack overflow\n",stderr); | |
175 | break; | |
176 | case EFRAMESIZE: | |
177 | fputs("Compiler restricts declarations to 32768 bytes per block\n",stderr); | |
178 | break; | |
179 | default: | |
180 | fputs("Panic: unknown error\n",stderr); | |
181 | } | |
182 | if (nodump == 0) | |
183 | backtrace(errnum); | |
184 | psexit(errnum); | |
185 | } |