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 }