+ register int s, c;
+ register struct cblock *bp;
+
+ if (p->c_cc <= 1)
+ return(-1);
+ if (p->c_cc & 01) {
+ c = getc(p);
+#if BYTE_ORDER == LITTLE_ENDIAN
+ return (c | (getc(p)<<8));
+#else
+ return (getc(p) | (c<<8));
+#endif
+ }
+ s = spltty();
+#if BYTE_ORDER == LITTLE_ENDIAN
+ c = (((u_char *)p->c_cf)[0] << 8) | ((u_char *)p->c_cf)[1];
+#else
+ c = (((u_char *)p->c_cf)[1] << 8) | ((u_char *)p->c_cf)[0];
+#endif
+ p->c_cf += sizeof (word_t);
+ p->c_cc -= sizeof (word_t);
+ if (p->c_cc <= 0) {
+ bp = cbptr(p->c_cf-1);
+ bp = cbptr((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 = cbptr(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);