xref: /plan9/sys/src/libbio/bgetc.c (revision f3e9c68aaa10d1977af2e6856bf303a75133e353)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 
5 int
Bgetc(Biobufhdr * bp)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 		bp->state = Bracteof;
31 		if(i < 0)
32 			bp->state = Binactive;
33 		return Beof;
34 	}
35 	if(i < bp->bsize) {
36 		memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, i+Bungetsize);
37 		bp->gbuf = bp->ebuf-i;
38 	}
39 	bp->icount = -i;
40 	bp->offset += i;
41 	goto loop;
42 }
43 
44 int
Bungetc(Biobufhdr * bp)45 Bungetc(Biobufhdr *bp)
46 {
47 
48 	if(bp->state == Bracteof)
49 		bp->state = Bractive;
50 	if(bp->state != Bractive)
51 		return Beof;
52 	bp->icount--;
53 	return 1;
54 }
55