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