]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libbio/bgetc.c
mkpaqfs(8): allow setting compression level
[plan9front.git] / sys / src / libbio / bgetc.c
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 = bp->iof(bp, 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                         Berror(bp, "read error: %r");
34                 }
35                 return Beof;
36         }
37         if(i < bp->bsize) {
38                 memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, i+Bungetsize);
39                 bp->gbuf = bp->ebuf-i;
40         }
41         bp->icount = -i;
42         bp->offset += i;
43         goto loop;
44 }
45
46 int
47 Bungetc(Biobufhdr *bp)
48 {
49
50         if(bp->state == Bracteof)
51                 bp->state = Bractive;
52         if(bp->state != Bractive)
53                 return Beof;
54         bp->icount--;
55         return 1;
56 }