added PDX constant
[unix-history] / usr / src / usr.bin / pascal / px / int.c
CommitLineData
2917d4fc
KM
1/* Copyright (c) 1979 Regents of the University of California */
2
b4466be6 3static char sccsid[] = "@(#)int.c 1.5 %G%";
2917d4fc
KM
4
5/*
6 * px - interpreter for Berkeley Pascal
7 * Version 3.0 Winter 1979
8 *
9 * Original version for the PDP 11/70 authored by:
10 * Bill Joy, Charles Haley, Ken Thompson
11 *
12 * Rewritten for VAX 11/780 by Kirk McKusick
13 */
14
15#include <signal.h>
9a92014d 16#include "whoami.h"
2917d4fc
KM
17#include "vars.h"
18#include "objfmt.h"
19
b4466be6
ML
20/*
21 * New stuff for pdx
22 */
23
24extern char *end;
25extern loopaddr();
26union progcntr *pcaddrp; /* address of interpreter frame address */
27
2917d4fc
KM
28main(ac,av)
29
9a92014d
KM
30 int ac;
31 char **av;
2917d4fc
KM
32
33{
9a92014d 34 register char *objprog, *file;
842d41c9 35 register long bytesread, bytestoread, block;
9a92014d
KM
36 register FILE *prog;
37 struct pxhdr pxhd;
38# define pipe 3
2917d4fc 39
9a92014d
KM
40 /*
41 * Initialize everything
42 */
43 _argc = ac;
44 _argv = av;
45 _nodump = FALSE;
2917d4fc 46\f
9a92014d
KM
47 /*
48 * Determine how PX was invoked, and how to process the program
49 */
b4466be6
ML
50 file = _argv[1];
51 if (!strcmp(_argv[0], "pdx")) {
52 _mode = PDX;
53 _argv += 2; _argc -= 2;
54 } else if (!strcmp(_argv[0], "pix")) {
9a92014d 55 _mode = PIX;
b4466be6
ML
56 _argv++; _argc--;
57 } else if (!strcmp(_argv[0], "pipe")) {
9a92014d 58 _mode = PIPE;
b4466be6
ML
59 file = "PIPE";
60 _argv++; _argc--;
842d41c9 61 } else {
b4466be6
ML
62 _mode = PX;
63 if (_argc <= 1)
64 file = "obj";
842d41c9 65 }
2917d4fc 66\f
9a92014d
KM
67 /*
68 * Process program header information
69 */
842d41c9 70 if (_mode == PIPE) {
9a92014d 71 read(pipe,&pxhd,sizeof(struct pxhdr));
842d41c9 72 } else {
9a92014d 73 prog = fopen(file,"r");
842d41c9 74 if (prog == NULL) {
9a92014d
KM
75 perror(file);
76 exit(1);
842d41c9 77 }
9a92014d 78 fread(&pxhd,sizeof(struct pxhdr),1,prog);
b4466be6
ML
79 if (pxhd.magicnum != MAGICNUM) {
80 fseek(prog,(long)(HEADER_BYTES-sizeof(struct pxhdr)),0);
81 fread(&pxhd,sizeof(struct pxhdr),1,prog);
82 }
842d41c9
KM
83 }
84 if (pxhd.magicnum != MAGICNUM) {
bc0cb1f9 85 fprintf(stderr,"%s is not a Pascal interpreter file\n",file);
2917d4fc 86 exit(1);
842d41c9 87 }
b4466be6
ML
88 if (pxhd.maketime < createtime) {
89 fprintf(stderr,"%s is obsolete and must be recompiled\n",file);
90 exit(1);
91 }
2917d4fc 92\f
9a92014d
KM
93 /*
94 * Load program into memory
95 */
96 objprog = malloc((int)pxhd.objsize);
842d41c9
KM
97 if (_mode == PIPE) {
98 bytestoread = pxhd.objsize;
9a92014d 99 bytesread = 0;
842d41c9
KM
100 do {
101 block = read(pipe,(int)(objprog+bytesread),bytestoread);
102 if (block > 0) {
103 bytesread += block;
104 bytestoread -= block;
9a92014d 105 }
842d41c9
KM
106 } while (block > 0);
107 } else {
9a92014d
KM
108 bytesread = fread(objprog,1,(int)pxhd.objsize,prog);
109 fclose(prog);
842d41c9
KM
110 }
111 if (bytesread != pxhd.objsize) {
9a92014d
KM
112 fprintf(stderr,"Read error occurred while loading %s\n",file);
113 exit(1);
842d41c9 114 }
2917d4fc 115 if (_mode == PIX)
9a92014d
KM
116 fputs("Execution begins...\n",stderr);
117 /*
118 * set interpreter to catch expected signals and begin interpretation
119 */
120 signal(SIGILL,syserr);
121 signal(SIGBUS,syserr);
122 signal(SIGSYS,syserr);
123 if (signal(SIGINT,SIG_IGN) != SIG_IGN)
124 signal(SIGINT,intr);
125 signal(SIGSEGV,memsize);
126 signal(SIGFPE,except);
127 signal(SIGTRAP,liberr);
b4466be6
ML
128
129 /*
130 * See if we're being watched by the debugger, if so set a trap.
131 */
132 if (_mode == PDX || (_mode == PIX && pxhd.symtabsize > 0)) {
133 inittrap(&_display, &_dp, objprog, &pcaddrp, loopaddr);
134 }
135
9a92014d
KM
136 /*
137 * do it
138 */
139 interpreter(objprog);
140 /*
141 * reset signals, deallocate memory, and exit normally
142 */
143 signal(SIGINT,SIG_IGN);
144 signal(SIGSEGV,SIG_DFL);
145 signal(SIGFPE,SIG_DFL);
146 signal(SIGTRAP,SIG_DFL);
147 signal(SIGILL,SIG_DFL);
148 signal(SIGBUS,SIG_DFL);
149 signal(SIGSYS,SIG_DFL);
150 PFLUSH();
151 /* pfree(objprog); */
152 psexit(0);
2917d4fc 153}
b4466be6
ML
154
155/*
156 * Generate an IOT trap to tell the debugger that the object code
157 * has been read in. Parameters are there for debugger to look at,
158 * not the procedure.
159 */
160
161static inittrap(dispaddr, dpaddr, endaddr, pcaddrp, loopaddrp)
162union disply *dispaddr;
163struct disp *dpaddr;
164char *endaddr;
165union progcntr **pcaddrp;
166char **loopaddrp;
167{
168 kill(getpid(), SIGIOT);
169}