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