+ register int s, c;
+ register struct cblock *bp;
+
+ if (p->c_cc <= 1)
+ return(-1);
+ if (p->c_cc & 01) {
+ c = getc(p);
+ return(c | (getc(p)<<8));
+ }
+ s = spltty();
+ c = *((word_t *)p->c_cf);
+ p->c_cf += sizeof(word_t);
+ p->c_cc -= sizeof(word_t);
+ 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;
+ cfreecount += CBSIZE;
+ if (cwaiting) {
+ wakeup(&cwaiting);
+ cwaiting = 0;
+ }
+ } 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;
+ cfreecount += CBSIZE;
+ if (cwaiting) {
+ wakeup(&cwaiting);
+ cwaiting = 0;
+ }
+ }
+ splx(s);
+ return (c);