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 63e12c5d1SDavid du Colombier Bgetc(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); 28*219b2ee8SDavid du Colombier bp->gbuf = bp->bbuf; 293e12c5d1SDavid du Colombier if(i <= 0) { 303e12c5d1SDavid du Colombier if(i < 0) 313e12c5d1SDavid du Colombier bp->state = Binactive; 323e12c5d1SDavid du Colombier return Beof; 333e12c5d1SDavid du Colombier } 34*219b2ee8SDavid du Colombier if(i < bp->bsize) { 353e12c5d1SDavid du Colombier memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, i+Bungetsize); 36*219b2ee8SDavid du Colombier bp->gbuf = bp->ebuf-i; 37*219b2ee8SDavid du Colombier } 383e12c5d1SDavid du Colombier bp->icount = -i; 393e12c5d1SDavid du Colombier bp->offset += i; 403e12c5d1SDavid du Colombier goto loop; 413e12c5d1SDavid du Colombier } 423e12c5d1SDavid du Colombier 433e12c5d1SDavid du Colombier int 443e12c5d1SDavid du Colombier Bungetc(Biobufhdr *bp) 453e12c5d1SDavid du Colombier { 463e12c5d1SDavid du Colombier 473e12c5d1SDavid du Colombier if(bp->state == Bracteof) 483e12c5d1SDavid du Colombier bp->state = Bractive; 493e12c5d1SDavid du Colombier if(bp->state != Bractive) 503e12c5d1SDavid du Colombier return Beof; 513e12c5d1SDavid du Colombier bp->icount--; 523e12c5d1SDavid du Colombier return 1; 533e12c5d1SDavid du Colombier } 54