Blame


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