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