diff options
-rw-r--r-- | src/core/utf8.c | 34 | ||||
-rw-r--r-- | src/core/utf8.h | 9 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/core/utf8.c b/src/core/utf8.c index c9303d19..7c75c374 100644 --- a/src/core/utf8.c +++ b/src/core/utf8.c @@ -55,3 +55,37 @@ int string_policy(const char *str) } return TREAT_STRING_AS_BYTES; } + +int string_length(const char *str, int policy) +{ + g_return_val_if_fail(str != NULL, 0); + + if (policy == -1) { + policy = string_policy(str); + } + + if (policy == TREAT_STRING_AS_UTF8) { + return g_utf8_strlen(str, -1); + } + else { + /* Assume TREAT_STRING_AS_BYTES: */ + return strlen(str); + } +} + +int string_width(const char *str, int policy) +{ + int len; + + g_return_val_if_fail(str != NULL, 0); + + if (policy == -1) { + policy = string_policy(str); + } + + len = 0; + while (*str != '\0') { + len += string_advance(&str, policy); + } + return len; +} diff --git a/src/core/utf8.h b/src/core/utf8.h index f1a8f0e1..6f02c5a0 100644 --- a/src/core/utf8.h +++ b/src/core/utf8.h @@ -33,6 +33,15 @@ int string_advance(char const **str, int policy); */ int string_policy(const char *str); +/* Return the length of the str string according to the given policy; if policy + * is -1, this function will call string_policy(). + */ +int string_length(const char *str, int policy); +/* Return the screen width of the str string according to the given policy; if + * policy is -1, this function will call string_policy(). + */ +int string_width(const char *str, int policy); + #define unichar_isprint(c) (((c) & ~0x80) >= 32) #define is_utf8_leading(c) (((c) & 0xc0) != 0x80) |