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