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