/* 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; }