|
|
1.1 ! root 1: #define QUEUE_C ! 2: #include <queue.h> ! 3: #include <setup.h> ! 4: ! 5: /* ! 6: * These macros are for speed, not size. ! 7: */ ! 8: #define pswmax() asm(" PUSHW %psw ");\ ! 9: asm(" ORW2 &0x1e000,%psw ");\ ! 10: asm(" TSTW %r0 ") ! 11: ! 12: #define pswback() asm(" POPW %psw ");\ ! 13: asm(" TSTW %r0 ") ! 14: qinit(){ ! 15: register i; ! 16: ! 17: for(i=1; i<NCHARS-1; i++) ! 18: cbuf_next[i] = i+1; ! 19: cbuf_next[i] = 0; ! 20: freelist=1; ! 21: freemark = (9*NCHARS)/10; ! 22: } ! 23: qputc(q, w) ! 24: register struct clist *q; ! 25: int w; ! 26: { ! 27: register p; ! 28: pswmax(); ! 29: p=freelist; ! 30: if(p==0 || (freemark <= 0 && !(q->state & QPRIORITY))){ ! 31: pswback(); ! 32: if(!VALDWNLDFLAG ) ! 33: ringbell(); /* send a warning to the user */ ! 34: return(0); ! 35: } ! 36: freelist=cbuf_next[p]; ! 37: --freemark; ! 38: cbuf_next[p]=0; ! 39: cbuf_word[p]=w; ! 40: if(q->c_cc==0) ! 41: q->c_head=q->c_tail=p; ! 42: else{ ! 43: cbuf_next[q->c_tail]=p; ! 44: q->c_tail=p; ! 45: } ! 46: p = ++q->c_cc; ! 47: pswback(); ! 48: return(p); ! 49: } ! 50: qputstr(q, str) ! 51: register struct clist *q; ! 52: register char *str; ! 53: { ! 54: register retval; ! 55: do; while(*str && ((retval=qputc(q, *str++))>=0)); ! 56: return retval; ! 57: } ! 58: qgetc(q) ! 59: register struct clist *q; ! 60: { ! 61: register p; ! 62: register x; ! 63: pswmax(); ! 64: if((p=q->c_head)==0){ ! 65: pswback(); ! 66: return(-1); ! 67: } ! 68: if(--q->c_cc==0) ! 69: q->c_head=q->c_tail=0; ! 70: else ! 71: q->c_head=cbuf_next[p]; ! 72: cbuf_next[p]=freelist; ! 73: x=cbuf_word[p]; ! 74: freelist=p; ! 75: ++freemark; ! 76: pswback(); ! 77: return(x); ! 78: } ! 79: qclear(q) ! 80: register struct clist *q; ! 81: { ! 82: pswmax(); ! 83: if(q->c_cc == 0){ ! 84: pswback(); ! 85: return; ! 86: } ! 87: freemark += q->c_cc; ! 88: q->c_cc=0; ! 89: cbuf_next[q->c_tail]=freelist; ! 90: freelist=q->c_head; ! 91: q->c_head=0; ! 92: q->c_tail=0; ! 93: q->state=0; ! 94: pswback(); ! 95: } ! 96: qpeekc(q) ! 97: register struct clist *q; ! 98: { ! 99: register p; ! 100: return (p=q->c_head) ? cbuf_word[p] : -1; ! 101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.