67 valid_utf8(
const char *
string,
int length)
71 for (p =
string; length-- > 0; p++) {
73 c = (
unsigned char)*p;
74 if (c < 128)
continue;
75 if (c < 0xc0)
return 1;
76 if (c >= 0xfe)
return 1;
78 ab = utf8_table4[c & 0x3f];
79 if (length < ab)
return 1;
84 if (((d = *(++p)) & 0xc0) != 0x80)
return 1;
97 if ((c & 0x3e) == 0)
return 1;
104 if ((*(++p) & 0xc0) != 0x80)
return 1;
105 if (c == 0xe0 && (d & 0x20) == 0)
return 1;
106 if (c == 0xed && d >= 0xa0)
return 1;
114 if ((*(++p) & 0xc0) != 0x80)
return 1;
115 if ((*(++p) & 0xc0) != 0x80)
return 1;
116 if (c == 0xf0 && (d & 0x30) == 0)
return 1;
117 if (c > 0xf4 || (c == 0xf4 && d > 0x8f))
return 1;
130 if ((*(++p) & 0xc0) != 0x80)
return 1;
131 if ((*(++p) & 0xc0) != 0x80)
return 1;
132 if ((*(++p) & 0xc0) != 0x80)
return 1;
133 if (c == 0xf8 && (d & 0x38) == 0)
return 1;
139 if ((*(++p) & 0xc0) != 0x80)
return 1;
140 if ((*(++p) & 0xc0) != 0x80)
return 1;
141 if ((*(++p) & 0xc0) != 0x80)
return 1;
142 if ((*(++p) & 0xc0) != 0x80)
return 1;
143 if (c == 0xfc && (d & 0x3c) == 0)
return 1;
150 if (ab > 3)
return 1;