xref: /plan9-contrib/sys/src/libbio/bgetc.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 
5 int
6 Bgetc(Biobufhdr *bp)
7 {
8 	int i;
9 
10 loop:
11 	i = bp->icount;
12 	if(i != 0) {
13 		bp->icount = i+1;
14 		return bp->ebuf[i];
15 	}
16 	if(bp->state != Bractive) {
17 		if(bp->state == Bracteof)
18 			bp->state = Bractive;
19 		return Beof;
20 	}
21 	/*
22 	 * get next buffer, try to keep Bungetsize
23 	 * characters pre-catenated from the previous
24 	 * buffer to allow that many ungets.
25 	 */
26 	memmove(bp->bbuf-Bungetsize, bp->ebuf-Bungetsize, Bungetsize);
27 	i = read(bp->fid, bp->bbuf, bp->bsize);
28 	bp->gbuf = bp->bbuf;
29 	if(i <= 0) {
30 		if(i < 0)
31 			bp->state = Binactive;
32 		return Beof;
33 	}
34 	if(i < bp->bsize) {
35 		memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, i+Bungetsize);
36 		bp->gbuf = bp->ebuf-i;
37 	}
38 	bp->icount = -i;
39 	bp->offset += i;
40 	goto loop;
41 }
42 
43 int
44 Bungetc(Biobufhdr *bp)
45 {
46 
47 	if(bp->state == Bracteof)
48 		bp->state = Bractive;
49 	if(bp->state != Bractive)
50 		return Beof;
51 	bp->icount--;
52 	return 1;
53 }
54