diff options
| author | Mattias Andrée <m@maandree.se> | 2026-01-26 20:59:14 +0100 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-01-26 20:59:14 +0100 |
| commit | 48870de574bc6712a07ccb519459bf933336d3e1 (patch) | |
| tree | 79ba9c2eeb407c98910b6ccd0c2a50ad9912595e | |
| parent | Add counting rods (diff) | |
| download | charconv-48870de574bc6712a07ccb519459bf933336d3e1.tar.gz charconv-48870de574bc6712a07ccb519459bf933336d3e1.tar.bz2 charconv-48870de574bc6712a07ccb519459bf933336d3e1.tar.xz | |
Add mayan
Signed-off-by: Mattias Andrée <m@maandree.se>
| -rw-r--r-- | Makefile | 6 | ||||
| -rw-r--r-- | convert-to-mayan.c | 4 | ||||
| -rw-r--r-- | libcharconv.h | 5 | ||||
| -rw-r--r-- | libcharconv_latin.c | 11 | ||||
| -rw-r--r-- | libcharconv_mayan.c | 57 |
5 files changed, 81 insertions, 2 deletions
@@ -86,7 +86,8 @@ BIN =\ convert-to-dentistry\ convert-to-cards\ convert-to-stacked\ - convert-to-counting-rods + convert-to-counting-rods\ + convert-to-mayan LIBOBJ =\ libcharconv_decode_utf8_.o\ @@ -165,7 +166,8 @@ LIBOBJ =\ libcharconv_dentistry.o\ libcharconv_cards.o\ libcharconv_stacked.o\ - libcharconv_counting_rods.o + libcharconv_counting_rods.o\ + libcharconv_mayan.o LOBJ = $(LIBOBJ:.o=.lo) diff --git a/convert-to-mayan.c b/convert-to-mayan.c new file mode 100644 index 0000000..b27c519 --- /dev/null +++ b/convert-to-mayan.c @@ -0,0 +1,4 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" + +SIMPLE(libcharconv_mayan) diff --git a/libcharconv.h b/libcharconv.h index 93471ac..2fc6a3e 100644 --- a/libcharconv.h +++ b/libcharconv.h @@ -506,6 +506,11 @@ LIBCHARCONV_FUNC_(libcharconv_stacked); */ LIBCHARCONV_FUNC_(libcharconv_counting_rods); +/** + * Convert DIGITs to MAYAN NUMERALs + */ +LIBCHARCONV_FUNC_(libcharconv_mayan); + #undef LIBCHARCONV_FUNC_ #endif diff --git a/libcharconv_latin.c b/libcharconv_latin.c index 5e050f0..acb002c 100644 --- a/libcharconv_latin.c +++ b/libcharconv_latin.c @@ -616,6 +616,17 @@ libcharconv_latin(const char *s, size_t slen, size_t *n, uint_least32_t *cp, siz c2 = '0'; goto conv2; + } else if (UINT32_C(0x1D2E0) <= c && c <= UINT32_C(0x1D2E9)) { + /* mayan */ + c -= (uint_least32_t)UINT32_C(0x1D2E0) - (uint_least32_t)'0'; + goto conv; + } else if (UINT32_C(0x1D2EA) <= c && c <= UINT32_C(0x1D2F3)) { + /* mayan */ + c -= (uint_least32_t)UINT32_C(0x1D2EA) - (uint_least32_t)'0'; + c1 = '1'; + c2 = (char)c; + goto conv2; + } else { use_switch: switch (c) { diff --git a/libcharconv_mayan.c b/libcharconv_mayan.c new file mode 100644 index 0000000..48bf037 --- /dev/null +++ b/libcharconv_mayan.c @@ -0,0 +1,57 @@ +/* See LICENSE file for copyright and license details. */ +#include "lib-common.h" + + +enum libcharconv_result +libcharconv_mayan(const char *s, size_t slen, size_t *n, uint_least32_t *cp, size_t *ncp) +{ + uint_least32_t c; + *n = 0; + for (; slen--; s++) { + if (*s == '1') { + if (!slen) { + c = UINT32_C(0x1D2E0) + (unsigned)(*s - '0'); + goto conv_if_end; + } + if ('0' > s[1] || s[1] > '9') + goto one; + c = UINT32_C(0x1D2E0) + (unsigned)(s[0] - '0') * 10u + (unsigned)(s[1] - '0'); + goto conv2; + } else if ('0' <= *s && *s <= '9') { + one: + c = UINT32_C(0x1D2E0) + (unsigned)(*s - '0'); + goto conv1; + } else { + *n += 1u; + } + } +no_conv: + return LIBCHARCONV_NO_CONVERT; + +conv_if_end: + if (*n) + goto no_conv; + if (*ncp) + *cp = c; + *n += 1u; + *ncp = 1u; + return LIBCHARCONV_CONVERT_IF_END; + +conv1: + if (*n) + goto no_conv; + if (*ncp) + *cp = c; + *n += 1u; + *ncp = 1u; + return LIBCHARCONV_CONVERTED; + +conv2: + if (*n) + goto no_conv; + if (*ncp) + *cp = c; + *n += 2u; + *ncp = 1u; + return LIBCHARCONV_CONVERTED; +} |
