/* See LICENSE file for copyright and license details. */ #include "lib-common.h" static struct { unsigned char cp_low; char latin; } lisu[] = { {0xEE, 'a'}, {0xD0, 'b'}, {0xDA, 'c'}, {0xD3, 'd'}, {0xF0, 'e'}, {0xDD, 'f'}, {0xD6, 'g'}, {0xE7, 'h'}, {0xF2, 'i'}, {0xD9, 'j'}, {0xD7, 'k'}, {0xE1, 'l'}, {0xDF, 'm'}, {0xE0, 'n'}, {0xF3, 'o'}, {0xD1, 'p'}, {0xE3, 'r'}, {0xE2, 's'}, {0xD4, 't'}, {0xF4, 'u'}, {0xE6, 'v'}, {0xEA, 'w'}, {0xEB, 'x'}, {0xEC, 'y'}, {0xDC, 'z'}, {0xEF, 'A'}, {0xED, 'B'}, {0xDB, 'C'}, {0xF7, 'D'}, {0xF1, 'E'}, {0xDE, 'F'}, {0xE8, 'G'}, {0xE7, 'H'}, /* symmetry */ {0xF2, 'I'}, /* symmetry */ {0xE9, 'J'}, {0xD8, 'K'}, {0xF6, 'L'}, {0xEA, 'M'}, /* W */ {0xE0, 'N'}, /* symmetry */ {0xF3, 'O'}, /* symmetry */ {0xD2, 'P'}, {0xE4, 'R'}, {0xE2, 'S'}, /* symmetry */ {0xD5, 'Y'}, {0xF5, 'U'}, {0xE5, 'V'}, {0xDF, 'W'}, /* M */ {0xEB, 'X'}, /* symmetry */ {0xDC, 'Z'}, /* symmetry */ {0xFE, '-'}, {0xFF, '='}, {0xFD, ':'}, {0xFC, ';'}, {0xF9, ','} }; enum libcharconv_result libcharconv_lisu(const char *s, size_t slen, size_t *n, uint_least32_t *cp, size_t *ncp) { uint_least32_t c; size_t i; *n = 0; for (; slen--; s++) { if (*s == 'Y') { c = UINT32_C(0x11FB0); goto conv; } else if (*s == '.') { if (*n) goto no_conv; if (*ncp) *cp = UINT32_C(0xA4F8); *n += 1u; *ncp = 1u; if (!slen--) return LIBCHARCONV_CONVERT_IF_END; if (s[1] == '.') { if (*ncp) *cp = UINT32_C(0xA4FA); *n += 1u; } else if (s[1] == ',') { if (*ncp) *cp = UINT32_C(0xA4FB); *n += 1u; } return LIBCHARCONV_CONVERTED; } else { for (i = 0u; i < sizeof(lisu) / sizeof(*lisu); i++) if (*s == lisu[i].latin) goto conv_listed; *n += 1u; } } no_conv: return LIBCHARCONV_NO_CONVERT; conv_listed: c = (uint_least32_t)(UINT32_C(0xA400) | lisu[i].cp_low); conv: if (*n) goto no_conv; if (*ncp) *cp = c; *n += 1u; *ncp = 1u; return LIBCHARCONV_CONVERTED; }