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