SRI-NOSC/dmr/oldstuff/mps.c
#define SAND 7
#define OOPEN 01
#define XLOWAT 10
#define XWAIT 04
struct clist
{
int c_cc;
int c_cf;
int c_cl;
};
struct
{
char flag;
char chano;
struct clist iq;
struct clist oq;
};
struct
{
char rstate;
char rchan;
char xstate;
char xchan;
char xcount;
} mps;
mpsr(d)
{
register c;
register *p;
if(mps.rstate == 0) {
if(d >= 128) {
mpr(d);
return;
}
mps.rchan = d;
mps.rstate = 1;
return;
}
c = mps.rchan;
if(mps.rstate == 1) {
if(c == 0 || c == 64) {
mpr(c);
mpr(d);
mps.rstate = 0;
return;
}
mps.rstate = -d;
return;
}
mps.rstate++;
if(mps.rstate == 0) {
mpr(c);
mpr(d);
return;
}
p = cptr(c);
if(p == 0)
goto err;
if(p->flag&OOPEN)
putc(d, &p->iq);
return;
err:
mps.rstate = 0;
}
mpsx()
{
register *p;
register d;
if(mps.xstate == 0) {
d = mpx();
if(d < 0 || d >= 128)
return(d);
if(d == 0 || d == 64) {
mps.xcount = 0;
mps.xstate = 2;
return(d);
}
mps.xchan = d;
mps.xstate = 1;
return(d);
}
if(mps.xstate == 1) {
p = cptr(invert(mps.xchan));
if(p == 0)
goto err;
d = p->oq.c_cc + 1;
if(d > SAND)
d = SAND;
mps.xcount = 1-d;
mps.xstate = 2;
return(d);
}
if(mps.xstate == 2) {
d = mpx();
mps.xstate = mps.xcount;
return(d);
}
p = cptr(invert(mps.xchan));
if(p == 0)
goto err;
d = getc(&p->oq);
if((p->flag & XWAIT) && p->oq.c_cc < XLOWAT) {
p->flag =& ~XWAIT;
wakeup(&p->oq);
}
mps.xstate++;
return(d);
err:
mps.xstate = 0;
return(mps.rchan);
}