-int
-utf8decode(char *s, long *u) {
- uchar c;
- int i, n, rtn;
-
- rtn = 1;
- c = *s;
- if(~c & 0x80) { /* 0xxxxxxx */
- *u = c;
- return rtn;
- } else if((c & 0xE0) == 0xC0) { /* 110xxxxx */
- *u = c & 0x1F;
- n = 1;
- } else if((c & 0xF0) == 0xE0) { /* 1110xxxx */
- *u = c & 0x0F;
- n = 2;
- } else if((c & 0xF8) == 0xF0) { /* 11110xxx */
- *u = c & 0x07;
- n = 3;
- } else {
- goto invalid;
- }
-
- for(i = n, ++s; i > 0; --i, ++rtn, ++s) {
- c = *s;
- if((c & 0xC0) != 0x80) /* 10xxxxxx */
- goto invalid;
- *u <<= 6;
- *u |= c & 0x3F;
- }
-
- if((n == 1 && *u < 0x80) ||
- (n == 2 && *u < 0x800) ||
- (n == 3 && *u < 0x10000) ||
- (*u >= 0xD800 && *u <= 0xDFFF)) {
- goto invalid;
- }
-
- return rtn;
-invalid:
- *u = 0xFFFD;
+size_t
+utf8decode(char *c, long *u, size_t clen) {
+ size_t i, j, len, type;
+ long udecoded;