diff options
| author | Mattias Andrée <m@maandree.se> | 2026-01-25 10:48:36 +0100 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-01-25 10:48:36 +0100 |
| commit | 931bbb77e11f0403f51fe1e9c18ef4f5e16a3fcf (patch) | |
| tree | 24e2ecb39218678ecf577108af9938962985151a /libcharconv_lisu.c | |
| parent | Add braille (diff) | |
| download | charconv-931bbb77e11f0403f51fe1e9c18ef4f5e16a3fcf.tar.gz charconv-931bbb77e11f0403f51fe1e9c18ef4f5e16a3fcf.tar.bz2 charconv-931bbb77e11f0403f51fe1e9c18ef4f5e16a3fcf.tar.xz | |
Add lisu
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to '')
| -rw-r--r-- | libcharconv_lisu.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/libcharconv_lisu.c b/libcharconv_lisu.c new file mode 100644 index 0000000..2a0293a --- /dev/null +++ b/libcharconv_lisu.c @@ -0,0 +1,115 @@ +/* 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; +} |
