Loading

Paste #pptkm5kon

  1.  95 static int DecodeUtf8Char(uint8 *data, size_t length, uint32 *codepoint)
  2. 96 {
  3. 97  if (length < 1) return 0;
  4. 98  uint32 value = *data;
  5. 99  data++;
  6. 100  if ((value & 0x80) == 0) {
  7. 101  *codepoint = value;
  8. 102  return 1;
  9. 103  }
  10. 104  int size;
  11. 105  uint32 min_value;
  12. 106  if ((value & 0xE0) == 0xC0) {
  13. 107  size = 2;
  14. 108  min_value = 0x80;
  15. 109  value &= 0x1F;
  16. 110  } else if ((value & 0xF0) == 0xE0) {
  17. 111  size = 3;
  18. 112  min_value = 0x800;
  19. 113  value &= 0x0F;
  20. 114  } else if ((value & 0xF8) == 0xF0) {
  21. 115  size = 4;
  22. 116  min_value = 0x10000;
  23. 117  value &= 0x07;
  24. 118  } else {
  25. 119  return 0;
  26. 120  }
  27. 121
  28. 122  if (length < static_cast<size_t>(size)) return 0;
  29. 123  for (int n = 1; n < size; n++) {
  30. 124  uint8 val = *data;
  31. 125  data++;
  32. 126  if ((val & 0xC0) != 0x80) return 0;
  33. 127  value = (value << 6) | (val & 0x3F);
  34. 128  }
  35. 129  if (value < min_value || (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF) return 0;
  36. 130  *codepoint = value;
  37. 131  return size;
  38. 132 }

Comments