#include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" void initq(IOQ *q) { lock(q); unlock(q); q->in = q->out = q->buf; q->puts = puts; q->putc = putc; } int putc(IOQ *q, int c) { uchar *next; if(q->in == &q->buf[NQ-1]) next = q->buf; else next = q->in+1; if(next == q->out) return -1; *q->in = c; q->in = next; return 0; } int getc(IOQ *q) { int c; if(q->in == q->out) return -1; c = *q->out; if(q->out == &q->buf[NQ-1]) q->out = q->buf; else q->out++; return c; } void puts(IOQ *q, void *buf, int n) { uchar *next; uchar *p = buf; for(; n; n--){ if(q->in == &q->buf[NQ-1]) next = q->buf; else next = q->in + 1; if(next == q->out) break; *q->in = *p++; q->in = next; } } int gets(IOQ *q, void *buf, int n) { uchar *p = buf; for(; n && q->out != q->in; n--){ *p++ = *q->out; if(q->out == &q->buf[NQ-1]) q->out = q->buf; else q->out++; } return p - (uchar*)buf; } int cangetc(void *arg) { IOQ *q; int n; q = (IOQ *)arg; n = q->in - q->out; if (n < 0) n += sizeof(q->buf); return n; } int canputc(void *arg) { IOQ *q; int n; q = (IOQ *)arg; n = q->out - q->in - 1; if (n < 0) n += sizeof(q->buf); return n; }