aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2026-01-24 15:02:15 +0100
committerMattias Andrée <m@maandree.se>2026-01-24 15:02:15 +0100
commiteb66f3a037ac18ab51636d160523ba99f050b57a (patch)
tree64fe4f3c1d951cce7fd68d38a2c1af01fed21f9a
parentAdd replacement (diff)
downloadcharconv-eb66f3a037ac18ab51636d160523ba99f050b57a.tar.gz
charconv-eb66f3a037ac18ab51636d160523ba99f050b57a.tar.bz2
charconv-eb66f3a037ac18ab51636d160523ba99f050b57a.tar.xz
Make UTF-8 decoding function available to the entire library
Signed-off-by: Mattias Andrée <m@maandree.se>
-rw-r--r--Makefile12
-rw-r--r--lib-common.h6
-rw-r--r--libcharconv_bold.c2
-rw-r--r--libcharconv_bold_fraktur.c2
-rw-r--r--libcharconv_bold_italic.c2
-rw-r--r--libcharconv_bold_script.c2
-rw-r--r--libcharconv_buhid.c2
-rw-r--r--libcharconv_cypriot.c2
-rw-r--r--libcharconv_decode_utf8_.c48
-rw-r--r--libcharconv_dice.c2
-rw-r--r--libcharconv_double_struck.c2
-rw-r--r--libcharconv_double_struck_italic.c2
-rw-r--r--libcharconv_draughts.c2
-rw-r--r--libcharconv_fraktur.c2
-rw-r--r--libcharconv_gender_symbols.c2
-rw-r--r--libcharconv_go_black.c2
-rw-r--r--libcharconv_go_white.c2
-rw-r--r--libcharconv_italic.c2
-rw-r--r--libcharconv_latin.c52
-rw-r--r--libcharconv_monospace.c2
-rw-r--r--libcharconv_region_indicators.c2
-rw-r--r--libcharconv_replacement.c3
-rw-r--r--libcharconv_sans_serif.c2
-rw-r--r--libcharconv_sans_serif_bold.c2
-rw-r--r--libcharconv_sans_serif_bold_italic.c2
-rw-r--r--libcharconv_sans_serif_italic.c2
-rw-r--r--libcharconv_script.c2
-rw-r--r--libcharconv_segmented.c2
-rw-r--r--libcharconv_shogi.c2
-rw-r--r--libcharconv_tags.c2
30 files changed, 88 insertions, 83 deletions
diff --git a/Makefile b/Makefile
index 76d3333..026f4c0 100644
--- a/Makefile
+++ b/Makefile
@@ -45,6 +45,7 @@ BIN =\
convert-to-replacement
LIBOBJ =\
+ libcharconv_decode_utf8_.o\
libcharconv_shogi.o\
libcharconv_dice.o\
libcharconv_go_white.o\
@@ -73,19 +74,16 @@ LIBOBJ =\
libcharconv_buhid.o\
libcharconv_replacement.o
-HDR =\
- libcharconv.h
-
LOBJ = $(LIBOBJ:.o=.lo)
BINOBJ = $(BIN:=.o) common.o
all: libcharconv.a libcharconv.$(LIBEXT) $(BIN)
-common.o: $(HDR)
-$(LIBOBJ): $(HDR)
-$(BINOBJ): $(HDR) common.h
-$(LOBJ): $(HDR)
+common.o: libcharconv.h common.h
+$(BINOBJ): libcharconv.h common.h
+$(LIBOBJ): libcharconv.h lib-common.h
+$(LOBJ): libcharconv.h lib-common.h
$(BIN): common.o libcharconv.a
.c.o:
diff --git a/lib-common.h b/lib-common.h
new file mode 100644
index 0000000..899418c
--- /dev/null
+++ b/lib-common.h
@@ -0,0 +1,6 @@
+/* See LICENSE file for copyright and license details. */
+#include "libcharconv.h"
+#include <strings.h>
+
+
+size_t libcharconv_decode_utf8_(const char *s, size_t slen, uint_least32_t *cp);
diff --git a/libcharconv_bold.c b/libcharconv_bold.c
index c405368..9e1bd6e 100644
--- a/libcharconv_bold.c
+++ b/libcharconv_bold.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_bold_fraktur.c b/libcharconv_bold_fraktur.c
index 614ff3d..50c6004 100644
--- a/libcharconv_bold_fraktur.c
+++ b/libcharconv_bold_fraktur.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_bold_italic.c b/libcharconv_bold_italic.c
index e0bbe6e..15b309b 100644
--- a/libcharconv_bold_italic.c
+++ b/libcharconv_bold_italic.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_bold_script.c b/libcharconv_bold_script.c
index ba8b026..d3a5c7a 100644
--- a/libcharconv_bold_script.c
+++ b/libcharconv_bold_script.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_buhid.c b/libcharconv_buhid.c
index 812a1c0..8abad6a 100644
--- a/libcharconv_buhid.c
+++ b/libcharconv_buhid.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_cypriot.c b/libcharconv_cypriot.c
index d7fa5af..17237eb 100644
--- a/libcharconv_cypriot.c
+++ b/libcharconv_cypriot.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_decode_utf8_.c b/libcharconv_decode_utf8_.c
new file mode 100644
index 0000000..db66040
--- /dev/null
+++ b/libcharconv_decode_utf8_.c
@@ -0,0 +1,48 @@
+/* See LICENSE file for copyright and license details. */
+#include "lib-common.h"
+
+
+size_t
+libcharconv_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;
+}
diff --git a/libcharconv_dice.c b/libcharconv_dice.c
index 941a837..dc02bb5 100644
--- a/libcharconv_dice.c
+++ b/libcharconv_dice.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_double_struck.c b/libcharconv_double_struck.c
index de29727..ae64247 100644
--- a/libcharconv_double_struck.c
+++ b/libcharconv_double_struck.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_double_struck_italic.c b/libcharconv_double_struck_italic.c
index 5165362..beb80a0 100644
--- a/libcharconv_double_struck_italic.c
+++ b/libcharconv_double_struck_italic.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_draughts.c b/libcharconv_draughts.c
index 0f717e7..b45f4fe 100644
--- a/libcharconv_draughts.c
+++ b/libcharconv_draughts.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_fraktur.c b/libcharconv_fraktur.c
index 4e9932f..e04d6ab 100644
--- a/libcharconv_fraktur.c
+++ b/libcharconv_fraktur.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_gender_symbols.c b/libcharconv_gender_symbols.c
index 47dbd89..9ed927f 100644
--- a/libcharconv_gender_symbols.c
+++ b/libcharconv_gender_symbols.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_go_black.c b/libcharconv_go_black.c
index e7bf8d5..6ca0886 100644
--- a/libcharconv_go_black.c
+++ b/libcharconv_go_black.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_go_white.c b/libcharconv_go_white.c
index 233d2bc..163a938 100644
--- a/libcharconv_go_white.c
+++ b/libcharconv_go_white.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_italic.c b/libcharconv_italic.c
index e9fde22..134c2cb 100644
--- a/libcharconv_italic.c
+++ b/libcharconv_italic.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
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)
diff --git a/libcharconv_monospace.c b/libcharconv_monospace.c
index 1bd1405..e1a9b01 100644
--- a/libcharconv_monospace.c
+++ b/libcharconv_monospace.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_region_indicators.c b/libcharconv_region_indicators.c
index 00a6ec8..0c9ecb9 100644
--- a/libcharconv_region_indicators.c
+++ b/libcharconv_region_indicators.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_replacement.c b/libcharconv_replacement.c
index a9bd3c5..f487c83 100644
--- a/libcharconv_replacement.c
+++ b/libcharconv_replacement.c
@@ -1,8 +1,7 @@
/* See LICENSE file for copyright and license details. */
#include "libcharconv.h"
-#include <strings.h>
-
+#include "lib-common.h"
enum libcharconv_result
libcharconv_replacement(const char *s, size_t slen, size_t *n, uint_least32_t *cp, size_t *ncp)
{
diff --git a/libcharconv_sans_serif.c b/libcharconv_sans_serif.c
index b24e0a7..152ce0c 100644
--- a/libcharconv_sans_serif.c
+++ b/libcharconv_sans_serif.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_sans_serif_bold.c b/libcharconv_sans_serif_bold.c
index 527da1e..4d0df44 100644
--- a/libcharconv_sans_serif_bold.c
+++ b/libcharconv_sans_serif_bold.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_sans_serif_bold_italic.c b/libcharconv_sans_serif_bold_italic.c
index 6018e77..f9b77f1 100644
--- a/libcharconv_sans_serif_bold_italic.c
+++ b/libcharconv_sans_serif_bold_italic.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_sans_serif_italic.c b/libcharconv_sans_serif_italic.c
index b0661ab..c0d8ff9 100644
--- a/libcharconv_sans_serif_italic.c
+++ b/libcharconv_sans_serif_italic.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_script.c b/libcharconv_script.c
index 5a5736b..2617c58 100644
--- a/libcharconv_script.c
+++ b/libcharconv_script.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_segmented.c b/libcharconv_segmented.c
index 22dd7df..87bf1c1 100644
--- a/libcharconv_segmented.c
+++ b/libcharconv_segmented.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_shogi.c b/libcharconv_shogi.c
index 3c073ec..d12f158 100644
--- a/libcharconv_shogi.c
+++ b/libcharconv_shogi.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result
diff --git a/libcharconv_tags.c b/libcharconv_tags.c
index f673406..326a83e 100644
--- a/libcharconv_tags.c
+++ b/libcharconv_tags.c
@@ -1,5 +1,5 @@
/* See LICENSE file for copyright and license details. */
-#include "libcharconv.h"
+#include "lib-common.h"
enum libcharconv_result