bgetc.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
bgetc.c (927B) | |
--- | |
1 #include "lib9.h" | |
2 #include <bio.h> | |
3 | |
4 int | |
5 Bgetc(Biobuf *bp) | |
6 { | |
7 int i; | |
8 | |
9 loop: | |
10 i = bp->icount; | |
11 if(i != 0) { | |
12 bp->icount = i+1; | |
13 return bp->ebuf[i]; | |
14 } | |
15 if(bp->state != Bractive) { | |
16 if(bp->state == Bracteof) | |
17 bp->state = Bractive; | |
18 return Beof; | |
19 } | |
20 /* | |
21 * get next buffer, try to keep Bungetsize | |
22 * characters pre-catenated from the previous | |
23 * buffer to allow that many ungets. | |
24 */ | |
25 memmove(bp->bbuf-Bungetsize, bp->ebuf-Bungetsize, Bungetsize); | |
26 i = read(bp->fid, bp->bbuf, bp->bsize); | |
27 bp->gbuf = bp->bbuf; | |
28 if(i <= 0) { | |
29 bp->state = Bracteof; | |
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+Bu… | |
36 bp->gbuf = bp->ebuf-i; | |
37 } | |
38 bp->icount = -i; | |
39 bp->offset += i; | |
40 goto loop; | |
41 } | |
42 | |
43 int | |
44 Bungetc(Biobuf *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 } |