xref: /plan9-contrib/sys/src/libbio/bgetc.c (revision f3e9c68aaa10d1977af2e6856bf303a75133e353)
13e12c5d1SDavid du Colombier #include	<u.h>
23e12c5d1SDavid du Colombier #include	<libc.h>
33e12c5d1SDavid du Colombier #include	<bio.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier int
Bgetc(Biobufhdr * bp)63e12c5d1SDavid du Colombier Bgetc(Biobufhdr *bp)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier 	int i;
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier loop:
113e12c5d1SDavid du Colombier 	i = bp->icount;
123e12c5d1SDavid du Colombier 	if(i != 0) {
133e12c5d1SDavid du Colombier 		bp->icount = i+1;
143e12c5d1SDavid du Colombier 		return bp->ebuf[i];
153e12c5d1SDavid du Colombier 	}
163e12c5d1SDavid du Colombier 	if(bp->state != Bractive) {
173e12c5d1SDavid du Colombier 		if(bp->state == Bracteof)
183e12c5d1SDavid du Colombier 			bp->state = Bractive;
193e12c5d1SDavid du Colombier 		return Beof;
203e12c5d1SDavid du Colombier 	}
213e12c5d1SDavid du Colombier 	/*
223e12c5d1SDavid du Colombier 	 * get next buffer, try to keep Bungetsize
233e12c5d1SDavid du Colombier 	 * characters pre-catenated from the previous
243e12c5d1SDavid du Colombier 	 * buffer to allow that many ungets.
253e12c5d1SDavid du Colombier 	 */
263e12c5d1SDavid du Colombier 	memmove(bp->bbuf-Bungetsize, bp->ebuf-Bungetsize, Bungetsize);
273e12c5d1SDavid du Colombier 	i = read(bp->fid, bp->bbuf, bp->bsize);
28219b2ee8SDavid du Colombier 	bp->gbuf = bp->bbuf;
293e12c5d1SDavid du Colombier 	if(i <= 0) {
30*f3e9c68aSDavid du Colombier 		bp->state = Bracteof;
313e12c5d1SDavid du Colombier 		if(i < 0)
323e12c5d1SDavid du Colombier 			bp->state = Binactive;
333e12c5d1SDavid du Colombier 		return Beof;
343e12c5d1SDavid du Colombier 	}
35219b2ee8SDavid du Colombier 	if(i < bp->bsize) {
363e12c5d1SDavid du Colombier 		memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, i+Bungetsize);
37219b2ee8SDavid du Colombier 		bp->gbuf = bp->ebuf-i;
38219b2ee8SDavid du Colombier 	}
393e12c5d1SDavid du Colombier 	bp->icount = -i;
403e12c5d1SDavid du Colombier 	bp->offset += i;
413e12c5d1SDavid du Colombier 	goto loop;
423e12c5d1SDavid du Colombier }
433e12c5d1SDavid du Colombier 
443e12c5d1SDavid du Colombier int
Bungetc(Biobufhdr * bp)453e12c5d1SDavid du Colombier Bungetc(Biobufhdr *bp)
463e12c5d1SDavid du Colombier {
473e12c5d1SDavid du Colombier 
483e12c5d1SDavid du Colombier 	if(bp->state == Bracteof)
493e12c5d1SDavid du Colombier 		bp->state = Bractive;
503e12c5d1SDavid du Colombier 	if(bp->state != Bractive)
513e12c5d1SDavid du Colombier 		return Beof;
523e12c5d1SDavid du Colombier 	bp->icount--;
533e12c5d1SDavid du Colombier 	return 1;
543e12c5d1SDavid du Colombier }
55