Annotation of 43BSDTahoe/ucb/pascal/px/int.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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