xref: /csrg-svn/usr.bin/pascal/px/int.c (revision 2079)
1*2079Smckusick /* Copyright (c) 1979 Regents of the University of California */
2*2079Smckusick 
3*2079Smckusick static char sccsid[] = "@(#)int.c 1.1 01/07/81";
4*2079Smckusick 
5*2079Smckusick /*
6*2079Smckusick  * px - interpreter for Berkeley Pascal
7*2079Smckusick  * Version 3.0 Winter 1979
8*2079Smckusick  *
9*2079Smckusick  * Original version for the PDP 11/70 authored by:
10*2079Smckusick  * Bill Joy, Charles Haley, Ken Thompson
11*2079Smckusick  *
12*2079Smckusick  * Rewritten for VAX 11/780 by Kirk McKusick
13*2079Smckusick  */
14*2079Smckusick 
15*2079Smckusick #include	<signal.h>
16*2079Smckusick #include	"vars.h"
17*2079Smckusick #include	"objfmt.h"
18*2079Smckusick 
19*2079Smckusick main(ac,av)
20*2079Smckusick 
21*2079Smckusick long	ac;
22*2079Smckusick char	**av;
23*2079Smckusick 
24*2079Smckusick {
25*2079Smckusick register long bytesread, block;
26*2079Smckusick register char *objprog, *file;
27*2079Smckusick register FILE *prog;
28*2079Smckusick struct	 pxhdr pxhd;
29*2079Smckusick #define	 pipe 3
30*2079Smckusick #define	 pipesize 4096
31*2079Smckusick 
32*2079Smckusick /*
33*2079Smckusick  * Initialize everything
34*2079Smckusick  */
35*2079Smckusick _argc = ac;
36*2079Smckusick _argv = av;
37*2079Smckusick _nodump = 0;
38*2079Smckusick 
39*2079Smckusick /*
40*2079Smckusick  * Determine how PX was invoked, and how to process the program
41*2079Smckusick  */
42*2079Smckusick if (_argv[0][0] == '-' && _argv[0][1] == 'o')
43*2079Smckusick 	{
44*2079Smckusick 	file = &_argv[0][2];
45*2079Smckusick 	_mode = PIX;
46*2079Smckusick 	}
47*2079Smckusick else if (_argc <= 1)
48*2079Smckusick 	{
49*2079Smckusick 	file = "obj";
50*2079Smckusick 	_mode = PX;
51*2079Smckusick 	}
52*2079Smckusick else if (_argv[1][0] != '-')
53*2079Smckusick 	{
54*2079Smckusick 	file = _argv[1];
55*2079Smckusick 	_mode = PX;
56*2079Smckusick 	}
57*2079Smckusick else if (_argv[1][1] == 0)
58*2079Smckusick 	{
59*2079Smckusick 	file = _argv[0];
60*2079Smckusick 	_mode = PIPE;
61*2079Smckusick 	_argc -= 1;
62*2079Smckusick 	_argv[1] = _argv[0];
63*2079Smckusick 	_argv = &_argv[1];
64*2079Smckusick 	}
65*2079Smckusick else
66*2079Smckusick 	{
67*2079Smckusick 	fputs("Improper specification of object file to PX\n",stderr);
68*2079Smckusick 	exit(1);
69*2079Smckusick 	}
70*2079Smckusick 
71*2079Smckusick /*
72*2079Smckusick  * Process program header information
73*2079Smckusick  */
74*2079Smckusick if (_mode == PIPE)
75*2079Smckusick 	read(pipe,&pxhd,sizeof(struct pxhdr));
76*2079Smckusick else
77*2079Smckusick 	{
78*2079Smckusick 	prog = fopen(file,"r");
79*2079Smckusick 	if (prog == NULL)
80*2079Smckusick 		{
81*2079Smckusick 		perror(file);
82*2079Smckusick 		exit(1);
83*2079Smckusick 		}
84*2079Smckusick 	fseek(prog,HEADER_BYTES-sizeof(struct pxhdr),0);
85*2079Smckusick 	fread(&pxhd,sizeof(struct pxhdr),1,prog);
86*2079Smckusick 	}
87*2079Smckusick if (pxhd.maketime < createtime)
88*2079Smckusick 	{
89*2079Smckusick 	fprintf(stderr,"%s is obsolete and must be recompiled\n",file);
90*2079Smckusick 	exit(1);
91*2079Smckusick 	}
92*2079Smckusick if (pxhd.magicnum != 0403)
93*2079Smckusick 	{
94*2079Smckusick 	fprintf(stderr,"%s is not a Pascal program\n",file);
95*2079Smckusick 	exit(1);
96*2079Smckusick 	}
97*2079Smckusick 
98*2079Smckusick /*
99*2079Smckusick  * Load program into memory
100*2079Smckusick  */
101*2079Smckusick objprog = malloc(pxhd.objsize);
102*2079Smckusick if (_mode == PIPE)
103*2079Smckusick 	{
104*2079Smckusick 	bytesread = 0;
105*2079Smckusick 	do
106*2079Smckusick 		{
107*2079Smckusick 		block = read(pipe,objprog+bytesread,pipesize);
108*2079Smckusick 		bytesread += block;
109*2079Smckusick 		}
110*2079Smckusick 		while (block);
111*2079Smckusick 	}
112*2079Smckusick else
113*2079Smckusick 	{
114*2079Smckusick 	bytesread = fread(objprog,1,pxhd.objsize,prog);
115*2079Smckusick 	fclose(prog);
116*2079Smckusick 	if (_mode == PIX)
117*2079Smckusick 		unlink(file);
118*2079Smckusick 	}
119*2079Smckusick if (bytesread != pxhd.objsize)
120*2079Smckusick 	{
121*2079Smckusick 	fprintf(stderr,"Read error occurred while loading %s\n",file);
122*2079Smckusick 	exit(1);
123*2079Smckusick 	}
124*2079Smckusick if (_mode == PIX)
125*2079Smckusick 	fputs("Execution begins...\n",stderr);
126*2079Smckusick /*
127*2079Smckusick  * set interpreter to catch expected signals and begin interpretation
128*2079Smckusick  */
129*2079Smckusick signal(SIGILL,syserr);
130*2079Smckusick signal(SIGBUS,syserr);
131*2079Smckusick signal(SIGSYS,syserr);
132*2079Smckusick if (signal(SIGINT,SIG_IGN) != SIG_IGN)
133*2079Smckusick 	signal(SIGINT,intr);
134*2079Smckusick signal(SIGSEGV,memsize);
135*2079Smckusick signal(SIGFPE,except);
136*2079Smckusick signal(SIGTRAP,liberr);
137*2079Smckusick interpreter(objprog);
138*2079Smckusick /*
139*2079Smckusick  * reset signals, deallocate memory, and exit normally
140*2079Smckusick  */
141*2079Smckusick signal(SIGINT,SIG_IGN);
142*2079Smckusick signal(SIGSEGV,SIG_DFL);
143*2079Smckusick signal(SIGFPE,SIG_DFL);
144*2079Smckusick signal(SIGTRAP,SIG_DFL);
145*2079Smckusick signal(SIGILL,SIG_DFL);
146*2079Smckusick signal(SIGBUS,SIG_DFL);
147*2079Smckusick signal(SIGSYS,SIG_DFL);
148*2079Smckusick PFLUSH();
149*2079Smckusick /* pfree(objprog); */
150*2079Smckusick psexit(0);
151*2079Smckusick }
152