+#include "stdio.h"
+#include "signal.h"
+#include "h00vars.h"
+#include "h01errs.h"
+
+/*
+ * Routine error is called from the interpreter when a runtime error occurs.
+ * Its argument is the internal number of the error which occurred.
+ * See Edata, Emake etc.
+ */
+error(errnum)
+long errnum;
+{
+register long i;
+extern long errno;
+
+signal(SIGINT,SIG_IGN);
+signal(SIGSEGV,SIG_DFL);
+signal(SIGFPE,SIG_DFL);
+i = errno;
+pflush();
+errno = i;
+fputs("\n\n",stderr);
+switch (errnum) {
+ case EINTR:
+ break;
+ case ECHR:
+ fputs("Argument to chr out of range\n",stderr);
+ break;
+ case EASSIGN:
+ fputs("Overflow during assignment conversion\n",stderr);
+ break;
+ case EFIXADD:
+ fputs("Overflow in fixed point addition\n",stderr);
+ break;
+ case EFLTADD:
+ fputs("Floating point addition out of range\n",stderr);
+ break;
+ case EFIXSUB:
+ fputs("Overflow in fixed point subtraction\n",stderr);
+ break;
+ case EFLTSUB:
+ fputs("Floating point subtraction out of range\n",stderr);
+ break;
+ case EFIXMUL:
+ fputs("Overflow in fixed point multiplication\n",stderr);
+ break;
+ case EFLTMUL:
+ fputs("Floating point multiplication out of range\n",stderr);
+ break;
+ case EFIXDIV:
+ fputs("Fixed point division by zero\n",stderr);
+ break;
+ case EFLTDIV:
+ fputs("Floating point division error\n",stderr);
+ break;
+ case EMODDIV:
+ fputs("Fixed point modulo by zero\n",stderr);
+ break;
+ case EFIXNEG:
+ fputs("Overflow in fixed point negation\n",stderr);
+ break;
+ case ESYSTEM:
+ fputs("Panic: Computational error in interpreter\n",stderr);
+ break;
+ case EBUILTIN:
+ fputs("Overflow in builtin function\n",stderr);
+ break;
+ case EHALT:
+/*
+ nodump = 0;
+*/
+ fputs("Call to procedure halt\n",stderr);
+ break;
+ case ENILPTR:
+ fputs("Reference through a nil pointer\n",stderr);
+ break;
+ case EPASTEOF:
+ fprintf(stderr,"%s: Tried to read past end of file\n",file);
+ break;
+ case EREADIT:
+ fprintf(stderr,"%s: Attempt to read, but open for writing\n",file);
+ break;
+ case EWRITEIT:
+ fprintf(stderr,"%s: Attempt to write, but open for reading\n",file);
+ break;
+ case ECLOSE:
+ fprintf(stderr,"%s: Close failed\n",file);
+ break;
+ case ELLIMIT:
+ fprintf(stderr,"%s: Line limit exceeded\n",file);
+ break;
+ case ESQRT:
+ fputs("Negative argument to sqrt\n",stderr);
+ break;
+ case ESTKNEMP:
+ fputs("Panic: stack not empty between statements\n",stderr);
+ break;
+ case ESUBSCR:
+ fputs("Subscript out of range\n",stderr);
+ break;
+ case EREFINAF:
+ fputs("Reference to an inactive file\n",stderr);
+ break;
+ case EWRITE:
+ fputs("Could not write to ",stderr);
+ perror(file);
+ break;
+ case EOPEN:
+ fputs("Could not open ",stderr);
+ perror(file);
+ break;
+ case ECREATE:
+ fputs("Could not create ",stderr);
+ perror(file);
+ break;
+ case EREMOVE:
+ fputs("Could not remove ",stderr);
+ perror(file);
+ break;
+ case ESEEK:
+ fputs("Could not reset ",stderr);
+ perror(file);
+ break;
+ case ENAMESIZE:
+ fputs("File name too long\n",stderr);
+ break;
+ case ELN:
+ fputs("Non-positive argument to ln\n",stderr);
+ break;
+ case EBADOP:
+ fputs("Panic: bad op code\n",stderr);
+ break;
+ case EBADINUM:
+ fputs("Bad data found on integer read\n",stderr);
+ break;
+ case EBADFNUM:
+ fputs("Bad data found on real read\n",stderr);
+ break;
+ case EGOTO:
+ fputs("Panic: active frame not found in goto\n",stderr);
+ break;
+ case ECASE:
+ fputs("Label not found in case\n",stderr);
+ break;
+ case EOUTOFMEM:
+ fputs("Ran out of memory\n",stderr);
+ break;
+ case ETRASHHEAP:
+ fputs("Attempt to dispose of previously deallocated memory\n",stderr);
+ break;
+ case ECTTOT:
+ fputs("Constructed set argument exceeds set bounds\n",stderr);
+ break;
+ case EARGV:
+ fputs("Argument to argv out of range\n",stderr);
+ break;
+ case EPACK:
+ fputs("Bad i to pack(a,i,z)\n",stderr);
+ break;
+ case EUNPACK:
+ fputs("Bad i to unpack(z,a,i)\n",stderr);
+ break;
+ case ERANGE:
+ fputs("Value out of range\n",stderr);
+ break;
+ case EASRT:
+ fputs("Assertion failed\n",stderr);
+ break;
+ case ESTLIM:
+ fputs("Statement count limit exceeded\n",stderr);
+ break;
+ case ESTKOVFLO:
+ fputs("Runtime stack overflow\n",stderr);
+ break;
+ case EFRAMESIZE:
+ fputs("Compiler restricts declarations to 32768 bytes per block\n",stderr);
+ break;
+ default:
+ fputs("Panic: unknown error\n",stderr);
+}
+if (nodump == 0)
+ backtrace(errnum);
+psexit(errnum);
+}