1*2079Smckusick /* Copyright (c) 1979 Regents of the University of California */ 2*2079Smckusick 3*2079Smckusick static char sccsid[] = "@(#)int.c 1.1 01/07/81"; 4*2079Smckusick 5*2079Smckusick /* 6*2079Smckusick * px - interpreter for Berkeley Pascal 7*2079Smckusick * Version 3.0 Winter 1979 8*2079Smckusick * 9*2079Smckusick * Original version for the PDP 11/70 authored by: 10*2079Smckusick * Bill Joy, Charles Haley, Ken Thompson 11*2079Smckusick * 12*2079Smckusick * Rewritten for VAX 11/780 by Kirk McKusick 13*2079Smckusick */ 14*2079Smckusick 15*2079Smckusick #include <signal.h> 16*2079Smckusick #include "vars.h" 17*2079Smckusick #include "objfmt.h" 18*2079Smckusick 19*2079Smckusick main(ac,av) 20*2079Smckusick 21*2079Smckusick long ac; 22*2079Smckusick char **av; 23*2079Smckusick 24*2079Smckusick { 25*2079Smckusick register long bytesread, block; 26*2079Smckusick register char *objprog, *file; 27*2079Smckusick register FILE *prog; 28*2079Smckusick struct pxhdr pxhd; 29*2079Smckusick #define pipe 3 30*2079Smckusick #define pipesize 4096 31*2079Smckusick 32*2079Smckusick /* 33*2079Smckusick * Initialize everything 34*2079Smckusick */ 35*2079Smckusick _argc = ac; 36*2079Smckusick _argv = av; 37*2079Smckusick _nodump = 0; 38*2079Smckusick 39*2079Smckusick /* 40*2079Smckusick * Determine how PX was invoked, and how to process the program 41*2079Smckusick */ 42*2079Smckusick if (_argv[0][0] == '-' && _argv[0][1] == 'o') 43*2079Smckusick { 44*2079Smckusick file = &_argv[0][2]; 45*2079Smckusick _mode = PIX; 46*2079Smckusick } 47*2079Smckusick else if (_argc <= 1) 48*2079Smckusick { 49*2079Smckusick file = "obj"; 50*2079Smckusick _mode = PX; 51*2079Smckusick } 52*2079Smckusick else if (_argv[1][0] != '-') 53*2079Smckusick { 54*2079Smckusick file = _argv[1]; 55*2079Smckusick _mode = PX; 56*2079Smckusick } 57*2079Smckusick else if (_argv[1][1] == 0) 58*2079Smckusick { 59*2079Smckusick file = _argv[0]; 60*2079Smckusick _mode = PIPE; 61*2079Smckusick _argc -= 1; 62*2079Smckusick _argv[1] = _argv[0]; 63*2079Smckusick _argv = &_argv[1]; 64*2079Smckusick } 65*2079Smckusick else 66*2079Smckusick { 67*2079Smckusick fputs("Improper specification of object file to PX\n",stderr); 68*2079Smckusick exit(1); 69*2079Smckusick } 70*2079Smckusick 71*2079Smckusick /* 72*2079Smckusick * Process program header information 73*2079Smckusick */ 74*2079Smckusick if (_mode == PIPE) 75*2079Smckusick read(pipe,&pxhd,sizeof(struct pxhdr)); 76*2079Smckusick else 77*2079Smckusick { 78*2079Smckusick prog = fopen(file,"r"); 79*2079Smckusick if (prog == NULL) 80*2079Smckusick { 81*2079Smckusick perror(file); 82*2079Smckusick exit(1); 83*2079Smckusick } 84*2079Smckusick fseek(prog,HEADER_BYTES-sizeof(struct pxhdr),0); 85*2079Smckusick fread(&pxhd,sizeof(struct pxhdr),1,prog); 86*2079Smckusick } 87*2079Smckusick if (pxhd.maketime < createtime) 88*2079Smckusick { 89*2079Smckusick fprintf(stderr,"%s is obsolete and must be recompiled\n",file); 90*2079Smckusick exit(1); 91*2079Smckusick } 92*2079Smckusick if (pxhd.magicnum != 0403) 93*2079Smckusick { 94*2079Smckusick fprintf(stderr,"%s is not a Pascal program\n",file); 95*2079Smckusick exit(1); 96*2079Smckusick } 97*2079Smckusick 98*2079Smckusick /* 99*2079Smckusick * Load program into memory 100*2079Smckusick */ 101*2079Smckusick objprog = malloc(pxhd.objsize); 102*2079Smckusick if (_mode == PIPE) 103*2079Smckusick { 104*2079Smckusick bytesread = 0; 105*2079Smckusick do 106*2079Smckusick { 107*2079Smckusick block = read(pipe,objprog+bytesread,pipesize); 108*2079Smckusick bytesread += block; 109*2079Smckusick } 110*2079Smckusick while (block); 111*2079Smckusick } 112*2079Smckusick else 113*2079Smckusick { 114*2079Smckusick bytesread = fread(objprog,1,pxhd.objsize,prog); 115*2079Smckusick fclose(prog); 116*2079Smckusick if (_mode == PIX) 117*2079Smckusick unlink(file); 118*2079Smckusick } 119*2079Smckusick if (bytesread != pxhd.objsize) 120*2079Smckusick { 121*2079Smckusick fprintf(stderr,"Read error occurred while loading %s\n",file); 122*2079Smckusick exit(1); 123*2079Smckusick } 124*2079Smckusick if (_mode == PIX) 125*2079Smckusick fputs("Execution begins...\n",stderr); 126*2079Smckusick /* 127*2079Smckusick * set interpreter to catch expected signals and begin interpretation 128*2079Smckusick */ 129*2079Smckusick signal(SIGILL,syserr); 130*2079Smckusick signal(SIGBUS,syserr); 131*2079Smckusick signal(SIGSYS,syserr); 132*2079Smckusick if (signal(SIGINT,SIG_IGN) != SIG_IGN) 133*2079Smckusick signal(SIGINT,intr); 134*2079Smckusick signal(SIGSEGV,memsize); 135*2079Smckusick signal(SIGFPE,except); 136*2079Smckusick signal(SIGTRAP,liberr); 137*2079Smckusick interpreter(objprog); 138*2079Smckusick /* 139*2079Smckusick * reset signals, deallocate memory, and exit normally 140*2079Smckusick */ 141*2079Smckusick signal(SIGINT,SIG_IGN); 142*2079Smckusick signal(SIGSEGV,SIG_DFL); 143*2079Smckusick signal(SIGFPE,SIG_DFL); 144*2079Smckusick signal(SIGTRAP,SIG_DFL); 145*2079Smckusick signal(SIGILL,SIG_DFL); 146*2079Smckusick signal(SIGBUS,SIG_DFL); 147*2079Smckusick signal(SIGSYS,SIG_DFL); 148*2079Smckusick PFLUSH(); 149*2079Smckusick /* pfree(objprog); */ 150*2079Smckusick psexit(0); 151*2079Smckusick } 152