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