13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <bio.h> 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier int Bgetc(Biobufhdr * bp)63e12c5d1SDavid du ColombierBgetc(Biobufhdr *bp) 73e12c5d1SDavid du Colombier { 83e12c5d1SDavid du Colombier int i; 93e12c5d1SDavid du Colombier 103e12c5d1SDavid du Colombier loop: 113e12c5d1SDavid du Colombier i = bp->icount; 123e12c5d1SDavid du Colombier if(i != 0) { 133e12c5d1SDavid du Colombier bp->icount = i+1; 143e12c5d1SDavid du Colombier return bp->ebuf[i]; 153e12c5d1SDavid du Colombier } 163e12c5d1SDavid du Colombier if(bp->state != Bractive) { 173e12c5d1SDavid du Colombier if(bp->state == Bracteof) 183e12c5d1SDavid du Colombier bp->state = Bractive; 193e12c5d1SDavid du Colombier return Beof; 203e12c5d1SDavid du Colombier } 213e12c5d1SDavid du Colombier /* 223e12c5d1SDavid du Colombier * get next buffer, try to keep Bungetsize 233e12c5d1SDavid du Colombier * characters pre-catenated from the previous 243e12c5d1SDavid du Colombier * buffer to allow that many ungets. 253e12c5d1SDavid du Colombier */ 263e12c5d1SDavid du Colombier memmove(bp->bbuf-Bungetsize, bp->ebuf-Bungetsize, Bungetsize); 273e12c5d1SDavid du Colombier i = read(bp->fid, bp->bbuf, bp->bsize); 28219b2ee8SDavid du Colombier bp->gbuf = bp->bbuf; 293e12c5d1SDavid du Colombier if(i <= 0) { 30*f3e9c68aSDavid du Colombier bp->state = Bracteof; 313e12c5d1SDavid du Colombier if(i < 0) 323e12c5d1SDavid du Colombier bp->state = Binactive; 333e12c5d1SDavid du Colombier return Beof; 343e12c5d1SDavid du Colombier } 35219b2ee8SDavid du Colombier if(i < bp->bsize) { 363e12c5d1SDavid du Colombier memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, i+Bungetsize); 37219b2ee8SDavid du Colombier bp->gbuf = bp->ebuf-i; 38219b2ee8SDavid du Colombier } 393e12c5d1SDavid du Colombier bp->icount = -i; 403e12c5d1SDavid du Colombier bp->offset += i; 413e12c5d1SDavid du Colombier goto loop; 423e12c5d1SDavid du Colombier } 433e12c5d1SDavid du Colombier 443e12c5d1SDavid du Colombier int Bungetc(Biobufhdr * bp)453e12c5d1SDavid du ColombierBungetc(Biobufhdr *bp) 463e12c5d1SDavid du Colombier { 473e12c5d1SDavid du Colombier 483e12c5d1SDavid du Colombier if(bp->state == Bracteof) 493e12c5d1SDavid du Colombier bp->state = Bractive; 503e12c5d1SDavid du Colombier if(bp->state != Bractive) 513e12c5d1SDavid du Colombier return Beof; 523e12c5d1SDavid du Colombier bp->icount--; 533e12c5d1SDavid du Colombier return 1; 543e12c5d1SDavid du Colombier } 55