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