xref: /plan9/sys/src/cmd/unix/u9fs/utfrune.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include <plan9.h>
2*9a747e4fSDavid du Colombier 
3*9a747e4fSDavid du Colombier char*
utfrune(char * s,long c)4*9a747e4fSDavid du Colombier utfrune(char *s, long c)
5*9a747e4fSDavid du Colombier {
6*9a747e4fSDavid du Colombier 	long c1;
7*9a747e4fSDavid du Colombier 	Rune r;
8*9a747e4fSDavid du Colombier 	int n;
9*9a747e4fSDavid du Colombier 
10*9a747e4fSDavid du Colombier 	if(c < Runesync)		/* not part of utf sequence */
11*9a747e4fSDavid du Colombier 		return strchr(s, c);
12*9a747e4fSDavid du Colombier 
13*9a747e4fSDavid du Colombier 	for(;;) {
14*9a747e4fSDavid du Colombier 		c1 = *(uchar*)s;
15*9a747e4fSDavid du Colombier 		if(c1 < Runeself) {	/* one byte rune */
16*9a747e4fSDavid du Colombier 			if(c1 == 0)
17*9a747e4fSDavid du Colombier 				return 0;
18*9a747e4fSDavid du Colombier 			if(c1 == c)
19*9a747e4fSDavid du Colombier 				return s;
20*9a747e4fSDavid du Colombier 			s++;
21*9a747e4fSDavid du Colombier 			continue;
22*9a747e4fSDavid du Colombier 		}
23*9a747e4fSDavid du Colombier 		n = chartorune(&r, s);
24*9a747e4fSDavid du Colombier 		if(r == c)
25*9a747e4fSDavid du Colombier 			return s;
26*9a747e4fSDavid du Colombier 		s += n;
27*9a747e4fSDavid du Colombier 	}
28*9a747e4fSDavid du Colombier 	return 0;
29*9a747e4fSDavid du Colombier }
30