BSD 3 development
[unix-history] / usr / src / cmd / px / int.c
CommitLineData
7327a0f2
CH
1#
2/*
3 * px - interpreter for Berkeley Pascal
4 * Version 2.0 Winter 1979
5 *
6 * Original version for the PDP 11/70 authored by:
7 * Bill Joy, Charles Haley, Ken Thompson
8 *
9 * Rewritten for VAX 11/780 by Kirk McKusick
10 */
11
12#include "stdio.h"
13#include "signal.h"
14#include "h00vars.h"
15
16main(ac,av)
17
18long ac;
19char **av;
20
21{
22extern intr();
23extern memsize();
24extern except();
25extern char *malloc();
26extern char _sibuf[], _sobuf[];
27 long stats[8];
28 short unsigned magicnum;
29 long size;
30register long bytesread, block;
31register char *objprog;
32register FILE *prog;
33#define pipe 3
34#define pipesize 4096
35
36/*
37 * Initialize everything
38 */
39argc = ac;
40argv = av;
41stcnt = 0;
42stlim = 500000;
43llimit = 0x7fffffff; /* set to unlimited */
44nodump = 0;
45bufopt = 1; /* default to line buffering */
46\f
47/*
48 * Determine how PX was invoked, and how to process the program
49 */
50if (argv[0][0] == '-' && argv[0][1] == 'o')
51 {
52 file = &argv[0][2];
53 mode = PIX;
54 }
55else if (argc <= 1)
56 {
57 file = "obj";
58 mode = PX;
59 }
60else if (argv[1][0] != '-')
61 {
62 file = argv[1];
63 mode = PX;
64 }
65else if (argv[1][1] == 0)
66 {
67 file = argv[0];
68 mode = PIPE;
69 argc -= 1;
70 argv[1] = argv[0];
71 argv = &argv[1];
72 }
73else
74 {
75 fputs("Improper specification of object file to PX\n",stderr);
76 exit(1);
77 }
78\f
79/*
80 * Process program header information
81 */
82if (mode == PIPE)
83 {
84 read(pipe,(char *)(&size),4);
85 read(pipe,(char *)(&magicnum),2);
86 }
87else
88 {
89 prog = fopen(file,"r");
90 if (prog == NULL)
91 {
92 perror(file);
93 exit(1);
94 }
95 fstat(fileno(prog),&stats[0]);
96 size = stats[4];
97 fread((char *)(&magicnum),2,1,prog);
98 if (magicnum == 0407)
99 {
100 fseek(prog,1024,0);
101 fread((char *)(&magicnum),2,1,prog);
102 size -= 1024;
103 }
104 }
105size -=2;
106if (magicnum == 0404)
107 /* maintain compatability with 11/70 */
108 addrsze = 8;
109else if (magicnum == 0403)
110 /* normal case */
111 addrsze = 4;
112else
113 {
114 fprintf(stderr,"%s is not a Pascal program\n",file);
115 exit(1);
116 }
117\f
118/*
119 * Load program into memory
120 */
121objprog = malloc(size);
122if (mode == PIPE)
123 {
124 bytesread = 0;
125 do
126 {
127 block = read(pipe,objprog+bytesread,pipesize);
128 bytesread += block;
129 }
130 while (block);
131 }
132else
133 {
134 bytesread = fread(objprog,1,size,prog);
135 fclose(prog);
136 if (mode == PIX)
137 unlink(file);
138 }
139if (bytesread != size)
140 {
141 fprintf(stderr,"Read error occurred while loading %s\n",file);
142 exit(1);
143 }
144setbuf(stdin,&_sibuf[0]);
145setbuf(stdout,&_sobuf[0]);
146if (mode == PIX)
147 fputs("Execution begins...\n",stderr);
148/*
149 * set interpreter to catch expected signals and begin interpretation
150 */
151signal(SIGINT,intr);
152signal(SIGSEGV,memsize);
153signal(SIGFPE,except);
154#ifdef profile
155interpret(objprog,1);
156#else
157interpret(objprog,0);
158#endif
159/*
160 * reset signals, deallocate memory, and exit normally
161 */
162signal(SIGINT,SIG_IGN);
163signal(SIGSEGV,SIG_DFL);
164signal(SIGFPE,SIG_DFL);
165pflush();
166/*
167pfree(objprog);
168*/
169psexit(0);
170}