32V/usr/src/slowsys/sys/prim.c
#include "../h/param.h"
#include "../h/tty.h"
#include "../h/systm.h"
#include "../h/conf.h"
#include "../h/buf.h"
struct cblock {
struct cblock *c_next;
char c_info[CBSIZE];
};
struct cblock cfree[NCLIST];
struct cblock *cfreelist;
/*
* Character list get/put
*/
getc(p)
register struct clist *p;
{
register struct cblock *bp;
register int c, s;
s = spl6();
if (p->c_cc <= 0) {
c = -1;
p->c_cc = 0;
p->c_cf = p->c_cl = NULL;
} else {
c = *p->c_cf++ & 0377;
if (--p->c_cc<=0) {
bp = (struct cblock *)(p->c_cf-1);
bp = (struct cblock *) ((int)bp & ~CROUND);
p->c_cf = NULL;
p->c_cl = NULL;
bp->c_next = cfreelist;
cfreelist = bp;
} else if (((int)p->c_cf & CROUND) == 0){
bp = (struct cblock *)(p->c_cf);
bp--;
p->c_cf = bp->c_next->c_info;
bp->c_next = cfreelist;
cfreelist = bp;
}
}
splx(s);
return(c);
}
putc(c, p)
register struct clist *p;
{
register struct cblock *bp;
register char *cp;
register s;
s = spl6();
if ((cp = p->c_cl) == NULL || p->c_cc < 0 ) {
if ((bp = cfreelist) == NULL) {
splx(s);
return(-1);
}
cfreelist = bp->c_next;
bp->c_next = NULL;
p->c_cf = cp = bp->c_info;
} else if (((int)cp & CROUND) == 0) {
bp = (struct cblock *)cp - 1;
if ((bp->c_next = cfreelist) == NULL) {
splx(s);
return(-1);
}
bp = bp->c_next;
cfreelist = bp->c_next;
bp->c_next = NULL;
cp = bp->c_info;
}
*cp++ = c;
p->c_cc++;
p->c_cl = cp;
splx(s);
return(0);
}
/*
* Initialize clist by freeing all character blocks, then count
* number of character devices. (Once-only routine)
*/
cinit()
{
register int ccp;
register struct cblock *cp;
register struct cdevsw *cdp;
ccp = (int)cfree;
ccp = (ccp+CROUND) & ~CROUND;
for(cp=(struct cblock *)ccp; cp <= &cfree[NCLIST-1]; cp++) {
cp->c_next = cfreelist;
cfreelist = cp;
}
ccp = 0;
for(cdp = cdevsw; cdp->d_open; cdp++)
ccp++;
nchrdev = ccp;
}
/*
* integer (2-byte) get/put
* using clists
*/
getw(p)
register struct clist *p;
{
register int s;
if (p->c_cc <= 1)
return(-1);
s = getc(p);
return(s | (getc(p)<<8));
}
putw(c, p)
register struct clist *p;
{
register s;
s = spl6();
if (cfreelist==NULL) {
splx(s);
return(-1);
}
putc(c, p);
putc(c>>8, p);
splx(s);
return(0);
}