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