aboutsummaryrefslogtreecommitdiffstats
path: root/libcharconv_variation_selectors.c
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2026-01-24 18:20:57 +0100
committerMattias Andrée <m@maandree.se>2026-01-24 18:20:57 +0100
commit60402ec01fe1f56034dbf5a453aace73c1a95f9a (patch)
tree479b5f621b2342bd079f4308503cc916d1d37bc7 /libcharconv_variation_selectors.c
parentAdd bracketed (diff)
downloadcharconv-60402ec01fe1f56034dbf5a453aace73c1a95f9a.tar.gz
charconv-60402ec01fe1f56034dbf5a453aace73c1a95f9a.tar.bz2
charconv-60402ec01fe1f56034dbf5a453aace73c1a95f9a.tar.xz
Add variation selectors
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'libcharconv_variation_selectors.c')
-rw-r--r--libcharconv_variation_selectors.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/libcharconv_variation_selectors.c b/libcharconv_variation_selectors.c
new file mode 100644
index 0000000..a5ec8e0
--- /dev/null
+++ b/libcharconv_variation_selectors.c
@@ -0,0 +1,54 @@
+/* See LICENSE file for copyright and license details. */
+#include "lib-common.h"
+
+
+enum libcharconv_result
+libcharconv_variation_selectors(const char *s, size_t slen, size_t *n, uint_least32_t *cp, size_t *ncp)
+{
+ enum libcharconv_result ret = LIBCHARCONV_CONVERTED;
+ uint_least32_t c;
+ *n = 0;
+ for (; slen--; s++) {
+ if ('1' <= s[0] && s[0] <= '9') {
+ c = (uint_least32_t)(s[0] - '0');
+ if (!slen--)
+ goto conv_if_end;
+ if ('0' > s[1] || s[1] > '9')
+ goto conv;
+ c *= 10u;
+ c += (uint_least32_t)(s[1] - '0');
+ if (!slen--)
+ goto conv_if_end;
+ if ('0' > s[2] || s[2] > '9')
+ goto conv;
+ c *= 10u;
+ c += (uint_least32_t)(s[2] - '0');
+ if (c > 256u) {
+ c /= 10u;
+ goto conv;
+ }
+ goto conv;
+ } else {
+ *n += 1u;
+ break;
+ }
+ }
+no_conv:
+ return LIBCHARCONV_NO_CONVERT;
+
+conv_if_end:
+ ret = LIBCHARCONV_CONVERT_IF_END;
+conv:
+ if (*n)
+ goto no_conv;
+ *n = c < 10u ? 1u : c < 100u ? 2u : 3u;
+ if (c < 17u)
+ c = UINT32_C(0xFE00) + (c - 1u);
+ else
+ c = UINT32_C(0xE0100) + (c - 17u);
+ if (*ncp)
+ *cp = c;
+ *ncp = 1u;
+ return ret;
+
+}