/* See LICENSE file for copyright and license details. */ #include "lib-common.h" static struct { uint_least32_t from; uint_least32_t to; } pairs[] = { {UINT32_C(0x230E), UINT32_C(0x230C)}, {UINT32_C(0x230C), UINT32_C(0x230D)}, {UINT32_C(0x230D), UINT32_C(0x230F)}, {UINT32_C(0x230F), UINT32_C(0x230E)}, {UINT32_C(0x1FA04), UINT32_C(0x1FA19)}, {UINT32_C(0x1FA19), UINT32_C(0x1FA2E)}, {UINT32_C(0x1FA2E), UINT32_C(0x1FA43)}, {UINT32_C(0x1FA43), UINT32_C(0x1FA04)}, {UINT32_C(0x02658), UINT32_C(0x1FA0D)}, {UINT32_C(0x1FA0D), UINT32_C(0x1FA22)}, {UINT32_C(0x1FA22), UINT32_C(0x1FA37)}, {UINT32_C(0x1FA37), UINT32_C(0x02658)}, {UINT32_C(0x0265E), UINT32_C(0x1FA13)}, {UINT32_C(0x1FA13), UINT32_C(0x1FA28)}, {UINT32_C(0x1FA28), UINT32_C(0x1FA3D)}, {UINT32_C(0x1FA3D), UINT32_C(0x0265E)}, {UINT32_C(0x1FA08), UINT32_C(0x1FA1D)}, {UINT32_C(0x1FA1D), UINT32_C(0x1FA32)}, {UINT32_C(0x1FA32), UINT32_C(0x1FA47)}, {UINT32_C(0x1FA47), UINT32_C(0x1FA08)}, {UINT32_C(0x1FA06), UINT32_C(0x1FA1B)}, {UINT32_C(0x1FA1B), UINT32_C(0x1FA30)}, {UINT32_C(0x1FA30), UINT32_C(0x1FA45)}, {UINT32_C(0x1FA45), UINT32_C(0x1FA06)}, {UINT32_C(0x1FA07), UINT32_C(0x1FA1C)}, {UINT32_C(0x1FA1C), UINT32_C(0x1FA31)}, {UINT32_C(0x1FA31), UINT32_C(0x1FA46)}, {UINT32_C(0x1FA46), UINT32_C(0x1FA07)}, {UINT32_C(0x1FA48), UINT32_C(0x1FA4B)}, {UINT32_C(0x1FA49), UINT32_C(0x1FA4C)}, {UINT32_C(0x1FA4A), UINT32_C(0x1FA4D)}, {UINT32_C(0x1FA4B), UINT32_C(0x1FA48)}, {UINT32_C(0x1FA4C), UINT32_C(0x1FA49)}, {UINT32_C(0x1FA4D), UINT32_C(0x1FA4A)}, {UINT32_C(0x1FA00), UINT32_C(0x1FA15)}, {UINT32_C(0x1FA15), UINT32_C(0x1FA2A)}, {UINT32_C(0x1FA2A), UINT32_C(0x1FA3F)}, {UINT32_C(0x1FA3F), UINT32_C(0x1FA00)}, {UINT32_C(0x1FA01), UINT32_C(0x1FA16)}, {UINT32_C(0x1FA16), UINT32_C(0x1FA2B)}, {UINT32_C(0x1FA2B), UINT32_C(0x1FA40)}, {UINT32_C(0x1FA40), UINT32_C(0x1FA01)}, {UINT32_C(0x1FA02), UINT32_C(0x1FA17)}, {UINT32_C(0x1FA17), UINT32_C(0x1FA2C)}, {UINT32_C(0x1FA2C), UINT32_C(0x1FA41)}, {UINT32_C(0x1FA41), UINT32_C(0x1FA02)}, {UINT32_C(0x1FA03), UINT32_C(0x1FA18)}, {UINT32_C(0x1FA18), UINT32_C(0x1FA2D)}, {UINT32_C(0x1FA2D), UINT32_C(0x1FA42)}, {UINT32_C(0x1FA42), UINT32_C(0x1FA03)}, {UINT32_C(0x1FA05), UINT32_C(0x1FA1A)}, {UINT32_C(0x1FA1A), UINT32_C(0x1FA2F)}, {UINT32_C(0x1FA2F), UINT32_C(0x1FA44)}, {UINT32_C(0x1FA44), UINT32_C(0x1FA05)}, {UINT32_C(0x2654), UINT32_C(0x1FA09)}, {UINT32_C(0x1FA09), UINT32_C(0x1FA1E)}, {UINT32_C(0x1FA1E), UINT32_C(0x1FA33)}, {UINT32_C(0x1FA33), UINT32_C(0x2654)}, {UINT32_C(0x2655), UINT32_C(0x1FA0A)}, {UINT32_C(0x1FA0A), UINT32_C(0x1FA1F)}, {UINT32_C(0x1FA1F), UINT32_C(0x1FA34)}, {UINT32_C(0x1FA34), UINT32_C(0x2655)}, {UINT32_C(0x2656), UINT32_C(0x1FA0B)}, {UINT32_C(0x1FA0B), UINT32_C(0x1FA20)}, {UINT32_C(0x1FA20), UINT32_C(0x1FA35)}, {UINT32_C(0x1FA35), UINT32_C(0x2656)}, {UINT32_C(0x2657), UINT32_C(0x1FA0C)}, {UINT32_C(0x1FA0C), UINT32_C(0x1FA21)}, {UINT32_C(0x1FA21), UINT32_C(0x1FA36)}, {UINT32_C(0x1FA36), UINT32_C(0x2657)}, {UINT32_C(0x2659), UINT32_C(0x1FA0E)}, {UINT32_C(0x1FA0E), UINT32_C(0x1FA23)}, {UINT32_C(0x1FA23), UINT32_C(0x1FA38)}, {UINT32_C(0x1FA38), UINT32_C(0x2659)}, {UINT32_C(0x265A), UINT32_C(0x1FA0F)}, {UINT32_C(0x1FA0F), UINT32_C(0x1FA24)}, {UINT32_C(0x1FA24), UINT32_C(0x1FA39)}, {UINT32_C(0x1FA39), UINT32_C(0x265A)}, {UINT32_C(0x265B), UINT32_C(0x1FA10)}, {UINT32_C(0x1FA10), UINT32_C(0x1FA25)}, {UINT32_C(0x1FA25), UINT32_C(0x1FA3A)}, {UINT32_C(0x1FA3A), UINT32_C(0x265B)}, {UINT32_C(0x265C), UINT32_C(0x1FA11)}, {UINT32_C(0x1FA11), UINT32_C(0x1FA26)}, {UINT32_C(0x1FA26), UINT32_C(0x1FA3B)}, {UINT32_C(0x1FA3B), UINT32_C(0x265C)}, {UINT32_C(0x265D), UINT32_C(0x1FA12)}, {UINT32_C(0x1FA12), UINT32_C(0x1FA27)}, {UINT32_C(0x1FA27), UINT32_C(0x1FA3C)}, {UINT32_C(0x1FA3C), UINT32_C(0x265D)}, {UINT32_C(0x265F), UINT32_C(0x1FA14)}, {UINT32_C(0x1FA14), UINT32_C(0x1FA29)}, {UINT32_C(0x1FA29), UINT32_C(0x1FA3E)}, {UINT32_C(0x1FA3E), UINT32_C(0x265F)} }; enum libcharconv_result libcharconv_rotated_90deg_cw(const char *s, size_t slen, size_t *n, uint_least32_t *cp, size_t *ncp) { uint_least32_t c; size_t i, clen; *n = 0; while (slen) { clen = libcharconv_decode_utf8_(s, slen, &c); if (clen > slen) { if (*n) goto no_conv; return LIBCHARCONV_INDETERMINATE; } if (!clen) { *n += 1u; slen -= 1u; s = &s[1]; continue; } for (i = 0u; i < sizeof(pairs) / sizeof(*pairs); i++) { if (c == pairs[i].from) { c = pairs[i].to; goto conv; } } *n += clen; s = &s[clen]; slen -= clen; } no_conv: return LIBCHARCONV_NO_CONVERT; conv: if (*n) goto no_conv; if (*ncp) *cp = c; *n += clen; *ncp = 1u; return LIBCHARCONV_CONVERTED; }