aboutsummaryrefslogtreecommitdiffstats
path: root/libcharconv_negative.c
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2026-01-26 17:57:59 +0100
committerMattias Andrée <m@maandree.se>2026-01-26 17:57:59 +0100
commitb48e74772cc4e6879a6d37a5c00ad6df2db1edc3 (patch)
tree4d1497bc28ff8ef8f2c4102195326dfe76b2622d /libcharconv_negative.c
parentAdd flipping and turning for yijing n-grams, and add invisible (diff)
downloadcharconv-b48e74772cc4e6879a6d37a5c00ad6df2db1edc3.tar.gz
charconv-b48e74772cc4e6879a6d37a5c00ad6df2db1edc3.tar.bz2
charconv-b48e74772cc4e6879a6d37a5c00ad6df2db1edc3.tar.xz
Add enclosed
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'libcharconv_negative.c')
-rw-r--r--libcharconv_negative.c85
1 files changed, 38 insertions, 47 deletions
diff --git a/libcharconv_negative.c b/libcharconv_negative.c
index 3bbbccb..92470c8 100644
--- a/libcharconv_negative.c
+++ b/libcharconv_negative.c
@@ -23,7 +23,26 @@ static struct {
{UINT32_C(0x1FA30), UINT32_C(0x1FA31)},
{UINT32_C(0x1FA45), UINT32_C(0x1FA46)},
{UINT32_C(0x1FA48), UINT32_C(0x1FA49)},
- {UINT32_C(0x1FA4B), UINT32_C(0x1FA4C)}
+ {UINT32_C(0x1FA4B), UINT32_C(0x1FA4C)},
+ {UINT32_C(0x24EA), UINT32_C(0x24FF)},
+ {UINT32_C(0x1F10B), UINT32_C(0x1F10C)}
+};
+
+
+static struct {
+ struct {uint_least32_t low, high;} low, high;
+} range_pairs[] = {
+ {{UINT32_C(0x2654), UINT32_C(0x2659)}, {UINT32_C(0x265A), UINT32_C(0x265F)}},
+ {{UINT32_C(0x1FA60), UINT32_C(0x1FA66)}, {UINT32_C(0x1FA67), UINT32_C(0x1FA6D)}},
+ {{UINT32_C(0x1FA09), UINT32_C(0x1FA0E)}, {UINT32_C(0x1FA0F), UINT32_C(0x1FA14)}},
+ {{UINT32_C(0x1FA1E), UINT32_C(0x1FA23)}, {UINT32_C(0x1FA24), UINT32_C(0x1FA29)}},
+ {{UINT32_C(0x1FA33), UINT32_C(0x1FA38)}, {UINT32_C(0x1FA39), UINT32_C(0x1FA3E)}},
+ {{UINT32_C(0x1FA4E), UINT32_C(0x1FA50)}, {UINT32_C(0x1FA51), UINT32_C(0x1FA53)}},
+ {{UINT32_C(0x2460), UINT32_C(0x2469)}, {UINT32_C(0x2776), UINT32_C(0x277F)}},
+ {{UINT32_C(0x246A), UINT32_C(0x2473)}, {UINT32_C(0x24EB), UINT32_C(0x24F4)}},
+ {{UINT32_C(0x24B6), UINT32_C(0x24CF)}, {UINT32_C(0x1F150), UINT32_C(0x1F169)}},
+ {{UINT32_C(0x1F130), UINT32_C(0x1F149)}, {UINT32_C(0x1F170), UINT32_C(0x1F189)}},
+ {{UINT32_C(0x2780), UINT32_C(0x2789)}, {UINT32_C(0x278A), UINT32_C(0x2793)}}
};
@@ -47,52 +66,24 @@ libcharconv_negative(const char *s, size_t slen, size_t *n, uint_least32_t *cp,
continue;
}
- if (UINT32_C(0x2654) <= c && c <= UINT32_C(0x2659)) {
- c += 6u;
- goto conv;
- } else if (UINT32_C(0x265A) <= c && c <= UINT32_C(0x265F)) {
- c -= 6u;
- goto conv;
- } else if (UINT32_C(0x1FA60) <= c && c <= UINT32_C(0x1FA66)) {
- c += 7u;
- goto conv;
- } else if (UINT32_C(0x1FA67) <= c && c <= UINT32_C(0x1FA6D)) {
- c -= 7u;
- goto conv;
- } else if (UINT32_C(0x1FA09) <= c && c <= UINT32_C(0x1FA0E)) {
- c += UINT32_C(0x1FA0F) - UINT32_C(0x1FA09);
- goto conv;
- } else if (UINT32_C(0x1FA0F) <= c && c <= UINT32_C(0x1FA14)) {
- c -= UINT32_C(0x1FA0F) - UINT32_C(0x1FA09);
- goto conv;
- } else if (UINT32_C(0x1FA1E) <= c && c <= UINT32_C(0x1FA23)) {
- c += UINT32_C(0x1FA24) - UINT32_C(0x1FA1E);
- goto conv;
- } else if (UINT32_C(0x1FA24) <= c && c <= UINT32_C(0x1FA29)) {
- c -= UINT32_C(0x1FA24) - UINT32_C(0x1FA1E);
- goto conv;
- } else if (UINT32_C(0x1FA33) <= c && c <= UINT32_C(0x1FA38)) {
- c += UINT32_C(0x1FA39) - UINT32_C(0x1FA33);
- goto conv;
- } else if (UINT32_C(0x1FA39) <= c && c <= UINT32_C(0x1FA3E)) {
- c -= UINT32_C(0x1FA39) - UINT32_C(0x1FA33);
- goto conv;
- } else if (UINT32_C(0x1FA4E) <= c && c <= UINT32_C(0x1FA50)) {
- c += UINT32_C(0x1FA51) - UINT32_C(0x1FA4E);
- goto conv;
- } else if (UINT32_C(0x1FA51) <= c && c <= UINT32_C(0x1FA53)) {
- c -= UINT32_C(0x1FA51) - UINT32_C(0x1FA4E);
- goto conv;
- } else {
- for (i = 0u; i < sizeof(pairs) / sizeof(*pairs); i++) {
- if (c == pairs[i].a) {
- c = pairs[i].b;
- goto conv;
- }
- if (c == pairs[i].b) {
- c = pairs[i].a;
- goto conv;
- }
+ for (i = 0u; i < sizeof(range_pairs) / sizeof(*range_pairs); i++) {
+ if (range_pairs[i].low.low <= c && c <= range_pairs[i].low.high) {
+ c += range_pairs[i].high.low - range_pairs[i].low.low;
+ goto conv;
+ }
+ if (range_pairs[i].high.low <= c && c <= range_pairs[i].high.high) {
+ c -= range_pairs[i].high.low - range_pairs[i].low.low;
+ goto conv;
+ }
+ }
+ for (i = 0u; i < sizeof(pairs) / sizeof(*pairs); i++) {
+ if (c == pairs[i].a) {
+ c = pairs[i].b;
+ goto conv;
+ }
+ if (c == pairs[i].b) {
+ c = pairs[i].a;
+ goto conv;
}
}