home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / spencer_2bsd.tar.gz / 2bsd.tar / src / px / perror.c < prev    next >
C/C++ Source or Header  |  1980-02-17  |  4KB  |  223 lines

  1. /* (c) 1979 Regents of the University of California */
  2. #include "0x.h"
  3. #include "opcode.h"
  4. #include "E.h"
  5.  
  6. extern    int errno;
  7.  
  8. /*
  9.  * Routine error is called from onemt when a runtime error occurs.
  10.  * Its argument is the internal number of the error which occurred.
  11.  * See Edata, Emake etc.
  12.  */
  13. error(perrno)
  14.     int perrno;
  15. {
  16.     register int *ap, i;
  17.     register char *cp;
  18.     char *sep;
  19.     int disp[20], *mydp;
  20.     extern long stcnt;
  21.  
  22.     i = errno;
  23.     pmflush();
  24.     pmessage();
  25.     errno = i;
  26.     switch (perrno) {
  27.         case EINTR:
  28.             break;
  29.         case ECHR:
  30.             puts("Argument to chr out of range\n");
  31.             break;
  32.         case EDIVCHK:
  33.             puts("Div by zero\n");
  34.             break;
  35.         case EFDIVCHK:
  36.             puts("Floating divide by zero\n");
  37.             break;
  38.         case EFPOVFLO:
  39.             puts("Floating point overflow\n");
  40.             break;
  41.         case EHALT:
  42. /*
  43.             nodump = 0;
  44. */
  45.             puts("Call to procedure halt\n");
  46.             break;
  47.         case ENILPTR:
  48.             puts("Reference through a nil pointer\n");
  49.             break;
  50.         case EPASTEOF:
  51.             ferror("Tried to read past eof");
  52.             break;
  53.         case EREADIT:
  54.             ferror("Attempt to read, but open for writing");
  55.             break;
  56.         case EWRITEIT:
  57.             ferror("Attempt to write, but open for reading");
  58.             break;
  59.         case ETOODIGITS:
  60.             puts("Too many digits in number\n");
  61.             break;
  62.         case ESQRT:
  63.             puts("Negative argument to sqrt\n");
  64.             break;
  65.         case ESTKNEMP:
  66.             puts("Panic: stack not empty between statements\n");
  67.             break;
  68.         case ESUBSCR:
  69.             puts("Subscript out of range\n");
  70.             break;
  71.         case EREFINAF:
  72.             puts("Reference to an inactive file\n");
  73.             break;
  74.         case EWRITE:
  75.         case EOPEN:
  76.         case ECREATE:
  77.         case EREMOVE:
  78.         case ESEEK:
  79.             perror(file);
  80.             break;
  81.         case ELN:
  82.             puts("Non-positive argument to ln\n");
  83.             break;
  84.         case EBADOP:
  85.             puts("Panic: bad op code\n");
  86.             break;
  87.         case EBADINUM:
  88.             puts("Bad data found on integer read\n");
  89.             break;
  90.         case EBADFNUM:
  91.             puts("Bad data found on real read\n");
  92.             break;
  93.         case EGOTO:
  94.             puts("Panic: active frame not found in goto\n");
  95.             break;
  96.         case ECASE:
  97.             puts("Label not found in case\n");
  98.             break;
  99.         case EOUTOFMEM:
  100.             puts("Ran out of memory\n");
  101.             break;
  102.         case EALLOC:
  103.             puts("Panic: bad arg to alloc\n");
  104.             break;
  105.         case ECTTOT:
  106.             puts("Constructed set argument exceeds set bounds\n");
  107.             break;
  108.         case EMODCHK:
  109.             puts("Mod by zero\n");
  110.             break;
  111.         case ECLOSE:
  112.             ferror("Close failed?");
  113.             break;
  114.         case EARGV:
  115.             puts("Argument to argv out of range\n");
  116.             break;
  117.         case EPACK:
  118.             puts("Bad i to pack(a,i,z)\n");
  119.             break;
  120.         case EUNPACK:
  121.             puts("Bad i to unpack(z,a,i)\n");
  122.             break;
  123.         case ERANGE:
  124.             puts("Value out of range\n");
  125.             break;
  126.         case EASRT:
  127.             puts("Assertion failed\n");
  128.             break;
  129.         case EBIGGIE:
  130.             ferror("Integer number too large");
  131.             break;
  132.         case ESTLIM:
  133.             puts("Statement count limit exceeded\n");
  134.             break;
  135.         case ESTKOVFLO:
  136.             puts("Runtime stack overflow\n");
  137.             break;
  138.         default:
  139.             puts("Panic: unknown error\n");
  140.     }
  141.     if (nodump == 0) {
  142.         for (i = 0; i < 20; i++)
  143.             disp[i] = display[i];
  144.         mydp = dp;
  145.         sep = perrno == EINTR ? "\n\tInterrupted at " : "\n\tError at ";
  146.         if (lino <= 0)
  147.             exit(perrno);
  148.         for(;;) {
  149.             puts(sep);
  150.             sep = "\tCalled by ";
  151.             pputch('"');
  152.             ap = *mydp;
  153.             ap =+ 3;
  154.             cp = *ap++;
  155.             i = 8;
  156.             do
  157.                 pputch(*cp++);
  158.             while (--i && *cp != ' ');
  159.             cp =+ i;
  160.             puts("\"+");
  161.             pwrite(O_WRIT2, 2, lino-cp->pint, 0);
  162.             puts(" near line ");
  163.             pwrite(O_WRIT2, 2, lino, 0);
  164.             pputch('\n');
  165.             *mydp = *ap++;
  166.             if (mydp <= &display[1]) {
  167.                 for (i = 0; i < 20; i++)
  168.                     display[i] = disp[i];
  169.                 pmflush();
  170.                 puts("\n");
  171.                 if (discard)
  172.                     puts("Execution terminated abnormally\n");
  173.                 stmts();
  174.                 exit(perrno);
  175.             }
  176.             mydp = *ap++;
  177.             ap++;
  178.             lino = *ap++;
  179.             if (lino <= 0)
  180.                 break;
  181.         }
  182.     }
  183.     exit(perrno);
  184. }
  185.  
  186. stmts()
  187. {
  188.     extern long stcnt;
  189.  
  190.     pwrite(O_WRIT4, 2, stcnt, 0);
  191.     puts(" statement");
  192.     if (stcnt != 1)
  193.         puts("s");
  194.     puts(" executed in");
  195.     stmttime();
  196. }
  197.  
  198. stmttime()
  199. {
  200.     struct {
  201.         int utime, stime;
  202.         long cutime, cstime; 
  203.     } tbuf;
  204.     long l;
  205.  
  206.     times(&tbuf);
  207.     l = tbuf.utime;
  208.     pwrite(O_WRIT82, (2 << 3) | 2, l / HZ + 0.005, 0, 2);
  209.     puts(" seconds cpu time\n");
  210. }
  211.  
  212. psexit()
  213. {
  214.  
  215.     if (nodump == 1)
  216.         exit(0);
  217.     pmessage();
  218.     if (discard)
  219.         puts("Execution terminated\n");
  220.     stmts();
  221.     exit(0);
  222. }
  223.