/* See LICENSE file for copyright and license details. */ #include "lib-common.h" enum libcharconv_result libcharconv_crop_marks(const char *s, size_t slen, size_t *n, uint_least32_t *cp, size_t *ncp) { uint_least32_t c; *n = 0; for (; slen--; s++) { if (s[0] == '|') { if (!slen) goto indeterminate; if (s[1] == '-') c = UINT32_C(0x230C); else if (s[1] == '_') c = UINT32_C(0x230E); else goto no_conv; goto conv; } else if (s[0] == '-') { if (!slen) goto indeterminate; if (s[1] != '|') goto no_conv; c = UINT32_C(0x230D); goto conv; } else if (s[0] == '_') { if (!slen) goto indeterminate; if (s[1] != '|') goto no_conv; c = UINT32_C(0x230F); goto conv; } else { *n += 1u; } } return LIBCHARCONV_NO_CONVERT; no_conv: if (!*n) *n = 1u; return LIBCHARCONV_NO_CONVERT; indeterminate: if (*n) goto no_conv; return LIBCHARCONV_INDETERMINATE; conv: if (*n) goto no_conv; if (*ncp) *cp = c; *n += 2u; *ncp = 1u; return LIBCHARCONV_CONVERTED; }