/* See LICENSE file for copyright and license details. */ #include "lib-common.h" static struct { uint_least32_t cp; const char *s; } symbols[] = { {UINT32_C(0x269E), "->"}, {UINT32_C(0x269F), "<-"}, {UINT32_C(0x2120), "SM"}, {UINT32_C(0x2122), "TM"}, {UINT32_C(0x00A9), "(C)"}, {UINT32_C(0x1F1AD), "(M)"}, {UINT32_C(0x2117), "(P)"}, {UINT32_C(0x00AE), "(R)"}, {UINT32_C(0x1F10D), "(0)"}, {UINT32_C(0x1F10F), "\\($)"}, {UINT32_C(0x1F10F), "(\\$)"}, {UINT32_C(0x1F10F), "($\\)"}, {UINT32_C(0x1F10F), "($)\\"}, {UINT32_C(0x1F16E), "\\(C)"}, {UINT32_C(0x1F16E), "(\\C)"}, {UINT32_C(0x1F16E), "(C\\)"}, {UINT32_C(0x1F16E), "(C)\\"}, {UINT32_C(0x1F16D), "(CC)"}, {UINT32_C(0x212E), "e"}, {UINT32_C(0x2139), "i"}, {UINT32_C(0x212A), "K"}, {UINT32_C(0x213B), "FAX"}, {UINT32_C(0x213B), "Fax"}, {UINT32_C(0x2121), "TEL"}, {UINT32_C(0x2121), "Tel"}, {UINT32_C(0x212B), "A"}, {UINT32_C(0x2100), "ac"}, {UINT32_C(0x2100), "a/c"}, {UINT32_C(0x214D), "AS"}, {UINT32_C(0x214D), "A/S"}, {UINT32_C(0x2101), "as"}, {UINT32_C(0x2101), "a/s"}, {UINT32_C(0x00AA), "a"}, {UINT32_C(0x00BA), "o"}, {UINT32_C(0x2300), "/o"}, {UINT32_C(0x2300), "o/"}, {UINT32_C(0x2116), "No"}, {UINT32_C(0x2118), "p"}, {UINT32_C(0x2118), "P"}, {UINT32_C(0x214A), "PL"}, {UINT32_C(0x211E), "Px"}, {UINT32_C(0x211F), "R/"}, {UINT32_C(0x211F), "/R"}, {UINT32_C(0x2123), "V/"}, {UINT32_C(0x2123), "/V"}, {UINT32_C(0x2125), "z"}, {UINT32_C(0x23E8), "10"}, {UINT32_C(0x2104), "CL"}, {UINT32_C(0x2105), "c/o"}, {UINT32_C(0x2105), "co"}, {UINT32_C(0x2105), "C/O"}, {UINT32_C(0x2105), "CO"}, {UINT32_C(0x2106), "c/u"}, {UINT32_C(0x2106), "cu"}, {UINT32_C(0x2106), "C/U"}, {UINT32_C(0x2106), "CU"}, {UINT32_C(0x2113), "l"}, {UINT32_C(0x2114), "lb"}, {UINT32_C(0x1F19B), "[3D]"}, {UINT32_C(0x1F19B), "3D"}, {UINT32_C(0x1F19C), "[2ND SCR]"}, {UINT32_C(0x1F19C), "2ND SCR"}, {UINT32_C(0x1F1A7), "[HDR]"}, {UINT32_C(0x1F1A7), "HDR"}, {UINT32_C(0x1F1A6), "[HC]"}, {UINT32_C(0x1F1A6), "HC"}, {UINT32_C(0x1F1AC), "[VOD]"}, {UINT32_C(0x1F1AC), "VOD"}, {UINT32_C(0x1F1A3), "[60P]"}, {UINT32_C(0x1F1A3), "60P"}, {UINT32_C(0x1F1A8), "[HI-RES]"}, {UINT32_C(0x1F1A8), "HI-RES"}, {UINT32_C(0x1F1A4), "[120P]"}, {UINT32_C(0x1F1A4), "120P"}, {UINT32_C(0x1F19D), "[2K]"}, {UINT32_C(0x1F19D), "2K"}, {UINT32_C(0x1F19E), "[4K]"}, {UINT32_C(0x1F19E), "4K"}, {UINT32_C(0x1F19F), "[8K]"}, {UINT32_C(0x1F19F), "8K"}, {UINT32_C(0x1F1AB), "[UHD]"}, {UINT32_C(0x1F1AB), "UHD"}, {UINT32_C(0x1F1AA), "[SHV]"}, {UINT32_C(0x1F1AA), "SHV"}, {UINT32_C(0x1F1A9), "[LOSSLESS]"}, {UINT32_C(0x1F1A9), "LOSSLESS"}, {UINT32_C(0x1F1A0), "[5.1]"}, {UINT32_C(0x1F1A0), "5.1"}, {UINT32_C(0x1F1A1), "[7.1]"}, {UINT32_C(0x1F1A1), "7.1"}, {UINT32_C(0x1F1A2), "[22.2]"}, {UINT32_C(0x1F1A2), "22.2"}, {UINT32_C(0x2141), "G"}, {UINT32_C(0x2142), "L"}, {UINT32_C(0x2144), "Y"}, {UINT32_C(0x213A), "Q"} }; enum libcharconv_result libcharconv_symbols(const char *s, size_t slen, size_t *n, uint_least32_t *cp, size_t *ncp) { size_t i, len, found, found_len; int indeterminate; *n = 0; for (; slen; s++, slen--, ++*n) { indeterminate = 0; found = SIZE_MAX; found_len = 0u; for (i = 0u; i < sizeof(symbols) / sizeof(*symbols); i++) { len = strlen(symbols[i].s); if (strncmp(s, symbols[i].s, len < slen ? len : slen)) continue; if (slen < len) { indeterminate = 1; continue; } if (len > found_len) { found = i; found_len = len; } } if (found_len) goto conv; if (*n) goto no_conv; if (indeterminate) return LIBCHARCONV_INDETERMINATE; } no_conv: return LIBCHARCONV_NO_CONVERT; conv: if (*n) goto no_conv; if (*ncp) *cp = symbols[found].cp; *n += found_len; *ncp = 1u; return indeterminate ? LIBCHARCONV_CONVERT_IF_END : LIBCHARCONV_CONVERTED; }