ref: 87de3d34335e20fdb2ad2c471f89173aa6610193
dir: /sys/src/libbio/bgetrune.c/
#include <u.h> #include <libc.h> #include <bio.h> long Bgetrune(Biobufhdr *bp) { int c, i; Rune rune; char str[UTFmax]; c = Bgetc(bp); if(c < Runeself) { /* one char */ bp->runesize = 1; return c; } str[0] = c; for(i=1;;) { c = Bgetc(bp); if(c < 0) return c; str[i++] = c; if(fullrune(str, i)) { bp->runesize = chartorune(&rune, str); while(i > bp->runesize) { Bungetc(bp); i--; } return rune; } } } int Bungetrune(Biobufhdr *bp) { if(bp->state == Bracteof) bp->state = Bractive; if(bp->state != Bractive) return Beof; bp->icount -= bp->runesize; bp->runesize = 0; return 1; }