- for (i = 0; i < utf8_len; i++) {
- if ((utf8[i] & 0x80) == 0x00) {
- charval = utf8[i] & 0x7f;
- } else if ((utf8[i] & 0xe0) == 0xc0) {
- if (utf8_len < 2)
- return 0;
-
- if ((utf8[i + 1] & 0xc0) != 0x80)
- return 0;
-
- charval = (utf8[i++] & 0x1f) << 6;
- charval |= utf8[i] & 0x3f;
- if (charval < 0x80)
- return 0;
- } else if ((utf8[i] & 0xf0) == 0xe0) {
- if (utf8_len < 3)
- return 0;
-
- if (((utf8[i + 1] & 0xc0) != 0x80) ||
- ((utf8[i + 2] & 0xc0) != 0x80))
- return 0;
-
- charval = (utf8[i++] & 0xf) << 12;
- charval |= (utf8[i++] & 0x3f) << 6;
- charval |= utf8[i] & 0x3f;
- if (charval < 0x800)
- return 0;
- } else if ((utf8[i] & 0xf8) == 0xf0) {
- if (utf8_len < 4)
- return 0;
-
- if (((utf8[i + 1] & 0xc0) != 0x80) ||
- ((utf8[i + 2] & 0xc0) != 0x80) ||
- ((utf8[i + 3] & 0xc0) != 0x80))
- return 0;
-
- charval = ((SilcUInt32)(utf8[i++] & 0x7)) << 18;
- charval |= (utf8[i++] & 0x3f) << 12;
- charval |= (utf8[i++] & 0x3f) << 6;
- charval |= utf8[i] & 0x3f;
- if (charval < 0x10000)
- return 0;
- } else if ((utf8[i] & 0xfc) == 0xf8) {
- if (utf8_len < 5)
- return 0;
-
- if (((utf8[i + 1] & 0xc0) != 0x80) ||
- ((utf8[i + 2] & 0xc0) != 0x80) ||
- ((utf8[i + 3] & 0xc0) != 0x80) ||
- ((utf8[i + 4] & 0xc0) != 0x80))
- return 0;
-
- charval = ((SilcUInt32)(utf8[i++] & 0x3)) << 24;
- charval |= ((SilcUInt32)(utf8[i++] & 0x3f)) << 18;
- charval |= ((SilcUInt32)(utf8[i++] & 0x3f)) << 12;
- charval |= (utf8[i++] & 0x3f) << 6;
- charval |= utf8[i] & 0x3f;
- if (charval < 0x200000)
- return 0;
- } else if ((utf8[i] & 0xfe) == 0xfc) {
- if (utf8_len < 6)
- return 0;
-
- if (((utf8[i + 1] & 0xc0) != 0x80) ||
- ((utf8[i + 2] & 0xc0) != 0x80) ||
- ((utf8[i + 3] & 0xc0) != 0x80) ||
- ((utf8[i + 4] & 0xc0) != 0x80) ||
- ((utf8[i + 5] & 0xc0) != 0x80))
- return 0;
-
- charval = ((SilcUInt32)(utf8[i++] & 0x1)) << 30;
- charval |= ((SilcUInt32)(utf8[i++] & 0x3f)) << 24;
- charval |= ((SilcUInt32)(utf8[i++] & 0x3f)) << 18;
- charval |= ((SilcUInt32)(utf8[i++] & 0x3f)) << 12;
- charval |= (utf8[i++] & 0x3f) << 6;
- charval |= utf8[i] & 0x3f;
- if (charval < 0x4000000)
- return 0;
- } else {
- return 0;
- }