From 53160a89e5d723fb8315ebb087426405973b01ad Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 25 Jan 2026 15:06:50 +0100 Subject: Add vulgar fractions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- libcharconv_vulgar_fractions.c | 108 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 libcharconv_vulgar_fractions.c (limited to 'libcharconv_vulgar_fractions.c') diff --git a/libcharconv_vulgar_fractions.c b/libcharconv_vulgar_fractions.c new file mode 100644 index 0000000..a89a02f --- /dev/null +++ b/libcharconv_vulgar_fractions.c @@ -0,0 +1,108 @@ +/* See LICENSE file for copyright and license details. */ +#include "lib-common.h" + + +enum libcharconv_result +libcharconv_vulgar_fractions(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[0] == '/') { + if (*n) + goto no_conv; + c = UINT32_C(0x2044); + *n = 1u; + goto conv; + } else if (('0' <= s[0] && s[0] <= '5') || s[0] <= '7') { + if (*n) + goto no_conv; + if (slen == 0u) + return LIBCHARCONV_INDETERMINATE; + if (s[1] != '/') + goto no_match; + if (slen == 1u) { + if (s[0] == '1') { + c = UINT32_C(0x215F); + *n = 2u; + if (*ncp) + *cp = c; + *ncp = 1u; + return LIBCHARCONV_CONVERT_IF_END; + } else { + return LIBCHARCONV_INDETERMINATE; + } + } + if (s[0] == '0' && s[2] == '3') { + c = UINT32_C(0x2189); + } else if (s[0] == '2' && s[2] == '3') { + c = UINT32_C(0x2154); + } else if (s[0] == '2' && s[2] == '5') { + c = UINT32_C(0x2156); + } else if (s[0] == '3' && s[2] == '4') { + c = UINT32_C(0x00BE); + } else if (s[0] == '3' && s[2] == '5') { + c = UINT32_C(0x2157); + } else if (s[0] == '3' && s[2] == '8') { + c = UINT32_C(0x215C); + } else if (s[0] == '4' && s[2] == '5') { + c = UINT32_C(0x2158); + } else if (s[0] == '5' && s[2] == '6') { + c = UINT32_C(0x215A); + } else if (s[0] == '5' && s[2] == '8') { + c = UINT32_C(0x215D); + } else if (s[0] == '7' && s[2] == '8') { + c = UINT32_C(0x215E); + } else if (s[0] == '1' && s[2] == '2') { + c = UINT32_C(0x00BD); + } else if (s[0] == '1' && s[2] == '3') { + c = UINT32_C(0x2153); + } else if (s[0] == '1' && s[2] == '4') { + c = UINT32_C(0x00BC); + } else if (s[0] == '1' && s[2] == '5') { + c = UINT32_C(0x2155); + } else if (s[0] == '1' && s[2] == '6') { + c = UINT32_C(0x2159); + } else if (s[0] == '1' && s[2] == '7') { + c = UINT32_C(0x2150); + } else if (s[0] == '1' && s[2] == '8') { + c = UINT32_C(0x215B); + } else if (s[0] == '1' && s[2] == '9') { + c = UINT32_C(0x2151); + } else if (s[0] == '1' && s[2] == '1') { + if (slen == 2u) + return LIBCHARCONV_INDETERMINATE; + if (s[3] == '0') { + c = UINT32_C(0x2152); + *n = 4u; + if (*ncp) + *cp = c; + *ncp = 1u; + return LIBCHARCONV_CONVERTED; + } else { + goto denum_1; + } + } else if (s[0] == '1') { + denum_1: + *n = 2u; + c = UINT32_C(0x215F); + goto conv; + } else { + goto no_match; + } + *n = 3u; + goto conv; + } else { + no_match: + *n += 1u; + } + } +no_conv: + return LIBCHARCONV_NO_CONVERT; + +conv: + if (*ncp) + *cp = c; + *ncp = 1u; + return LIBCHARCONV_CONVERTED; +} -- cgit v1.2.3-70-g09d2