diff options
| author | Mattias Andrée <m@maandree.se> | 2026-01-25 18:17:01 +0100 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-01-25 18:17:01 +0100 |
| commit | aec513e234367b738ce6bf52bf4fab8fba0928c1 (patch) | |
| tree | 82f8f8bac275e39ef63ff1df68d1eac1c3649056 /libcharconv_symbols.c | |
| parent | Add negative (diff) | |
| download | charconv-aec513e234367b738ce6bf52bf4fab8fba0928c1.tar.gz charconv-aec513e234367b738ce6bf52bf4fab8fba0928c1.tar.bz2 charconv-aec513e234367b738ce6bf52bf4fab8fba0928c1.tar.xz | |
Add symbols
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'libcharconv_symbols.c')
| -rw-r--r-- | libcharconv_symbols.c | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/libcharconv_symbols.c b/libcharconv_symbols.c new file mode 100644 index 0000000..dd2f0ab --- /dev/null +++ b/libcharconv_symbols.c @@ -0,0 +1,149 @@ +/* See LICENSE file for copyright and license details. */ +#include "lib-common.h" +#include <string.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"} +}; + + +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; +} |
