#include "core/utils/ArrayString.hpp" #include "core/utils/Error.hpp" static c32 read(const char*& s) { if(*s == '\0') { return 0; } return static_cast(*(s++)); } Core::Error Core::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; }