BSD 2 development
[unix-history] / src / pi1 / receive.c
/* Copyright (c) 1979 Regents of the University of California */
#include "0.h"
#include "send.h"
#include "tree.h"
/*
* Pi - Pascal interpreter code translator
*
* Bill Joy UCB February 6, 1978
*/
int fp2[DSPLYSZ];
int pin[259]; /* Unit 0 */
int ackd, acker;
#ifdef DEBUG
extern char *trnames[];
#endif
extern int *spacep;
extern char printed, hadsome, *lastname, *obj;
#ifdef DEBUG
char *rnames[] {
"",
"RINIT",
"RENQ",
"RTREE",
"RTRFREE",
"RTRCHK",
"REVENIT",
"RSTRING",
"REVLAB",
"REVCNST",
"REVTBEG",
"REVTYPE",
"REVTEND",
"REVVBEG",
"REVVAR",
"REVVEND",
"REVFHDR",
"REVFFWD",
"REVFBDY",
"REVFEND",
"ROPUSH",
"ROPOP",
"ROSET",
"RKILL",
"RFINISH",
};
#endif
#define getaw() getw(pin)
#define getac() getc(pin)
#define sgetaw() sreloc(getaw())
#define tgetaw() treloc(getaw())
receive()
{
register int i, *ip;
register char *cp;
#define TREENMAX 6 /* From tree.c */
int loctree[TREENMAX * 2], locstring[514];
int ch, j;
for (;;) {
i = getac();
#ifdef DEBUG
if (i > 0 && i <= RLAST)
dprintf("%s\t", rnames[i]);
else if (i == -1)
dprintf("EOF\t");
else
dprintf("OOPS!\t");
#endif
holdderr = 1;
switch (i) {
case RINIT:
lastname = sreloc(getaw());
obj = sreloc(getaw());
ackd = getac();
for (i = 0; i < 26; i++)
opts[i] = getac();
efil = getac();
errfile = sreloc(getaw());
ofil = getac();
magic();
#ifdef DEBUG
dprintf("RINIT\n\t");
dprintf("lastname \"%s\"\n\t", lastname);
dprintf("ackd %d\n\t", ackd);
dprintf("options: ");
for (i = 0; i < 26; i++)
if (opts[i])
if (i == 1)
dprintf("b%d ", opts[1]);
else
dprintf("%c ", i + 'a');
dprintf("\n\tefil %d\n", efil);
dprintf("\terrfile \"%s\"\n", errfile);
dprintf("\tofil %d\n", ofil);
#endif
break;
case RENQ:
#ifdef DEBUG
dprintf("\tACK\n");
#endif
ack();
break;
case RTREE:
#ifdef DEBUG
dprintf("%d ", toffset(spacep));
#endif
i = getac();
if (i < 0 || i > T_LAST) {
#ifdef DEBUG
dprintf("\tBAD: %d\n", i);
#endif
panic("recv RTREE");
exit(1);
}
cp = trdesc[i];
#ifdef DEBUG
dprintf("\t%s:", trnames[i]);
#endif
ip = loctree;
*ip++ = i;
j = 1;
while (*cp) {
j++;
switch (*cp++) {
case 's':
cp = locstring;
i = 512;
#ifdef DEBUG
dprintf(" \"");
#endif
while ((ch = getac()) && ch != -1) {
if (--i == 0)
panic("RTREE case s");
*cp++ = ch;
#ifdef DEBUG
dprintf("%c", ch);
#endif
}
#ifdef DEBUG
dprintf("\"\n");
#endif
*cp++ = 0;
copystr(locstring);
goto out;
case 'd':
*ip++ = getac();
#ifdef DEBUG
dprintf(" d%d", ip[-1]);
#endif
continue;
case 'n':
*ip++ = getaw();
#ifdef DEBUG
dprintf(" n%d", ip[-1]);
#endif
continue;
case '"':
*ip++ = sreloc(getaw());
#ifdef DEBUG
if (ip[-1] == NIL)
dprintf(" NIL\"");
else
dprintf(" \"%s\"", ip[-1]);
#endif
continue;
case 'p':
*ip++ = treloc(getaw());
#ifdef DEBUG
dptree(ip[-1]);
#endif
continue;
}
}
#ifdef DEBUG
dprintf("\n");
#endif
treev(j, loctree);
out:
break;
case RTRCHK:
i = getaw();
#ifdef DEBUG
dprintf(" %d\n", i);
if (i != toffset(spacep))
dprintf("trchk %d, have %d\n", i, toffset(spacep));
#endif
break;
case RTRFREE:
#ifdef DEBUG
dprintf("\t%d\n", toffset(spacep));
#endif
trfree();
break;
case REVTBEG:
#ifdef DEBUG
dprintf("\n");
#endif
typebeg();
break;
case REVTEND:
#ifdef DEBUG
dprintf("\n");
#endif
typeend();
break;
case REVVBEG:
#ifdef DEBUG
dprintf("\n");
#endif
varbeg();
break;
case REVVEND:
#ifdef DEBUG
dprintf("\n");
#endif
varend();
break;
case REVENIT:
#ifdef DEBUG
dprintf("\n");
#endif
evenit();
break;
case RSTRING:
#ifdef DEBUG
dprintf(" \"");
#endif
cp = locstring;
i = 512;
while ((ch = getac()) && ch != -1) {
if (--i == 0)
panic("RSTRING length");
*cp++ = ch;
#ifdef DEBUG
dprintf("%c", ch);
#endif
}
#ifdef DEBUG
dprintf("\"\n");
#endif
*cp++ = 0;
savestr(locstring);
break;
case REVLAB:
loctree[0] = treloc(getaw());
#ifdef DEBUG
dptree(loctree[0]);
dprintf("\n");
#endif
label(loctree[0]);
break;
case REVCNST:
loctree[0] = getaw();
loctree[1] = sreloc(getaw());
loctree[2] = treloc(getaw());
#ifdef DEBUG
dprintf(" %d", loctree[0]);
dprintf(" \"%s\"", loctree[1]);
dptree(loctree[2]);
dprintf("\n");
#endif
const(loctree[0], loctree[1], loctree[2]);
break;
case REVTYPE:
loctree[0] = getaw();
loctree[1] = sreloc(getaw());
loctree[2] = treloc(getaw());
#ifdef DEBUG
dprintf(" %d", loctree[0]);
dprintf(" \"%s\"", loctree[1]);
dptree(loctree[2]);
dprintf("\n");
#endif
type(loctree[0], loctree[1], loctree[2]);
break;
case REVVAR:
loctree[0] = getaw();
loctree[1] = treloc(getaw());
loctree[2] = treloc(getaw());
#ifdef DEBUG
dprintf(" %d", loctree[0]);
dptree(loctree[1]);
dptree(loctree[2]);
dprintf("\n");
#endif
var(loctree[0], loctree[1], loctree[2]);
break;
case REVFHDR:
loctree[0] = treloc(getaw());
#ifdef DEBUG
dptree(loctree[0]);
dprintf("\n");
#endif
fp2[cbn] = funchdr(loctree[0]);
break;
case REVFBDY:
#ifdef DEBUG
dprintf("\n");
#endif
funcbody(fp2[cbn]);
break;
case REVFEND:
holdderr = 0;
loctree[0] = treloc(getaw());
loctree[1] = getaw();
loctree[2] = getaw();
lastname = sreloc(getaw());
filename = sreloc(getaw());
printed = getac();
hadsome = getac();
#ifdef DEBUG
dptree(loctree[0]);
dprintf(" %d", loctree[1]);
dprintf(" %d", loctree[2]);
dprintf(" lastname=%s", lastname);
dprintf(" filename=%s", filename);
dprintf(" printed=%d", printed);
dprintf(" hadsome=%d", hadsome);
dprintf("\n");
#endif
funcend(fp2[cbn-1], loctree[0], loctree[1], loctree[2]);
break;
case ROPUSH:
i = getaw();
opush(i);
#ifdef DEBUG
dprintf(" %c\n", i);
#endif
break;
case ROPOP:
i = getaw();
opop(i);
#ifdef DEBUG
dprintf(" %c\n", i);
#endif
break;
case ROSET:
ch = getac();
i = getaw();
#ifdef DEBUG
dprintf(" %c=", ch);
dprintf("%d\n", i);
#endif
opt(ch) = i;
break;
case RKILL:
#ifdef DEBUG
dprintf("I should be dead!\n");
#endif
panic("RKILL");
break;
case RFINISH:
#ifdef DEBUG
dprintf("\n");
#endif
magic2();
write(ackd, &eflg, 2);
break;
case -1:
ack();
#ifdef DEBUG
dprintf("\nEXIT\n");
#endif
exit(0);
default:
#ifdef DEBUG
dprintf("CODE=%d\n", i);
#endif
panic("rcv CODE");
}
}
}
ack()
{
extern Fp;
int i[3];
i[0] = lastname;
i[1] = Fp;
i[2] = (hadsome << 8) | printed;
write(ackd, i, 6);
}
#ifdef DEBUG
dprintf(a1, a2, a3, a4, a5)
{
if (opt('d'))
printf(a1, a2, a3, a4, a5);
}
dptree(j)
int j;
{
register int i;
i = toffset(j);
if (i >= ITREE)
dprintf(" p%d", i);
else if (i == 0)
dprintf(" NIL");
else
dprintf(" \"%s\"", j);
}
#endif