ArrayString.cpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include "core/utils/ArrayString.hpp"
  2. #include "core/utils/Error.hpp"
  3. static c32 read(const char*& s) {
  4. if(*s == '\0') {
  5. return 0;
  6. }
  7. return static_cast<c32>(*(s++));
  8. }
  9. Core::Error Core::readUnicode(c32& u, const char*& s) {
  10. u = read(s);
  11. if((u & 0x80) == 0) {
  12. return Error::NONE;
  13. }
  14. if((u & 0xE0) == 0xC0) {
  15. c32 u2 = read(s);
  16. if(u2 == 0) {
  17. return Error::INVALID_CHAR;
  18. }
  19. u = ((u & 0x1F) << 6) | (u2 & 0x3F);
  20. return Error::NONE;
  21. } else if((u & 0xF0) == 0xE0) {
  22. c32 u2 = read(s);
  23. c32 u3 = read(s);
  24. if(u2 == 0 || u3 == 0) {
  25. return Error::INVALID_CHAR;
  26. }
  27. u = ((u & 0xF) << 12) | ((u2 & 0x3F) << 6) | (u3 & 0x3F);
  28. return Error::NONE;
  29. } else if((u & 0xF8) == 0xF0) {
  30. c32 u2 = read(s);
  31. c32 u3 = read(s);
  32. c32 u4 = read(s);
  33. if(u2 == 0 || u3 == 0 || u4 == 0) {
  34. return Error::INVALID_CHAR;
  35. }
  36. u = ((u & 0x07) << 18) | ((u2 & 0x3F) << 12) | ((u3 & 0x3F) << 6) |
  37. (u4 & 0x3F);
  38. return Error::NONE;
  39. }
  40. return Error::INVALID_CHAR;
  41. }