xref: /inferno-os/libkern/utfrrune.c (revision 3cd4f1d15146c08f05206d6328ecbc1c7fdc8dfa)
1*3cd4f1d1SCharles Forsyth #include "lib9.h"
237da2899SCharles.Forsyth 
337da2899SCharles.Forsyth char*
utfrrune(char * s,long c)437da2899SCharles.Forsyth utfrrune(char *s, long c)
537da2899SCharles.Forsyth {
637da2899SCharles.Forsyth 	long c1;
737da2899SCharles.Forsyth 	Rune r;
837da2899SCharles.Forsyth 	char *s1;
937da2899SCharles.Forsyth 
1037da2899SCharles.Forsyth 	if(c < Runesync)		/* not part of utf sequence */
1137da2899SCharles.Forsyth 		return strrchr(s, c);
1237da2899SCharles.Forsyth 
1337da2899SCharles.Forsyth 	s1 = 0;
1437da2899SCharles.Forsyth 	for(;;) {
1537da2899SCharles.Forsyth 		c1 = *(uchar*)s;
1637da2899SCharles.Forsyth 		if(c1 < Runeself) {	/* one byte rune */
1737da2899SCharles.Forsyth 			if(c1 == 0)
1837da2899SCharles.Forsyth 				return s1;
1937da2899SCharles.Forsyth 			if(c1 == c)
2037da2899SCharles.Forsyth 				s1 = s;
2137da2899SCharles.Forsyth 			s++;
2237da2899SCharles.Forsyth 			continue;
2337da2899SCharles.Forsyth 		}
2437da2899SCharles.Forsyth 		c1 = chartorune(&r, s);
2537da2899SCharles.Forsyth 		if(r == c)
2637da2899SCharles.Forsyth 			s1 = s;
2737da2899SCharles.Forsyth 		s += c1;
2837da2899SCharles.Forsyth 	}
2937da2899SCharles.Forsyth }
30