80 inline uint32_t
parse_start(
const uint8_t* str, int32_t* pos, int32_t len)
82 assert(
nullptr != str);
85 if (m_bytes_left_to_parse > 0)
87 uint8_t bytes_to_copy = len > 4 ? 4 : len;
88 memcpy(m_bytes_buffer + m_bytes_left_to_parse, str, bytes_to_copy);
90 [[maybe_unused]] uint8_t char_len =
parse(m_bytes_buffer, pos, m_bytes_left_to_parse + bytes_to_copy);
93 *pos = *pos - m_bytes_left_to_parse;
94 uint32_t rv = m_bytes_left_to_parse;
95 m_bytes_left_to_parse = 0;
103 inline uint8_t
parse(
const uint8_t* str, int32_t* pos, int32_t len)
106 int32_t prev_pos = *pos;
117 U8_NEXT(str, *pos, len, uch);
121 uint32_t bytes_left = len - prev_pos;
124 m_bytes_left_to_parse = bytes_left;
125 memcpy(m_bytes_buffer, str + prev_pos, m_bytes_left_to_parse);
129 throw std::runtime_error(
"Incorrect UTF-8 sequence.");
136 UErrorCode err = U_ZERO_ERROR;
138 uint8_t script_code = uscript_getScript(uch, &err);
140 UScriptCode raw_script_code = uscript_getScript(uch, &err);
141 assert(err == U_ZERO_ERROR);
142 assert(raw_script_code >= 0);
143 assert(raw_script_code < USCRIPT_CODE_LIMIT);
144 uint8_t script_code = raw_script_code;
147 m_prev_script_code = script_code;
149 uint8_t char_len = *pos - prev_pos;
150 assert(char_len > 0);
151 assert(char_len <= 6);