aboutsummaryrefslogtreecommitdiffstats
path: root/libcharconv_vulgar_fractions.c
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2026-01-25 15:06:50 +0100
committerMattias Andrée <m@maandree.se>2026-01-25 15:06:50 +0100
commit53160a89e5d723fb8315ebb087426405973b01ad (patch)
tree7b7b6e695e686b2e6c659a57a32bc887d00badd9 /libcharconv_vulgar_fractions.c
parentUse a macro for all utils that do not take arguments (diff)
downloadcharconv-53160a89e5d723fb8315ebb087426405973b01ad.tar.gz
charconv-53160a89e5d723fb8315ebb087426405973b01ad.tar.bz2
charconv-53160a89e5d723fb8315ebb087426405973b01ad.tar.xz
Add vulgar fractions
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'libcharconv_vulgar_fractions.c')
-rw-r--r--libcharconv_vulgar_fractions.c108
1 files changed, 108 insertions, 0 deletions
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;
+}