1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 5 int Bgetc(Biobufhdr * bp)6Bgetc(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)45Bungetc(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