Blob


1 #include "lib9.h"
2 #include <bio.h>
3 #include <utf.h>
5 long
6 Bgetrune(Biobuf *bp)
7 {
8 int c, i;
9 Rune rune;
10 char str[UTFmax];
12 c = Bgetc(bp);
13 if(c < Runeself) { /* one char */
14 bp->runesize = 1;
15 return c;
16 }
17 str[0] = c;
19 for(i=1;;) {
20 c = Bgetc(bp);
21 if(c < 0)
22 return c;
23 str[i++] = c;
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 }
36 int
37 Bungetrune(Biobuf *bp)
38 {
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 }