|  | #include	"lib9.h" | 
|  | #include	<bio.h> | 
|  |  | 
|  | int | 
|  | Bgetc(Biobuf *bp) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | loop: | 
|  | i = bp->icount; | 
|  | if(i != 0) { | 
|  | bp->icount = i+1; | 
|  | return bp->ebuf[i]; | 
|  | } | 
|  | if(bp->state != Bractive) { | 
|  | if(bp->state == Bracteof) | 
|  | bp->state = Bractive; | 
|  | return Beof; | 
|  | } | 
|  | /* | 
|  | * get next buffer, try to keep Bungetsize | 
|  | * characters pre-catenated from the previous | 
|  | * buffer to allow that many ungets. | 
|  | */ | 
|  | memmove(bp->bbuf-Bungetsize, bp->ebuf-Bungetsize, Bungetsize); | 
|  | i = read(bp->fid, bp->bbuf, bp->bsize); | 
|  | bp->gbuf = bp->bbuf; | 
|  | if(i <= 0) { | 
|  | bp->state = Bracteof; | 
|  | if(i < 0) | 
|  | bp->state = Binactive; | 
|  | return Beof; | 
|  | } | 
|  | if(i < bp->bsize) { | 
|  | memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, i+Bungetsize); | 
|  | bp->gbuf = bp->ebuf-i; | 
|  | } | 
|  | bp->icount = -i; | 
|  | bp->offset += i; | 
|  | goto loop; | 
|  | } | 
|  |  | 
|  | int | 
|  | Bungetc(Biobuf *bp) | 
|  | { | 
|  |  | 
|  | if(bp->state == Bracteof) | 
|  | bp->state = Bractive; | 
|  | if(bp->state != Bractive) | 
|  | return Beof; | 
|  | bp->icount--; | 
|  | return 1; | 
|  | } |