xref: /inferno-os/os/boot/pc/queue.c (revision 9dc22068e29604f4b484e746112a9a4efe6fd57f)
1 #include	"u.h"
2 #include	"lib.h"
3 #include	"mem.h"
4 #include	"dat.h"
5 #include	"fns.h"
6 #include	"io.h"
7 
8 int
9 qgetc(IOQ *q)
10 {
11 	int c;
12 
13 	if(q->in == q->out)
14 		return -1;
15 	c = *q->out;
16 	if(q->out == q->buf+sizeof(q->buf)-1)
17 		q->out = q->buf;
18 	else
19 		q->out++;
20 	return c;
21 }
22 
23 static int
24 qputc(IOQ *q, int c)
25 {
26 	uchar *nextin;
27 	if(q->in >= &q->buf[sizeof(q->buf)-1])
28 		nextin = q->buf;
29 	else
30 		nextin = q->in+1;
31 	if(nextin == q->out)
32 		return -1;
33 	*q->in = c;
34 	q->in = nextin;
35 	return 0;
36 }
37 
38 void
39 qinit(IOQ *q)
40 {
41 	q->in = q->out = q->buf;
42 	q->getc = qgetc;
43 	q->putc = qputc;
44 }
45