Annotation of 42BSD/ucb/pascal/px/int.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)int.c 1.8 2/11/82";
                      4: 
                      5: /*
                      6:  * px - interpreter for Berkeley Pascal
                      7:  * Version 3.0 Winter 1979
                      8:  *
                      9:  * Original version for the PDP 11/70 authored by:
                     10:  * Bill Joy, Charles Haley, Ken Thompson
                     11:  *
                     12:  * Rewritten for VAX 11/780 by Kirk McKusick
                     13:  */
                     14: 
                     15: #include       <signal.h>
                     16: #include       "whoami.h"
                     17: #include       "vars.h"
                     18: #include       "libpc.h"
                     19: #include       "objfmt.h"
                     20: 
                     21: /*
                     22:  * New stuff for pdx
                     23:  */
                     24: 
                     25: extern char *end;
                     26: extern loopaddr();
                     27: union progcntr *pcaddrp;       /* address of interpreter frame address */
                     28: 
                     29: main(ac,av)
                     30: 
                     31:        int     ac;
                     32:        char    **av;
                     33: 
                     34: {
                     35:        register char *objprog, *file;
                     36:        char *name;
                     37:        register long bytesread, bytestoread, block;
                     38:        register FILE *prog;
                     39:        struct   pxhdr pxhd;
                     40: #      define   pipe 3
                     41: 
                     42:        /*
                     43:         * Initialize everything
                     44:         */
                     45:        _argc = ac;
                     46:        _argv = av;
                     47:        _nodump = FALSE;
                     48: 
                     49:        /*
                     50:         * Determine how PX was invoked, and how to process the program 
                     51:         */
                     52:        file = _argv[1];
                     53:        if (!strcmp(_argv[0], "pdx")) {
                     54:                _mode = PDX;
                     55:                _argv += 2; _argc -= 2;
                     56:                name = _argv[0];
                     57:        } else if (!strcmp(_argv[0], "pix")) {
                     58:                _mode = PIX;
                     59:                _argv++; _argc--;
                     60:                name = _argv[0];
                     61:        } else if (!strcmp(_argv[0], "pipe")) {
                     62:                _mode = PIPE;
                     63:                file = "PIPE";
                     64:                _argv++; _argc--;
                     65:                name = _argv[0];
                     66:        } else {
                     67:                _mode = PX;
                     68:                if (_argc <= 1)
                     69:                        file = "obj";
                     70:                name = file;
                     71:        }
                     72: 
                     73:        /*
                     74:         * kludge to check for old style objs.
                     75:         */
                     76:        if (_mode == PX && !strcmp(file, "-")) {
                     77:                fprintf(stderr, "%s is obsolete and must be recompiled\n",
                     78:                    _argv[0]);
                     79:                exit(1);
                     80:        }
                     81:        /*
                     82:         * Process program header information
                     83:         */
                     84:        if (_mode == PIPE) {
                     85:                read(pipe,&pxhd,sizeof(struct pxhdr));
                     86:        } else {
                     87:                prog = fopen(file,"r");
                     88:                if (prog == NULL) {
                     89:                        perror(file);
                     90:                        exit(1);
                     91:                }
                     92:                fread(&pxhd,sizeof(struct pxhdr),1,prog);
                     93:                if (pxhd.magicnum != MAGICNUM) {
                     94:                        fseek(prog,(long)(HEADER_BYTES-sizeof(struct pxhdr)),0);
                     95:                        fread(&pxhd,sizeof(struct pxhdr),1,prog);
                     96:                }
                     97:        }
                     98:        if (pxhd.magicnum != MAGICNUM) {
                     99:                fprintf(stderr,"%s is not a Pascal interpreter file\n",name);
                    100:                exit(1);
                    101:        }
                    102:        if (pxhd.maketime < createtime) {
                    103:                fprintf(stderr,"%s is obsolete and must be recompiled\n",name);
                    104:                exit(1);
                    105:        }
                    106: 
                    107:        /*
                    108:         * Load program into memory
                    109:         */
                    110:        objprog = malloc((int)pxhd.objsize);
                    111:        if (_mode == PIPE) {
                    112:                bytestoread = pxhd.objsize;
                    113:                bytesread = 0;
                    114:                do      {
                    115:                        block = read(pipe,(int)(objprog+bytesread),bytestoread);
                    116:                        if (block > 0) {
                    117:                                bytesread += block;
                    118:                                bytestoread -= block;
                    119:                        }
                    120:                } while (block > 0);
                    121:        } else {
                    122:                bytesread = fread(objprog,1,(int)pxhd.objsize,prog);
                    123:                fclose(prog);
                    124:        }
                    125:        if (bytesread != pxhd.objsize) {
                    126:                fprintf(stderr,"Read error occurred while loading %s\n",file);
                    127:                exit(1);
                    128:        }
                    129:        if (_mode == PIX)
                    130:                fputs("Execution begins...\n",stderr);
                    131:        /*
                    132:         * set interpreter to catch expected signals and begin interpretation
                    133:         */
                    134:        signal(SIGILL,syserr);
                    135:        signal(SIGBUS,syserr);
                    136:        signal(SIGSYS,syserr);
                    137:        if (signal(SIGINT,SIG_IGN) != SIG_IGN)
                    138:                signal(SIGINT,intr);
                    139:        signal(SIGSEGV,memsize);
                    140:        signal(SIGFPE,EXCEPT);
                    141:        signal(SIGTRAP,liberr);
                    142: 
                    143:        /*
                    144:         * See if we're being watched by the debugger, if so set a trap.
                    145:         */
                    146:        if (_mode == PDX || (_mode == PIX && pxhd.symtabsize > 0)) {
                    147:                inittrap(&_display, &_dp, objprog, &pcaddrp, loopaddr);
                    148:        }
                    149: 
                    150:        /*
                    151:         * do it
                    152:         */
                    153:        interpreter(objprog);
                    154:        /*
                    155:         * reset signals, deallocate memory, and exit normally
                    156:         */
                    157:        signal(SIGINT,SIG_IGN);
                    158:        signal(SIGSEGV,SIG_DFL);
                    159:        signal(SIGFPE,SIG_DFL);
                    160:        signal(SIGTRAP,SIG_DFL);
                    161:        signal(SIGILL,SIG_DFL);
                    162:        signal(SIGBUS,SIG_DFL);
                    163:        signal(SIGSYS,SIG_DFL);
                    164:        PFLUSH();
                    165:        psexit(0);
                    166: }
                    167: 
                    168: /*
                    169:  * Generate an IOT trap to tell the debugger that the object code
                    170:  * has been read in.  Parameters are there for debugger to look at,
                    171:  * not the procedure.
                    172:  */
                    173: 
                    174: static inittrap(dispaddr, dpaddr, endaddr, pcaddrp, loopaddrp)
                    175: union disply *dispaddr;
                    176: struct disp *dpaddr;
                    177: char *endaddr;
                    178: union progcntr **pcaddrp;
                    179: char **loopaddrp;
                    180: {
                    181:        kill(getpid(), SIGIOT);
                    182: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.