xref: /inferno-os/libbio/bgetc.c (revision 72335078034e3cd7edcb1739556b405a3e1e9bf8)
137da2899SCharles.Forsyth #include	"lib9.h"
237da2899SCharles.Forsyth #include	<bio.h>
337da2899SCharles.Forsyth 
437da2899SCharles.Forsyth int
Bgetc(Biobuf * bp)537da2899SCharles.Forsyth Bgetc(Biobuf *bp)
637da2899SCharles.Forsyth {
737da2899SCharles.Forsyth 	int i;
837da2899SCharles.Forsyth 
937da2899SCharles.Forsyth loop:
1037da2899SCharles.Forsyth 	i = bp->icount;
1137da2899SCharles.Forsyth 	if(i != 0) {
1237da2899SCharles.Forsyth 		bp->icount = i+1;
1337da2899SCharles.Forsyth 		return bp->ebuf[i];
1437da2899SCharles.Forsyth 	}
1537da2899SCharles.Forsyth 	if(bp->state != Bractive) {
1637da2899SCharles.Forsyth 		if(bp->state == Bracteof)
1737da2899SCharles.Forsyth 			bp->state = Bractive;
1837da2899SCharles.Forsyth 		return Beof;
1937da2899SCharles.Forsyth 	}
2037da2899SCharles.Forsyth 	/*
2137da2899SCharles.Forsyth 	 * get next buffer, try to keep Bungetsize
2237da2899SCharles.Forsyth 	 * characters pre-catenated from the previous
2337da2899SCharles.Forsyth 	 * buffer to allow that many ungets.
2437da2899SCharles.Forsyth 	 */
2537da2899SCharles.Forsyth 	memmove(bp->bbuf-Bungetsize, bp->ebuf-Bungetsize, Bungetsize);
2637da2899SCharles.Forsyth 	i = read(bp->fid, bp->bbuf, bp->bsize);
2737da2899SCharles.Forsyth 	bp->gbuf = bp->bbuf;
2837da2899SCharles.Forsyth 	if(i <= 0) {
29*72335078SCharles Forsyth 		bp->state = Bracteof;
3037da2899SCharles.Forsyth 		if(i < 0)
3137da2899SCharles.Forsyth 			bp->state = Binactive;
3237da2899SCharles.Forsyth 		return Beof;
3337da2899SCharles.Forsyth 	}
3437da2899SCharles.Forsyth 	if(i < bp->bsize) {
3537da2899SCharles.Forsyth 		memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, i+Bungetsize);
3637da2899SCharles.Forsyth 		bp->gbuf = bp->ebuf-i;
3737da2899SCharles.Forsyth 	}
3837da2899SCharles.Forsyth 	bp->icount = -i;
3937da2899SCharles.Forsyth 	bp->offset += i;
4037da2899SCharles.Forsyth 	goto loop;
4137da2899SCharles.Forsyth }
4237da2899SCharles.Forsyth 
4337da2899SCharles.Forsyth int
Bungetc(Biobuf * bp)4437da2899SCharles.Forsyth Bungetc(Biobuf *bp)
4537da2899SCharles.Forsyth {
4637da2899SCharles.Forsyth 
4737da2899SCharles.Forsyth 	if(bp->state == Bracteof)
4837da2899SCharles.Forsyth 		bp->state = Bractive;
4937da2899SCharles.Forsyth 	if(bp->state != Bractive)
5037da2899SCharles.Forsyth 		return Beof;
5137da2899SCharles.Forsyth 	bp->icount--;
5237da2899SCharles.Forsyth 	return 1;
5337da2899SCharles.Forsyth }
54