137da2899SCharles.Forsyth #include "lib9.h" 237da2899SCharles.Forsyth #include <bio.h> 337da2899SCharles.Forsyth 437da2899SCharles.Forsyth int Bgetc(Biobuf * bp)537da2899SCharles.ForsythBgetc(Biobuf *bp) 637da2899SCharles.Forsyth { 737da2899SCharles.Forsyth int i; 837da2899SCharles.Forsyth 937da2899SCharles.Forsyth loop: 1037da2899SCharles.Forsyth i = bp->icount; 1137da2899SCharles.Forsyth if(i != 0) { 1237da2899SCharles.Forsyth bp->icount = i+1; 1337da2899SCharles.Forsyth return bp->ebuf[i]; 1437da2899SCharles.Forsyth } 1537da2899SCharles.Forsyth if(bp->state != Bractive) { 1637da2899SCharles.Forsyth if(bp->state == Bracteof) 1737da2899SCharles.Forsyth bp->state = Bractive; 1837da2899SCharles.Forsyth return Beof; 1937da2899SCharles.Forsyth } 2037da2899SCharles.Forsyth /* 2137da2899SCharles.Forsyth * get next buffer, try to keep Bungetsize 2237da2899SCharles.Forsyth * characters pre-catenated from the previous 2337da2899SCharles.Forsyth * buffer to allow that many ungets. 2437da2899SCharles.Forsyth */ 2537da2899SCharles.Forsyth memmove(bp->bbuf-Bungetsize, bp->ebuf-Bungetsize, Bungetsize); 2637da2899SCharles.Forsyth i = read(bp->fid, bp->bbuf, bp->bsize); 2737da2899SCharles.Forsyth bp->gbuf = bp->bbuf; 2837da2899SCharles.Forsyth if(i <= 0) { 29*72335078SCharles Forsyth bp->state = Bracteof; 3037da2899SCharles.Forsyth if(i < 0) 3137da2899SCharles.Forsyth bp->state = Binactive; 3237da2899SCharles.Forsyth return Beof; 3337da2899SCharles.Forsyth } 3437da2899SCharles.Forsyth if(i < bp->bsize) { 3537da2899SCharles.Forsyth memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, i+Bungetsize); 3637da2899SCharles.Forsyth bp->gbuf = bp->ebuf-i; 3737da2899SCharles.Forsyth } 3837da2899SCharles.Forsyth bp->icount = -i; 3937da2899SCharles.Forsyth bp->offset += i; 4037da2899SCharles.Forsyth goto loop; 4137da2899SCharles.Forsyth } 4237da2899SCharles.Forsyth 4337da2899SCharles.Forsyth int Bungetc(Biobuf * bp)4437da2899SCharles.ForsythBungetc(Biobuf *bp) 4537da2899SCharles.Forsyth { 4637da2899SCharles.Forsyth 4737da2899SCharles.Forsyth if(bp->state == Bracteof) 4837da2899SCharles.Forsyth bp->state = Bractive; 4937da2899SCharles.Forsyth if(bp->state != Bractive) 5037da2899SCharles.Forsyth return Beof; 5137da2899SCharles.Forsyth bp->icount--; 5237da2899SCharles.Forsyth return 1; 5337da2899SCharles.Forsyth } 54