Annotation of 3BSD/cmd/px/int.c, revision 1.1

1.1     ! root        1: #
        !             2: /*
        !             3:  * px - interpreter for Berkeley Pascal
        !             4:  * Version 2.0 Winter 1979
        !             5:  *
        !             6:  * Original version for the PDP 11/70 authored by:
        !             7:  * Bill Joy, Charles Haley, Ken Thompson
        !             8:  *
        !             9:  * Rewritten for VAX 11/780 by Kirk McKusick
        !            10:  */
        !            11: 
        !            12: #include       "stdio.h"
        !            13: #include       "signal.h"
        !            14: #include       "h00vars.h"
        !            15: 
        !            16: main(ac,av)
        !            17: 
        !            18: long   ac;
        !            19: char   **av;
        !            20: 
        !            21: {
        !            22: extern  intr();
        !            23: extern  memsize();
        !            24: extern  except();
        !            25: extern  char *malloc();
        !            26: extern  char _sibuf[], _sobuf[];
        !            27:         long stats[8];
        !            28:         short unsigned magicnum;
        !            29:         long size;
        !            30: register long bytesread, block;
        !            31: register char *objprog;
        !            32: register FILE *prog;
        !            33: #define         pipe 3
        !            34: #define         pipesize 4096
        !            35: 
        !            36: /*
        !            37:  * Initialize everything
        !            38:  */
        !            39: argc = ac;
        !            40: argv = av;
        !            41: stcnt = 0;
        !            42: stlim = 500000;
        !            43: llimit = 0x7fffffff;   /* set to unlimited */
        !            44: nodump = 0;
        !            45: bufopt = 1;    /* default to line buffering */
        !            46: 
        !            47: /*
        !            48:  * Determine how PX was invoked, and how to process the program 
        !            49:  */
        !            50: if (argv[0][0] == '-' && argv[0][1] == 'o')
        !            51:        {
        !            52:        file = &argv[0][2];
        !            53:        mode = PIX;
        !            54:        }
        !            55: else if (argc <= 1)
        !            56:        {
        !            57:        file = "obj";
        !            58:        mode = PX;
        !            59:        }
        !            60: else if (argv[1][0] != '-')
        !            61:        {
        !            62:        file = argv[1];
        !            63:        mode = PX;
        !            64:        }
        !            65: else if (argv[1][1] == 0)
        !            66:        {
        !            67:        file = argv[0];
        !            68:        mode = PIPE;
        !            69:        argc -= 1;
        !            70:        argv[1] = argv[0];
        !            71:        argv = &argv[1];
        !            72:        }
        !            73: else
        !            74:        {
        !            75:        fputs("Improper specification of object file to PX\n",stderr);
        !            76:        exit(1);
        !            77:        }
        !            78: 
        !            79: /*
        !            80:  * Process program header information
        !            81:  */
        !            82: if (mode == PIPE)
        !            83:        {
        !            84:        read(pipe,(char *)(&size),4);
        !            85:        read(pipe,(char *)(&magicnum),2);
        !            86:        }
        !            87: else
        !            88:        {
        !            89:        prog = fopen(file,"r");
        !            90:        if (prog == NULL)
        !            91:                {
        !            92:                perror(file);
        !            93:                exit(1);
        !            94:                }
        !            95:        fstat(fileno(prog),&stats[0]);
        !            96:        size = stats[4];
        !            97:        fread((char *)(&magicnum),2,1,prog);
        !            98:        if (magicnum == 0407)
        !            99:                {
        !           100:                fseek(prog,1024,0);
        !           101:                fread((char *)(&magicnum),2,1,prog);
        !           102:                size -= 1024;
        !           103:                }
        !           104:        }
        !           105: size -=2;
        !           106: if (magicnum == 0404)
        !           107:        /* maintain compatability with 11/70 */
        !           108:        addrsze = 8;
        !           109: else if (magicnum == 0403)
        !           110:        /* normal case */
        !           111:        addrsze = 4;
        !           112: else
        !           113:        {
        !           114:        fprintf(stderr,"%s is not a Pascal program\n",file);
        !           115:        exit(1);
        !           116:        }
        !           117: 
        !           118: /*
        !           119:  * Load program into memory
        !           120:  */
        !           121: objprog = malloc(size);
        !           122: if (mode == PIPE)
        !           123:        {
        !           124:        bytesread = 0;
        !           125:        do
        !           126:                {
        !           127:                block = read(pipe,objprog+bytesread,pipesize);
        !           128:                bytesread += block;
        !           129:                }
        !           130:                while (block);
        !           131:        }
        !           132: else
        !           133:        {
        !           134:        bytesread = fread(objprog,1,size,prog);
        !           135:        fclose(prog);
        !           136:        if (mode == PIX)
        !           137:                unlink(file);
        !           138:        }
        !           139: if (bytesread != size)
        !           140:        {
        !           141:        fprintf(stderr,"Read error occurred while loading %s\n",file);
        !           142:        exit(1);
        !           143:        }
        !           144: setbuf(stdin,&_sibuf[0]);
        !           145: setbuf(stdout,&_sobuf[0]);
        !           146: if (mode == PIX)
        !           147:        fputs("Execution begins...\n",stderr);
        !           148: /*
        !           149:  * set interpreter to catch expected signals and begin interpretation
        !           150:  */
        !           151: signal(SIGINT,intr);
        !           152: signal(SIGSEGV,memsize);
        !           153: signal(SIGFPE,except);
        !           154: #ifdef profile
        !           155: interpret(objprog,1);
        !           156: #else
        !           157: interpret(objprog,0);
        !           158: #endif
        !           159: /*
        !           160:  * reset signals, deallocate memory, and exit normally
        !           161:  */
        !           162: signal(SIGINT,SIG_IGN);
        !           163: signal(SIGSEGV,SIG_DFL);
        !           164: signal(SIGFPE,SIG_DFL);
        !           165: pflush();
        !           166: /*
        !           167: pfree(objprog);
        !           168: */
        !           169: psexit(0);
        !           170: }

unix.superglobalmegacorp.com

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