| bgetrune.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
| git clone git://git.suckless.org/9base | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| bgetrune.c (635B) | |
| --- | |
| 1 #include "lib9.h" | |
| 2 #include <bio.h> | |
| 3 #include <utf.h> | |
| 4 | |
| 5 long | |
| 6 Bgetrune(Biobuf *bp) | |
| 7 { | |
| 8 int c, i; | |
| 9 Rune rune; | |
| 10 char str[UTFmax]; | |
| 11 | |
| 12 c = Bgetc(bp); | |
| 13 if(c < Runeself) { /* one char */ | |
| 14 bp->runesize = 1; | |
| 15 return c; | |
| 16 } | |
| 17 str[0] = c; | |
| 18 | |
| 19 for(i=1;;) { | |
| 20 c = Bgetc(bp); | |
| 21 if(c < 0) | |
| 22 return c; | |
| 23 str[i++] = c; | |
| 24 | |
| 25 if(fullrune(str, i)) { | |
| 26 bp->runesize = chartorune(&rune, str); | |
| 27 while(i > bp->runesize) { | |
| 28 Bungetc(bp); | |
| 29 i--; | |
| 30 } | |
| 31 return rune; | |
| 32 } | |
| 33 } | |
| 34 } | |
| 35 | |
| 36 int | |
| 37 Bungetrune(Biobuf *bp) | |
| 38 { | |
| 39 | |
| 40 if(bp->state == Bracteof) | |
| 41 bp->state = Bractive; | |
| 42 if(bp->state != Bractive) | |
| 43 return Beof; | |
| 44 bp->icount -= bp->runesize; | |
| 45 bp->runesize = 0; | |
| 46 return 1; | |
| 47 } |