diff options
-rw-r--r-- | include/unicode/string.h | 4 | ||||
-rw-r--r-- | lib/unicode/string/u8wdth.c | 12 |
2 files changed, 10 insertions, 6 deletions
diff --git a/include/unicode/string.h b/include/unicode/string.h index ed082a1..6908fe7 100644 --- a/include/unicode/string.h +++ b/include/unicode/string.h @@ -30,7 +30,7 @@ enum normform { /* clang-format on */ -[[nodiscard]] size_t u8wdth(struct u8view); +[[nodiscard]] size_t u8wdth(struct u8view, int); [[nodiscard]] size_t u8gcnt(struct u8view); [[nodiscard]] size_t u8wcnt(struct u8view); [[nodiscard]] size_t u8wcnt_human(struct u8view); @@ -49,7 +49,7 @@ size_t u8wnext_human(struct u8view *, struct u8view *); enum normform); /* Encoding-generic macros */ -#define ucswdth(sv) _Generic((sv), struct u8view: u8wdth)((sv)) +#define ucswdth(sv, ts) _Generic((sv), struct u8view: u8wdth)((sv), (ts)) #define ucsgcnt(sv) _Generic((sv), struct u8view: u8gcnt)((sv)) #define ucswcnt(sv) _Generic((sv), struct u8view: u8wcnt)((sv)) #define ucswcnt_human(sv) _Generic((sv), struct u8view: u8wcnt_human)((sv)) diff --git a/lib/unicode/string/u8wdth.c b/lib/unicode/string/u8wdth.c index 503ff7c..7a58069 100644 --- a/lib/unicode/string/u8wdth.c +++ b/lib/unicode/string/u8wdth.c @@ -3,15 +3,19 @@ #include "unicode/string.h" size_t -u8wdth(struct u8view sv) +u8wdth(struct u8view sv, int ts) { rune ch; size_t n = 0; while (ucsnext(&ch, &sv) != 0) { - int w = uprop_get_wdth(ch); - if (w > 0) - n += w; + if (ch == '\t') + n += ts - n % ts; + else { + int w = uprop_get_wdth(ch); + if (w > 0) + n += w; + } } return n; |