diff options
Diffstat (limited to 'vendor/librune/lib/gbrk')
-rw-r--r-- | vendor/librune/lib/gbrk/u8glen.c | 13 | ||||
-rw-r--r-- | vendor/librune/lib/gbrk/u8gnext.c | 164 |
2 files changed, 0 insertions, 177 deletions
diff --git a/vendor/librune/lib/gbrk/u8glen.c b/vendor/librune/lib/gbrk/u8glen.c deleted file mode 100644 index 13cac7e..0000000 --- a/vendor/librune/lib/gbrk/u8glen.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "gbrk.h" - -size_t -u8glen(const char8_t *s, size_t n) -{ - size_t m = 0; - struct u8view unused; - - while (u8gnext(&unused, &s, &n)) - m++; - - return m; -} diff --git a/vendor/librune/lib/gbrk/u8gnext.c b/vendor/librune/lib/gbrk/u8gnext.c deleted file mode 100644 index 5dae265..0000000 --- a/vendor/librune/lib/gbrk/u8gnext.c +++ /dev/null @@ -1,164 +0,0 @@ -#include <stddef.h> - -#include "gbrk.h" -#include "utf8.h" - -#include "internal/common.h" -#include "internal/gbrk_lookup.h" - -struct gbrk_state { - enum { - GB9C_NONE, - GB9C_CNSNT, - GB9C_LNK, - } gb9c; - bool gb11 : 1; - bool gb12 : 1; -}; - -static bool u8isgbrk(rune, rune, struct gbrk_state *); -static gbrk_prop getprop(rune); - -size_t -u8gnext(struct u8view *g, const char8_t **s, size_t *n) -{ - int m; - rune ch1; - const char8_t *p; - struct gbrk_state gs = {0}; - - if (*n == 0) - return 0; - - g->p = p = *s; - p += u8tor_uc(&ch1, p); - - for (;;) { - rune ch2; - - if ((size_t)(p - *s) >= *n) - ch2 = 0; - else - m = u8tor_uc(&ch2, p); - if (u8isgbrk(ch1, ch2, &gs)) { - *n -= g->len = p - *s; - *s = p; - return g->len; - } - - ch1 = ch2; - p += m; - } -} - -bool -u8isgbrk(rune a, rune b, struct gbrk_state *gs) -{ - gbrk_prop ap, bp; - - /* GB1 & GB2 */ - if (!a || !b) - goto do_break; - - /* GB3 & ASCII fast-track */ - if ((a | b) < 0x300) { - if (a == '\r' && b == '\n') - return false; - goto do_break; - } - - /* GB4 */ - if (a == '\r' || a == '\n' || ((ap = getprop(a)) & GBP_CTRL)) - goto do_break; - - /* GB5 */ - if (b == '\r' || b == '\n' || ((bp = getprop(b)) & GBP_CTRL)) - goto do_break; - - /* Setting flags for GB9c */ - if (ap & GBP_INDC_CNSNT) - gs->gb9c = GB9C_CNSNT; - else if ((ap & GBP_INDC_LNK) && gs->gb9c == GB9C_CNSNT) - gs->gb9c = GB9C_LNK; - - /* GB6 */ - if ((ap & GBP_HNGL_L) - && (bp & (GBP_HNGL_L | GBP_HNGL_V | GBP_HNGL_LV | GBP_HNGL_LVT))) - { - return false; - } - - /* GB7 */ - if ((ap & (GBP_HNGL_LV | GBP_HNGL_V)) && (bp & (GBP_HNGL_V | GBP_HNGL_T))) - return false; - - /* GB8 */ - if ((ap & (GBP_HNGL_LVT | GBP_HNGL_T)) && (bp & GBP_HNGL_T)) - return false; - - /* GB9 */ - if (bp & (GBP_EXT | GBP_ZWJ)) { - if (ap & GBP_PIC) - gs->gb11 = true; - return false; - } - - /* GB9a */ - if (bp & GBP_SM) - return false; - - /* GB9b */ - if (ap & GBP_PREP) - return false; - - /* GB9c */ - if ((ap & (GBP_INDC_EXT | GBP_INDC_LNK)) && (bp & GBP_INDC_CNSNT) - && gs->gb9c == GB9C_LNK) - { - return false; - } - - /* GB11 */ - if (gs->gb11) { - if ((ap & GBP_EXT) && (bp & (GBP_EXT | GBP_ZWJ))) - return false; - if ((ap & GBP_ZWJ) && (bp & GBP_PIC)) - return false; - } - - /* GB12 & GB13 */ - if (ap & GBP_RI) { - if (gs->gb12 || !(bp & GBP_RI)) - goto do_break; - gs->gb12 = true; - return false; - } - - /* GB999 */ -do_break: - gs->gb9c = GB9C_NONE; - gs->gb11 = gs->gb12 = false; - return true; -} - -gbrk_prop -getprop(rune ch) -{ - ptrdiff_t lo, hi; - - lo = 0; - hi = lengthof(gbrk_prop_tbl) - 1; - - while (lo <= hi) { - ptrdiff_t i = (lo + hi) / 2; - - if (ch < gbrk_prop_tbl[i].lo) - hi = i - 1; - else if (ch > gbrk_prop_tbl[i].hi) - lo = i + 1; - else - return gbrk_prop_tbl[i].prop; - } - - return GBP_OTHER; -} |