/* See LICENSE file for copyright and license details. */ #include "lib-common.h" static struct { unsigned char cp_low; char latin; } lydian[] = { {0x20, 'a'}, {0x21, 'b'}, {0x39, 'c'}, {0x23, 'd'}, {0x24, 'e'}, {0x31, 'f'}, {0x22, 'g'}, {0x26, 'i'}, {0x28, 'k'}, {0x29, 'l'}, {0x2A, 'm'}, {0x2B, 'n'}, {0x2C, 'o'}, {0x32, 'q'}, {0x2D, 'r'}, {0x33, 's'}, {0x2F, 't'}, {0x30, 'u'}, {0x25, 'v'}, {0x27, 'y'}, {0x35, 'A'}, {0x36, 'E'}, {0x37, 'L'}, {0x38, 'N'}, {0x2E, 'S'}, {0x34, 'T'}, {0x3F, '\"'}, {0x3F, '\''} }; enum libcharconv_result libcharconv_lydian(const char *s, size_t slen, size_t *n, uint_least32_t *cp, size_t *ncp) { size_t i; *n = 0; for (; slen--; s++) { for (i = 0u; i < sizeof(lydian) / sizeof(*lydian); i++) if (*s == lydian[i].latin) goto conv; *n += 1u; } no_conv: return LIBCHARCONV_NO_CONVERT; conv: if (*n) goto no_conv; if (*ncp) *cp = (uint_least32_t)(UINT32_C(0x10900) | lydian[i].cp_low); *n += 1u; *ncp = 1u; return LIBCHARCONV_CONVERTED; }