xref: /csrg-svn/usr.bin/pascal/px/int.c (revision 3910)
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