xref: /plan9/sys/src/libc/port/utfnlen.c (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
1*59cc4ca5SDavid du Colombier #include <u.h>
2*59cc4ca5SDavid du Colombier #include <libc.h>
3*59cc4ca5SDavid du Colombier 
4*59cc4ca5SDavid du Colombier int
utfnlen(char * s,long m)5*59cc4ca5SDavid du Colombier utfnlen(char *s, long m)
6*59cc4ca5SDavid du Colombier {
7*59cc4ca5SDavid du Colombier 	int c;
8*59cc4ca5SDavid du Colombier 	long n;
9*59cc4ca5SDavid du Colombier 	Rune rune;
10*59cc4ca5SDavid du Colombier 	char *es;
11*59cc4ca5SDavid du Colombier 
12*59cc4ca5SDavid du Colombier 	es = s + m;
13*59cc4ca5SDavid du Colombier 	for(n = 0; s < es; n++) {
14*59cc4ca5SDavid du Colombier 		c = *(uchar*)s;
15*59cc4ca5SDavid du Colombier 		if(c < Runeself){
16*59cc4ca5SDavid du Colombier 			if(c == '\0')
17*59cc4ca5SDavid du Colombier 				break;
18*59cc4ca5SDavid du Colombier 			s++;
19*59cc4ca5SDavid du Colombier 			continue;
20*59cc4ca5SDavid du Colombier 		}
21*59cc4ca5SDavid du Colombier 		if(!fullrune(s, es-s))
22*59cc4ca5SDavid du Colombier 			break;
23*59cc4ca5SDavid du Colombier 		s += chartorune(&rune, s);
24*59cc4ca5SDavid du Colombier 	}
25*59cc4ca5SDavid du Colombier 	return n;
26*59cc4ca5SDavid du Colombier }
27