xref: /inferno-os/lib9/utfrrune.c (revision ab545a4ce0f664cdb3c344770912616856dece27)
1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth 
3*37da2899SCharles.Forsyth char*
utfrrune(char * s,long c)4*37da2899SCharles.Forsyth utfrrune(char *s, long c)
5*37da2899SCharles.Forsyth {
6*37da2899SCharles.Forsyth 	long c1;
7*37da2899SCharles.Forsyth 	Rune r;
8*37da2899SCharles.Forsyth 	char *s1;
9*37da2899SCharles.Forsyth 
10*37da2899SCharles.Forsyth 	if(c < Runesync)		/* not part of utf sequence */
11*37da2899SCharles.Forsyth 		return strrchr(s, c);
12*37da2899SCharles.Forsyth 
13*37da2899SCharles.Forsyth 	s1 = 0;
14*37da2899SCharles.Forsyth 	for(;;) {
15*37da2899SCharles.Forsyth 		c1 = *(uchar*)s;
16*37da2899SCharles.Forsyth 		if(c1 < Runeself) {	/* one byte rune */
17*37da2899SCharles.Forsyth 			if(c1 == 0)
18*37da2899SCharles.Forsyth 				return s1;
19*37da2899SCharles.Forsyth 			if(c1 == c)
20*37da2899SCharles.Forsyth 				s1 = s;
21*37da2899SCharles.Forsyth 			s++;
22*37da2899SCharles.Forsyth 			continue;
23*37da2899SCharles.Forsyth 		}
24*37da2899SCharles.Forsyth 		c1 = chartorune(&r, s);
25*37da2899SCharles.Forsyth 		if(r == c)
26*37da2899SCharles.Forsyth 			s1 = s;
27*37da2899SCharles.Forsyth 		s += c1;
28*37da2899SCharles.Forsyth 	}
29*37da2899SCharles.Forsyth }
30