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