12079Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22079Smckusick 3*2950Smckusic static char sccsid[] = "@(#)int.c 1.2 03/06/81"; 42079Smckusick 52079Smckusick /* 62079Smckusick * px - interpreter for Berkeley Pascal 72079Smckusick * Version 3.0 Winter 1979 82079Smckusick * 92079Smckusick * Original version for the PDP 11/70 authored by: 102079Smckusick * Bill Joy, Charles Haley, Ken Thompson 112079Smckusick * 122079Smckusick * Rewritten for VAX 11/780 by Kirk McKusick 132079Smckusick */ 142079Smckusick 152079Smckusick #include <signal.h> 16*2950Smckusic #include "whoami.h" 172079Smckusick #include "vars.h" 182079Smckusick #include "objfmt.h" 192079Smckusick 202079Smckusick main(ac,av) 212079Smckusick 22*2950Smckusic int ac; 23*2950Smckusic char **av; 242079Smckusick 252079Smckusick { 26*2950Smckusic register char *objprog, *file; 27*2950Smckusic register long bytesread, block; 28*2950Smckusic register FILE *prog; 29*2950Smckusic struct pxhdr pxhd; 30*2950Smckusic # define pipe 3 31*2950Smckusic # define pipesize 4096 322079Smckusick 33*2950Smckusic /* 34*2950Smckusic * Initialize everything 35*2950Smckusic */ 36*2950Smckusic _argc = ac; 37*2950Smckusic _argv = av; 38*2950Smckusic _nodump = FALSE; 392079Smckusick 40*2950Smckusic /* 41*2950Smckusic * Determine how PX was invoked, and how to process the program 42*2950Smckusic */ 43*2950Smckusic if (_argv[0][0] == '-' && _argv[0][1] == 'o') 44*2950Smckusic { 45*2950Smckusic file = &_argv[0][2]; 46*2950Smckusic _mode = PIX; 47*2950Smckusic } 48*2950Smckusic else if (_argc <= 1) 49*2950Smckusic { 50*2950Smckusic file = "obj"; 51*2950Smckusic _mode = PX; 52*2950Smckusic } 53*2950Smckusic else if (_argv[1][0] != '-') 54*2950Smckusic { 55*2950Smckusic file = _argv[1]; 56*2950Smckusic _mode = PX; 57*2950Smckusic } 58*2950Smckusic else if (_argv[1][1] == 0) 59*2950Smckusic { 60*2950Smckusic file = _argv[0]; 61*2950Smckusic _mode = PIPE; 62*2950Smckusic _argc -= 1; 63*2950Smckusic _argv[1] = _argv[0]; 64*2950Smckusic _argv = &_argv[1]; 65*2950Smckusic } 66*2950Smckusic else 67*2950Smckusic { 68*2950Smckusic fputs("Improper specification of object file to PX\n",stderr); 69*2950Smckusic exit(1); 70*2950Smckusic } 712079Smckusick 72*2950Smckusic /* 73*2950Smckusic * Process program header information 74*2950Smckusic */ 75*2950Smckusic if (_mode == PIPE) 76*2950Smckusic read(pipe,&pxhd,sizeof(struct pxhdr)); 77*2950Smckusic else 782079Smckusick { 79*2950Smckusic prog = fopen(file,"r"); 80*2950Smckusic if (prog == NULL) 81*2950Smckusic { 82*2950Smckusic perror(file); 83*2950Smckusic exit(1); 84*2950Smckusic } 85*2950Smckusic fseek(prog,(long)(HEADER_BYTES-sizeof(struct pxhdr)),0); 86*2950Smckusic fread(&pxhd,sizeof(struct pxhdr),1,prog); 87*2950Smckusic } 88*2950Smckusic if (pxhd.maketime < createtime) 89*2950Smckusic { 90*2950Smckusic fprintf(stderr,"%s is obsolete and must be recompiled\n",file); 912079Smckusick exit(1); 922079Smckusick } 93*2950Smckusic if (pxhd.magicnum != MAGICNUM) 94*2950Smckusic { 95*2950Smckusic fprintf(stderr,"%s is not a Pascal program\n",file); 96*2950Smckusic exit(1); 97*2950Smckusic } 982079Smckusick 99*2950Smckusic /* 100*2950Smckusic * Load program into memory 101*2950Smckusic */ 102*2950Smckusic objprog = malloc((int)pxhd.objsize); 103*2950Smckusic if (_mode == PIPE) 1042079Smckusick { 105*2950Smckusic bytesread = 0; 106*2950Smckusic do 107*2950Smckusic { 108*2950Smckusic block = read(pipe,(int)(objprog+bytesread),pipesize); 109*2950Smckusic bytesread += block; 110*2950Smckusic } 111*2950Smckusic while (block); 1122079Smckusick } 113*2950Smckusic else 114*2950Smckusic { 115*2950Smckusic bytesread = fread(objprog,1,(int)pxhd.objsize,prog); 116*2950Smckusic fclose(prog); 117*2950Smckusic if (_mode == PIX) 118*2950Smckusic unlink(file); 119*2950Smckusic } 120*2950Smckusic if (bytesread != pxhd.objsize) 121*2950Smckusic { 122*2950Smckusic fprintf(stderr,"Read error occurred while loading %s\n",file); 123*2950Smckusic exit(1); 124*2950Smckusic } 1252079Smckusick if (_mode == PIX) 126*2950Smckusic fputs("Execution begins...\n",stderr); 127*2950Smckusic /* 128*2950Smckusic * set interpreter to catch expected signals and begin interpretation 129*2950Smckusic */ 130*2950Smckusic signal(SIGILL,syserr); 131*2950Smckusic signal(SIGBUS,syserr); 132*2950Smckusic signal(SIGSYS,syserr); 133*2950Smckusic if (signal(SIGINT,SIG_IGN) != SIG_IGN) 134*2950Smckusic signal(SIGINT,intr); 135*2950Smckusic signal(SIGSEGV,memsize); 136*2950Smckusic signal(SIGFPE,except); 137*2950Smckusic signal(SIGTRAP,liberr); 138*2950Smckusic /* 139*2950Smckusic * do it 140*2950Smckusic */ 141*2950Smckusic interpreter(objprog); 142*2950Smckusic /* 143*2950Smckusic * reset signals, deallocate memory, and exit normally 144*2950Smckusic */ 145*2950Smckusic signal(SIGINT,SIG_IGN); 146*2950Smckusic signal(SIGSEGV,SIG_DFL); 147*2950Smckusic signal(SIGFPE,SIG_DFL); 148*2950Smckusic signal(SIGTRAP,SIG_DFL); 149*2950Smckusic signal(SIGILL,SIG_DFL); 150*2950Smckusic signal(SIGBUS,SIG_DFL); 151*2950Smckusic signal(SIGSYS,SIG_DFL); 152*2950Smckusic PFLUSH(); 153*2950Smckusic /* pfree(objprog); */ 154*2950Smckusic psexit(0); 1552079Smckusick } 156