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