12079Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22079Smckusick 3*3855Smckusic static char sccsid[] = "@(#)int.c 1.3 06/07/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; 272950Smckusic register long bytesread, block; 282950Smckusic register FILE *prog; 292950Smckusic struct pxhdr pxhd; 302950Smckusic # define pipe 3 312950Smckusic # define pipesize 4096 322079Smckusick 332950Smckusic /* 342950Smckusic * Initialize everything 352950Smckusic */ 362950Smckusic _argc = ac; 372950Smckusic _argv = av; 382950Smckusic _nodump = FALSE; 392079Smckusick 402950Smckusic /* 412950Smckusic * Determine how PX was invoked, and how to process the program 422950Smckusic */ 432950Smckusic if (_argv[0][0] == '-' && _argv[0][1] == 'o') 442950Smckusic { 452950Smckusic file = &_argv[0][2]; 462950Smckusic _mode = PIX; 472950Smckusic } 482950Smckusic else if (_argc <= 1) 492950Smckusic { 502950Smckusic file = "obj"; 512950Smckusic _mode = PX; 522950Smckusic } 532950Smckusic else if (_argv[1][0] != '-') 542950Smckusic { 552950Smckusic file = _argv[1]; 562950Smckusic _mode = PX; 572950Smckusic } 582950Smckusic else if (_argv[1][1] == 0) 592950Smckusic { 602950Smckusic file = _argv[0]; 612950Smckusic _mode = PIPE; 622950Smckusic _argc -= 1; 632950Smckusic _argv[1] = _argv[0]; 642950Smckusic _argv = &_argv[1]; 652950Smckusic } 662950Smckusic else 672950Smckusic { 682950Smckusic fputs("Improper specification of object file to PX\n",stderr); 692950Smckusic exit(1); 702950Smckusic } 712079Smckusick 722950Smckusic /* 732950Smckusic * Process program header information 742950Smckusic */ 752950Smckusic if (_mode == PIPE) 762950Smckusic read(pipe,&pxhd,sizeof(struct pxhdr)); 772950Smckusic else 782079Smckusick { 792950Smckusic prog = fopen(file,"r"); 802950Smckusic if (prog == NULL) 812950Smckusic { 822950Smckusic perror(file); 832950Smckusic exit(1); 842950Smckusic } 852950Smckusic fseek(prog,(long)(HEADER_BYTES-sizeof(struct pxhdr)),0); 862950Smckusic fread(&pxhd,sizeof(struct pxhdr),1,prog); 872950Smckusic } 882950Smckusic if (pxhd.maketime < createtime) 892950Smckusic { 902950Smckusic fprintf(stderr,"%s is obsolete and must be recompiled\n",file); 912079Smckusick exit(1); 922079Smckusick } 932950Smckusic if (pxhd.magicnum != MAGICNUM) 942950Smckusic { 95*3855Smckusic fprintf(stderr,"%s is not a Pascal interpreter file\n",file); 962950Smckusic exit(1); 972950Smckusic } 982079Smckusick 992950Smckusic /* 1002950Smckusic * Load program into memory 1012950Smckusic */ 1022950Smckusic objprog = malloc((int)pxhd.objsize); 1032950Smckusic if (_mode == PIPE) 1042079Smckusick { 1052950Smckusic bytesread = 0; 1062950Smckusic do 1072950Smckusic { 1082950Smckusic block = read(pipe,(int)(objprog+bytesread),pipesize); 1092950Smckusic bytesread += block; 1102950Smckusic } 1112950Smckusic while (block); 1122079Smckusick } 1132950Smckusic else 1142950Smckusic { 1152950Smckusic bytesread = fread(objprog,1,(int)pxhd.objsize,prog); 1162950Smckusic fclose(prog); 1172950Smckusic if (_mode == PIX) 1182950Smckusic unlink(file); 1192950Smckusic } 1202950Smckusic if (bytesread != pxhd.objsize) 1212950Smckusic { 1222950Smckusic fprintf(stderr,"Read error occurred while loading %s\n",file); 1232950Smckusic exit(1); 1242950Smckusic } 1252079Smckusick if (_mode == PIX) 1262950Smckusic fputs("Execution begins...\n",stderr); 1272950Smckusic /* 1282950Smckusic * set interpreter to catch expected signals and begin interpretation 1292950Smckusic */ 1302950Smckusic signal(SIGILL,syserr); 1312950Smckusic signal(SIGBUS,syserr); 1322950Smckusic signal(SIGSYS,syserr); 1332950Smckusic if (signal(SIGINT,SIG_IGN) != SIG_IGN) 1342950Smckusic signal(SIGINT,intr); 1352950Smckusic signal(SIGSEGV,memsize); 1362950Smckusic signal(SIGFPE,except); 1372950Smckusic signal(SIGTRAP,liberr); 1382950Smckusic /* 1392950Smckusic * do it 1402950Smckusic */ 1412950Smckusic interpreter(objprog); 1422950Smckusic /* 1432950Smckusic * reset signals, deallocate memory, and exit normally 1442950Smckusic */ 1452950Smckusic signal(SIGINT,SIG_IGN); 1462950Smckusic signal(SIGSEGV,SIG_DFL); 1472950Smckusic signal(SIGFPE,SIG_DFL); 1482950Smckusic signal(SIGTRAP,SIG_DFL); 1492950Smckusic signal(SIGILL,SIG_DFL); 1502950Smckusic signal(SIGBUS,SIG_DFL); 1512950Smckusic signal(SIGSYS,SIG_DFL); 1522950Smckusic PFLUSH(); 1532950Smckusic /* pfree(objprog); */ 1542950Smckusic psexit(0); 1552079Smckusick } 156