diff options
30 files changed, 88 insertions, 83 deletions
@@ -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 |
