PWB1/sys/source/rje/rjestat/rjestat2.c
#
/* rjestat2.c */
/* This information is proprietary and is the property of Bell
Telephone Laboratories, Incorporated. Its reproduction or
disclosure to others, either orally or in writing, is pro-
hibited without written permission of Bell Laboratories. */
#define IDMOD rstat2
#define IDSTR "~|^`rjestat2.c 1.4 1/29/76
#include "rjestat.h"
struct fcns
{int (*fnam)();
int farg;
int fdel;};
struct fcns *fcn0,*fcn1,*fcnx;
#define NFCN 20
struct fcns fcntab[NFCN];
inifcn()
{fcn0=fcn1=fcntab;
fcnx=fcntab+NFCN;};
enq(fcn,arg,del)
int (*fcn)();
{register struct fcns *r;
register int fnd,zdl;
zdl=(del<0? 0:del);
fnd=0;
for (r=fcn0;r<fcn1;r++)
{if (fnd)
{if (r->fnam==fcn && r->farg==arg) deq(r--);
continue;};
if (del<r->fdel)
{if (r->fnam!=fcn || r->farg!=arg) upq(r);
r->fnam=fcn; r->farg=arg; r->fdel=zdl;};
if (r->fnam==fcn && r->farg==arg) fnd=1;};
if (fnd==0 && r<fcnx)
{fcn1++;
r->fnam=fcn; r->farg=arg; r->fdel=zdl;};};
deq(rr)
struct fcns *rr;
{register struct fcns *r;
fcn1--;
for (r=rr;r<fcn1;r++)
{r->fnam=(r+1)->fnam;
r->farg=(r+1)->farg;
r->fdel=(r+1)->fdel;};};
upq(rr)
struct fcns *rr;
{register struct fcns *r;
if (fcn1<fcnx) fcn1++;
for (r=fcn1-1;r>rr;r--)
{r->fnam=(r-1)->fnam;
r->farg=(r-1)->farg;
r->fdel=(r-1)->fdel;};};
tmq(d)
{register struct fcns *r;
register int t;
for (r=fcn0;r<fcn1;r++)
{t=r->fdel-d;
if (t<0) t=0;
r->fdel=t;};};
xeq()
{register struct fcns *r;
register int (*fcn)(),arg;
r=fcn0;
if (r>=fcn1) exit(0);
if (r->fdel<=0)
{fcn=r->fnam;
arg=r->farg;
deq(r);
(*fcn)(arg);};
return (r->fdel);};
struct opls
{struct opls *onxt;
int ocnt;
char *odat;
int otim[2];};
struct opls *opl0,*opl1;
#define NOPL 7
struct opls opltab[NOPL];
#define NOPX 500
char opx[NOPX];
iniopl()
{register struct opls *r;
register int t;
r=opltab+(NOPL-1);
for (t=0;t<NOPL;t++)
{r=r->onxt=opltab+t;};
opl0=opl1=r;};
char *getopl(n)
{register struct opls *r,*r0;
register char *p;
r=opl1; r0=opl0;
if (r==r0) r->odat=opx;
p=r->odat+n;
if (r->odat>=r0->odat)
{if (p<=opx+NOPX) return (r->odat);
p=(r->odat=opx)+n;};
while (r0!=r && p>r0->odat) r0=r0->onxt;
opl0=r0;
return (r->odat);};
putopl(n)
{register struct opls *r;
register char *p;
register int *v;
r=opl1;
r->ocnt=n;
p=r->odat;
v=r->otim;
r=r->onxt;
opl1=r;
if (r==opl0) opl0=r->onxt;
r->odat=p+n;
if ((flag&FINT)==0) write(1,p,n);
time(v);};
backsp()
{extern display();
static struct opls *bk;
register struct opls *r;
register int t;
if ((flag&FBKS)==0)
{flag=|FBKS;
for (r=opl0;r!=opl1 && del2(r->otim,itim)>((r->ocnt+60)>>5);) r=r->onxt;
opl0=bk=r;};
if (flag&FINT)
{bk=opl0; return;};
r=bk;
bk=r->onxt;
if (r==opl1)
{flag=& ~FBKS;
for (t=0;t<nlin;t++) enq(display,t,0);
return;};
write(1,r->odat,r->ocnt);
time(r->otim);
enq(backsp,0,(r->ocnt+20)>>5);};
/*end*/