12079Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22079Smckusick 3*3910Smckusic static char sccsid[] = "@(#)int.c 1.4 06/21/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> 162950Smckusic #include "whoami.h" 172079Smckusick #include "vars.h" 182079Smckusick #include "objfmt.h" 192079Smckusick 202079Smckusick main(ac,av) 212079Smckusick 222950Smckusic int ac; 232950Smckusic char **av; 242079Smckusick 252079Smckusick { 262950Smckusic register char *objprog, *file; 27*3910Smckusic register long bytesread, bytestoread, block; 282950Smckusic register FILE *prog; 292950Smckusic struct pxhdr pxhd; 302950Smckusic # define pipe 3 312079Smckusick 322950Smckusic /* 332950Smckusic * Initialize everything 342950Smckusic */ 352950Smckusic _argc = ac; 362950Smckusic _argv = av; 372950Smckusic _nodump = FALSE; 382079Smckusick 392950Smckusic /* 402950Smckusic * Determine how PX was invoked, and how to process the program 412950Smckusic */ 42*3910Smckusic if (_argv[0][0] == '-' && _argv[0][1] == 'o') { 432950Smckusic file = &_argv[0][2]; 442950Smckusic _mode = PIX; 45*3910Smckusic } else if (_argc <= 1) { 462950Smckusic file = "obj"; 472950Smckusic _mode = PX; 48*3910Smckusic } else if (_argv[1][0] != '-') { 492950Smckusic file = _argv[1]; 502950Smckusic _mode = PX; 51*3910Smckusic } else if (_argv[1][1] == 0) { 522950Smckusic file = _argv[0]; 532950Smckusic _mode = PIPE; 542950Smckusic _argc -= 1; 552950Smckusic _argv[1] = _argv[0]; 562950Smckusic _argv = &_argv[1]; 57*3910Smckusic } else { 582950Smckusic fputs("Improper specification of object file to PX\n",stderr); 592950Smckusic exit(1); 60*3910Smckusic } 612079Smckusick 622950Smckusic /* 632950Smckusic * Process program header information 642950Smckusic */ 65*3910Smckusic if (_mode == PIPE) { 662950Smckusic read(pipe,&pxhd,sizeof(struct pxhdr)); 67*3910Smckusic } else { 682950Smckusic prog = fopen(file,"r"); 69*3910Smckusic if (prog == NULL) { 702950Smckusic perror(file); 712950Smckusic exit(1); 72*3910Smckusic } 732950Smckusic fseek(prog,(long)(HEADER_BYTES-sizeof(struct pxhdr)),0); 742950Smckusic fread(&pxhd,sizeof(struct pxhdr),1,prog); 75*3910Smckusic } 76*3910Smckusic if (pxhd.maketime < createtime) { 772950Smckusic fprintf(stderr,"%s is obsolete and must be recompiled\n",file); 782079Smckusick exit(1); 79*3910Smckusic } 80*3910Smckusic if (pxhd.magicnum != MAGICNUM) { 813855Smckusic fprintf(stderr,"%s is not a Pascal interpreter file\n",file); 822950Smckusic exit(1); 83*3910Smckusic } 842079Smckusick 852950Smckusic /* 862950Smckusic * Load program into memory 872950Smckusic */ 882950Smckusic objprog = malloc((int)pxhd.objsize); 89*3910Smckusic if (_mode == PIPE) { 90*3910Smckusic bytestoread = pxhd.objsize; 912950Smckusic bytesread = 0; 92*3910Smckusic do { 93*3910Smckusic block = read(pipe,(int)(objprog+bytesread),bytestoread); 94*3910Smckusic if (block > 0) { 95*3910Smckusic bytesread += block; 96*3910Smckusic bytestoread -= block; 972950Smckusic } 98*3910Smckusic } while (block > 0); 99*3910Smckusic } else { 1002950Smckusic bytesread = fread(objprog,1,(int)pxhd.objsize,prog); 1012950Smckusic fclose(prog); 1022950Smckusic if (_mode == PIX) 1032950Smckusic unlink(file); 104*3910Smckusic } 105*3910Smckusic if (bytesread != pxhd.objsize) { 1062950Smckusic fprintf(stderr,"Read error occurred while loading %s\n",file); 1072950Smckusic exit(1); 108*3910Smckusic } 1092079Smckusick if (_mode == PIX) 1102950Smckusic fputs("Execution begins...\n",stderr); 1112950Smckusic /* 1122950Smckusic * set interpreter to catch expected signals and begin interpretation 1132950Smckusic */ 1142950Smckusic signal(SIGILL,syserr); 1152950Smckusic signal(SIGBUS,syserr); 1162950Smckusic signal(SIGSYS,syserr); 1172950Smckusic if (signal(SIGINT,SIG_IGN) != SIG_IGN) 1182950Smckusic signal(SIGINT,intr); 1192950Smckusic signal(SIGSEGV,memsize); 1202950Smckusic signal(SIGFPE,except); 1212950Smckusic signal(SIGTRAP,liberr); 1222950Smckusic /* 1232950Smckusic * do it 1242950Smckusic */ 1252950Smckusic interpreter(objprog); 1262950Smckusic /* 1272950Smckusic * reset signals, deallocate memory, and exit normally 1282950Smckusic */ 1292950Smckusic signal(SIGINT,SIG_IGN); 1302950Smckusic signal(SIGSEGV,SIG_DFL); 1312950Smckusic signal(SIGFPE,SIG_DFL); 1322950Smckusic signal(SIGTRAP,SIG_DFL); 1332950Smckusic signal(SIGILL,SIG_DFL); 1342950Smckusic signal(SIGBUS,SIG_DFL); 1352950Smckusic signal(SIGSYS,SIG_DFL); 1362950Smckusic PFLUSH(); 1372950Smckusic /* pfree(objprog); */ 1382950Smckusic psexit(0); 1392079Smckusick } 140