diff options
Diffstat (limited to 'libcharconv_latin.c')
| -rw-r--r-- | libcharconv_latin.c | 52 |
1 files changed, 3 insertions, 49 deletions
diff --git a/libcharconv_latin.c b/libcharconv_latin.c index be0b53c..052ab7b 100644 --- a/libcharconv_latin.c +++ b/libcharconv_latin.c @@ -1,51 +1,5 @@ /* See LICENSE file for copyright and license details. */ -#include "libcharconv.h" - - -static size_t -decode_utf8(const char *s, size_t slen, uint_least32_t *cp) -{ - uint_least32_t min, max; - size_t i, n; - - if (slen < 1u) - return 0u; - - if (!(s[0] & 0x80)) { - *cp = (uint_least32_t)s[0]; - return 1u; - } else if ((s[0] & 0xE0) == 0xC0) { - *cp = (uint_least32_t)s[0] & 0x3Fu; - n = 2u; - min = UINT32_C(0x80); - max = UINT32_C(0x800); - } else if ((s[0] & 0xF0) == 0xE0) { - *cp = (uint_least32_t)s[0] & 0x1Fu; - n = 3u; - min = UINT32_C(0x800); - max = UINT32_C(0x10000); - } else if ((s[0] & 0xF8) == 0xF0) { - *cp = (uint_least32_t)s[0] & 0x0Fu; - n = 4u; - min = UINT32_C(0x10000); - max = UINT32_C(0x110000); - } else { - return 0u; - } - - if (slen < n) - return n; - - for (i = 1u; i < n; i++) { - *cp <<= 6; - *cp |= (uint_least32_t)s[i] & 0x3Fu; - } - - if (min > *cp || *cp >= max) - return 0u; - - return n; -} +#include "lib-common.h" enum libcharconv_result @@ -58,7 +12,7 @@ libcharconv_latin(const char *s, size_t slen, size_t *n, uint_least32_t *cp, siz *n = 0; for (; slen; s++) { - clen = decode_utf8(s, slen, &c); + clen = libcharconv_decode_utf8_(s, slen, &c); if (clen > slen) return LIBCHARCONV_INDETERMINATE; if (!clen) { @@ -347,7 +301,7 @@ libcharconv_latin(const char *s, size_t slen, size_t *n, uint_least32_t *cp, siz ret = LIBCHARCONV_CONVERT_IF_END; goto budih_conv; } - clen = decode_utf8(s, slen, &c); + clen = libcharconv_decode_utf8_(s, slen, &c); if (clen > slen) return LIBCHARCONV_INDETERMINATE; if (!clen) |
