|
@@ -17,6 +17,8 @@ namespace Core {
|
|
|
return i;
|
|
|
}
|
|
|
|
|
|
+ Error readUnicode(c32& u, const char*& s);
|
|
|
+
|
|
|
template<int N, typename CharType>
|
|
|
class ArrayString final {
|
|
|
int length;
|
|
@@ -387,47 +389,6 @@ namespace Core {
|
|
|
return Core::putChar(static_cast<int>(((u >> shift) & a) | o));
|
|
|
}
|
|
|
|
|
|
- static c32 read(const char*& s) {
|
|
|
- if(*s == '\0') {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- return static_cast<c32>(*(s++));
|
|
|
- }
|
|
|
-
|
|
|
- static Error readUnicode(c32& u, const char*& s) {
|
|
|
- u = read(s);
|
|
|
- if((u & 0x80) == 0) {
|
|
|
- return Error::NONE;
|
|
|
- }
|
|
|
- if((u & 0xE0) == 0xC0) {
|
|
|
- c32 u2 = read(s);
|
|
|
- if(u2 == 0) {
|
|
|
- return Error::INVALID_CHAR;
|
|
|
- }
|
|
|
- u = ((u & 0x1F) << 6) | (u2 & 0x3F);
|
|
|
- return Error::NONE;
|
|
|
- } else if((u & 0xF0) == 0xE0) {
|
|
|
- c32 u2 = read(s);
|
|
|
- c32 u3 = read(s);
|
|
|
- if(u2 == 0 || u3 == 0) {
|
|
|
- return Error::INVALID_CHAR;
|
|
|
- }
|
|
|
- u = ((u & 0xF) << 12) | ((u2 & 0x3F) << 6) | (u3 & 0x3F);
|
|
|
- return Error::NONE;
|
|
|
- } else if((u & 0xF8) == 0xF0) {
|
|
|
- c32 u2 = read(s);
|
|
|
- c32 u3 = read(s);
|
|
|
- c32 u4 = read(s);
|
|
|
- if(u2 == 0 || u3 == 0 || u4 == 0) {
|
|
|
- return Error::INVALID_CHAR;
|
|
|
- }
|
|
|
- u = ((u & 0x07) << 18) | ((u2 & 0x3F) << 12) |
|
|
|
- ((u3 & 0x3F) << 6) | (u4 & 0x3F);
|
|
|
- return Error::NONE;
|
|
|
- }
|
|
|
- return Error::INVALID_CHAR;
|
|
|
- }
|
|
|
-
|
|
|
void addToHash(c32 u) {
|
|
|
hash = static_cast<u32>(2120251889) * hash + static_cast<u32>(u);
|
|
|
}
|
|
@@ -497,4 +458,4 @@ bool operator!=(const CharType* cs, const Core::ArrayString<N, CharType>& s) {
|
|
|
return s != cs;
|
|
|
}
|
|
|
|
|
|
-#endif
|
|
|
+#endif
|