@@ -123,10 +123,18 @@ _hs_text_decode_latin1(uint16_t *dest, const uint8_t const *src,
123 * state0 != UTF8_ACCEPT, UTF8_REJECT
123 * state0 != UTF8_ACCEPT, UTF8_REJECT
127+#if defined(__GNUC__) || defined(__clang__)
128+static inline uint8_t const *
129+_hs_text_decode_utf8_int(uint16_t *dest, size_t *destoff,
130+ const uint8_t const *src, const uint8_t const *srcend,
131+ uint32_t *codepoint0, uint32_t *state0)
132+ __attribute((always_inline));
126−uint8_t const *
134+static inline uint8_t const *
127−_hs_text_decode_utf8_state(uint16_t *dest, size_t *destoff,
135+_hs_text_decode_utf8_int(uint16_t *dest, size_t *destoff,
128− const uint8_t const *src, const uint8_t const *srcend,
136+ const uint8_t const *src, const uint8_t const *srcend,
129− uint32_t *codepoint0, uint32_t *state0)
137+ uint32_t *codepoint0, uint32_t *state0)
131 uint16_t *d = dest + *destoff;
139 uint16_t *d = dest + *destoff;
132 const uint8_t const *s = src;
140 const uint8_t const *s = src;
@@ -178,10 +186,6 @@ _hs_text_decode_utf8_state(uint16_t *dest, size_t *destoff,
181− /* Invalid encoding, back up to the errant character */
182− if (state == UTF8_REJECT)
185 *destoff = d - dest;
189 *destoff = d - dest;
186 *codepoint0 = codepoint;
190 *codepoint0 = codepoint;
187 *state0 = state;
191 *state0 = state;
@@ -189,6 +193,19 @@ _hs_text_decode_utf8_state(uint16_t *dest, size_t *destoff,
189 return s;
193 return s;
197+_hs_text_decode_utf8_state(uint16_t *dest, size_t *destoff,
198+ const uint8_t const *src,
199+ const uint8_t const *srcend,
200+ uint32_t *codepoint0, uint32_t *state0)
202+ uint8_t const *ret = _hs_text_decode_utf8_int(dest, destoff, src, srcend,
203+ codepoint0, state0);
204+ if (*state0 == UTF8_REJECT)
193 * Helper to decode buffer and discard final decoder state
210 * Helper to decode buffer and discard final decoder state
@@ -198,10 +215,10 @@ _hs_text_decode_utf8(uint16_t *dest, size_t *destoff,
199 uint32_t codepoint;
216 uint32_t codepoint;
200 uint32_t state = UTF8_ACCEPT;
217 uint32_t state = UTF8_ACCEPT;
201− uint8_t const *ret = _hs_text_decode_utf8_state(dest, destoff, src, srcend,
218+ uint8_t const *ret = _hs_text_decode_utf8_int(dest, destoff, src, srcend,
202− &codepoint, &state);
219+ &codepoint, &state);
203− /* Back up if we have an incomplete encoding */
220+ /* Back up if we have an incomplete or invalid encoding */
204− if (state != UTF8_ACCEPT && state != UTF8_REJECT)
221+ if (state != UTF8_ACCEPT)
205 ret -= 1;
222 ret -= 1;
206 return ret;
223 return ret;