aboutsummaryrefslogtreecommitdiffstats
path: root/libcharconv_latin.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcharconv_latin.c')
-rw-r--r--libcharconv_latin.c52
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)