1BSD/px/int.c
#
/*
* px - interpreter for UNIX Pascal
* Version 1.0 August 1977
*
* Bill Joy, Charles Haley, Ken Thompson
*/
#include "0x.h"
#include "whoami"
#include "opcode.h"
#include "E.h"
int display[20] { display };
int onintr();
main(ac, av)
int ac;
char *av[];
{
register char *cp;
register int of;
int size, *bp, i;
i = signal(2, 1);
argc = ac - 1, argv = av + 1;
randim = 1./randm;
setmem();
if (av[0][0] == '-' && av[0][1] == 'o') {
av[0] =+ 2;
file = av[0];
argv--, argc++;
discard++;
} else if (argc == 0)
file = *--argv = "obj", argc++;
else
file = *argv;
cp = file;
of = open(cp, 0);
if (discard)
unlink(cp);
if ((i & 01) == 0)
signal(2, onintr);
if (of < 0) {
oops:
perror(cp);
exit(1);
}
fstat(of, display);
size = display[5];
if (size == 0) {
ferror("File is empty");
exit(1);
}
cp = alloc(size);
if (cp == -1) {
ferror("Too large");
exit(1);
}
if (read(of, cp, size) != size)
goto oops;
bp = cp;
if (*bp++ != 0404) {
ferror("Not a Pascal object file");
exit(1);
}
close(of);
if (discard && bp[(bp[0] == O_PXPBUF ? bp[5] + 8 : bp[1]) / 2 + 1] != O_NODUMP)
write(2, "Execution begins...\n", 20);
interpret(bp, size);
}
Perror(file, mesg)
char *file, *mesg;
{
extern int errno;
extern char *sys_errlist[];
errno = 0;
sys_errlist[0] = mesg;
perror(file);
}
/*
* Initialization of random number "constants"
*/
long seed 7774755.;
double randa 62605.;
double randc 113218009.;
double randm 536870912.;
/*
* Routine to put a string on the current
* pascal output given a pointer to the string
*/
puts(str)
char *str;
{
register char *cp;
cp = str;
while (*cp)
pputch(*cp++);
}
ferror(cp)
char *cp;
{
Perror(file, cp);
}
onintr()
{
extern int draino[];
if (dp == 0)
exit(1);
draino[0] = 512;
draino[1] = &draino[2];
error(EINTR);
}