int check_utf8 (const char * string) {
// if you're trying to read and understand the UTF-8 functions... I'm sorry
int codepoint;
for (; *string; string ++) {
if (*string < 0x80) continue;
if (*string < 0xc2) return 0;
if (*string < 0xe0) {
if (string[1] < 0x80) return 0;
string ++;
continue;
}
if (*string < 0xf0) {
codepoint = get_utf8_codepoint((const unsigned char *) string + 1, *string, 2);
if (codepoint < 0x800) return 0;
if ((codepoint >= 0xd800) && (codepoint < 0xe000)) return 0;
string += 2;
continue;
}
if (*string < 0xf5) {
codepoint = get_utf8_codepoint((const unsigned char *) string + 1, *string, 3);
if (codepoint < 0x10000) return 0;
if (codepoint > 0x10ffff) return 0;
string += 3;
continue;
}
return 0;
}
return 1;
}
int get_utf8_codepoint (const unsigned char * continuations, unsigned char initial, unsigned char readahead) {
if (readahead > 6) return -1;
if (!readahead) return initial;
unsigned result = initial & ((1 << (6 - readahead)) - 1);
for (; readahead --; continuations ++) {
if ((*continuations < 0x80) || (*continuations >= 0xc0)) return -1;
result <<= 6;
result |= *continuations & 0x3f;
}
return result;
}
Comments