String String::SubstringUTF8(unsigned pos) const { unsigned utf8Length = LengthUTF8(); unsigned byteOffset = ByteOffsetUTF8(pos); String ret; while (pos < utf8Length) { ret.AppendUTF8(NextUTF8Char(byteOffset)); ++pos; } return ret; }
String String::SubstringUTF8(size_t pos) const { size_t utf8Length = LengthUTF8(); size_t byteOffset = ByteOffsetUTF8(pos); String ret; while (pos < utf8Length) { ret.AppendUTF8(NextUTF8Char(byteOffset)); ++pos; } return ret; }
int main(int argc, char **argv) { plan_tests(2 * ARRAY_SIZE(valid) + 2 * ARRAY_SIZE(invalid) + 2 * ARRAY_SIZE(length) + 4 * ARRAY_SIZE(crop) + ARRAY_SIZE(latin1_chars) + #ifndef _UNICODE ARRAY_SIZE(truncate_string_tests) + #endif 9 + 27); for (auto i : valid) { ok1(ValidateUTF8(i)); ok1(LengthUTF8(i) == MyLengthUTF8(i)); } for (auto i : invalid) { ok1(!ValidateUTF8(i)); ok1(!MyValidateUTF8(i)); } for (auto &l : length) { ok1(l.length == LengthUTF8(l.value)); ok1(l.length == MyLengthUTF8(l.value)); } char buffer[64]; for (auto &l : latin1_chars) { *Latin1ToUTF8(l.ch, buffer) = 0; ok1(strcmp(l.utf8, buffer) == 0); } for (auto &c : crop) { strcpy(buffer, c.input); auto *end = CropIncompleteUTF8(buffer); ok1(strcmp(c.output, buffer) == 0); ok1(end != nullptr); ok1(*end == '\0'); ok1(end == buffer + strlen(buffer)); } #ifndef _UNICODE TestTruncateString(); #endif { const char *p = "foo\xe7\x9b\xae"; auto n = NextUTF8(p); ok1(n.first == 'f'); ok1(n.second == p + 1); n = NextUTF8(p + 1); ok1(n.first == 'o'); ok1(n.second == p + 2); n = NextUTF8(p + 2); ok1(n.first == 'o'); ok1(n.second == p + 3); n = NextUTF8(p + 3); ok1(n.first == 30446); ok1(n.second == p + 6); n = NextUTF8(p + 6); ok1(n.first == 0); } /* test UnicodeToUTF8() */ buffer[0] = 1; ok1(UnicodeToUTF8(0, buffer) == buffer + 1); ok1(buffer[0] == 0); ok1(UnicodeToUTF8(' ', buffer) == buffer + 1); ok1(buffer[0] == ' '); ok1(UnicodeToUTF8(0x7f, buffer) == buffer + 1); ok1(buffer[0] == 0x7f); ok1(UnicodeToUTF8(0xa2, buffer) == buffer + 2); ok1(buffer[0] == char(0xc2)); ok1(buffer[1] == char(0xa2)); ok1(UnicodeToUTF8(0x6fb3, buffer) == buffer + 3); ok1(buffer[0] == char(0xe6)); ok1(buffer[1] == char(0xbe)); ok1(buffer[2] == char(0xb3)); ok1(UnicodeToUTF8(0xffff, buffer) == buffer + 3); ok1(buffer[0] == char(0xef)); ok1(buffer[1] == char(0xbf)); ok1(buffer[2] == char(0xbf)); ok1(UnicodeToUTF8(0x10000, buffer) == buffer + 4); ok1(buffer[0] == char(0xf0)); ok1(buffer[1] == char(0x90)); ok1(buffer[2] == char(0x80)); ok1(buffer[3] == char(0x80)); ok1(UnicodeToUTF8(0x10ffff, buffer) == buffer + 4); ok1(buffer[0] == char(0xf4)); ok1(buffer[1] == char(0x8f)); ok1(buffer[2] == char(0xbf)); ok1(buffer[3] == char(0xbf)); return exit_status(); }
size_t GetCharacterCount() const { return event.type == SDL_TEXTINPUT && *event.text.text ? LengthUTF8(event.text.text) : 0; }
int main(int argc, char **argv) { plan_tests(ARRAY_SIZE(valid) + ARRAY_SIZE(invalid) + ARRAY_SIZE(length) + ARRAY_SIZE(crop) + ARRAY_SIZE(latin1_chars) + 9 + 27); for (auto i : valid) ok1(ValidateUTF8(i)); for (auto i : invalid) ok1(!ValidateUTF8(i)); for (auto &l : length) ok1(l.length == LengthUTF8(l.value)); char buffer[64]; for (auto &l : latin1_chars) { *Latin1ToUTF8(l.ch, buffer) = 0; ok1(strcmp(l.utf8, buffer) == 0); } for (auto &c : crop) { strcpy(buffer, c.input); CropIncompleteUTF8(buffer); ok1(strcmp(c.output, buffer) == 0); } { const char *p = "foo\xe7\x9b\xae"; auto n = NextUTF8(p); ok1(n.first == 'f'); ok1(n.second == p + 1); n = NextUTF8(p + 1); ok1(n.first == 'o'); ok1(n.second == p + 2); n = NextUTF8(p + 2); ok1(n.first == 'o'); ok1(n.second == p + 3); n = NextUTF8(p + 3); ok1(n.first == 30446); ok1(n.second == p + 6); n = NextUTF8(p + 6); ok1(n.first == 0); } /* test UnicodeToUTF8() */ buffer[0] = 1; ok1(UnicodeToUTF8(0, buffer) == buffer + 1); ok1(buffer[0] == 0); ok1(UnicodeToUTF8(' ', buffer) == buffer + 1); ok1(buffer[0] == ' '); ok1(UnicodeToUTF8(0x7f, buffer) == buffer + 1); ok1(buffer[0] == 0x7f); ok1(UnicodeToUTF8(0xa2, buffer) == buffer + 2); ok1(buffer[0] == char(0xc2)); ok1(buffer[1] == char(0xa2)); ok1(UnicodeToUTF8(0x6fb3, buffer) == buffer + 3); ok1(buffer[0] == char(0xe6)); ok1(buffer[1] == char(0xbe)); ok1(buffer[2] == char(0xb3)); ok1(UnicodeToUTF8(0xffff, buffer) == buffer + 3); ok1(buffer[0] == char(0xef)); ok1(buffer[1] == char(0xbf)); ok1(buffer[2] == char(0xbf)); ok1(UnicodeToUTF8(0x10000, buffer) == buffer + 4); ok1(buffer[0] == char(0xf0)); ok1(buffer[1] == char(0x90)); ok1(buffer[2] == char(0x80)); ok1(buffer[3] == char(0x80)); ok1(UnicodeToUTF8(0x10ffff, buffer) == buffer + 4); ok1(buffer[0] == char(0xf4)); ok1(buffer[1] == char(0x8f)); ok1(buffer[2] == char(0xbf)); ok1(buffer[3] == char(0xbf)); return exit_status(); }