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