diff options
Diffstat (limited to 'source/blender/blenlib/intern/string_utf8.c')
-rw-r--r-- | source/blender/blenlib/intern/string_utf8.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/source/blender/blenlib/intern/string_utf8.c b/source/blender/blenlib/intern/string_utf8.c index 26235de4dd2..fe8f3c20ab4 100644 --- a/source/blender/blenlib/intern/string_utf8.c +++ b/source/blender/blenlib/intern/string_utf8.c @@ -33,6 +33,7 @@ #include <string.h> #include <wchar.h> #include <wctype.h> +#include <wcwidth.h> #include <stdio.h> #include <stdlib.h> @@ -317,6 +318,42 @@ size_t BLI_strncpy_wchar_from_utf8(wchar_t *__restrict dst_w, const char *__rest /* end wchar_t / utf8 functions */ /* --------------------------------------------------------------------------*/ +/* count columns that character/string occupies, based on wcwidth.c */ + +int BLI_wcwidth(wchar_t ucs) +{ + return mk_wcwidth(ucs); +} + +int BLI_wcswidth(const wchar_t *pwcs, size_t n) +{ + return mk_wcswidth(pwcs, n); +} + +int BLI_str_utf8_char_width(const char *p) +{ + unsigned int unicode = BLI_str_utf8_as_unicode(p); + if (unicode == BLI_UTF8_ERR) + return -1; + + return BLI_wcwidth((wchar_t)unicode); +} + +int BLI_str_utf8_char_width_safe(const char *p) +{ + int columns; + + unsigned int unicode = BLI_str_utf8_as_unicode(p); + if (unicode == BLI_UTF8_ERR) + return 1; + + columns = BLI_wcwidth((wchar_t)unicode); + + return (columns < 0) ? 1 : columns; +} + +/* --------------------------------------------------------------------------*/ + /* copied from glib's gutf8.c, added 'Err' arg */ /* note, glib uses unsigned int for unicode, best we do the same, |