From: Geoffrey Thomas Date: Fri, 30 Jan 2009 09:41:28 +0000 (-0500) Subject: utf8: add utf8_strwidth() X-Git-Tag: v1.6.2-rc0~16^2~1 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=8a9391e9440028c03345afa9f21459237a529592;p=git.git utf8: add utf8_strwidth() I'm about to use this pattern more than once, so make it a common function. Signed-off-by: Geoffrey Thomas Signed-off-by: Junio C Hamano --- diff --git a/utf8.c b/utf8.c index dc3735364..ddfdc5e2b 100644 --- a/utf8.c +++ b/utf8.c @@ -246,6 +246,25 @@ int utf8_width(const char **start, size_t *remainder_p) return git_wcwidth(ch); } +/* + * Returns the total number of columns required by a null-terminated + * string, assuming that the string is utf8. Returns strlen() instead + * if the string does not look like a valid utf8 string. + */ +int utf8_strwidth(const char *string) +{ + int width = 0; + const char *orig = string; + + while (1) { + if (!string) + return strlen(orig); + if (!*string) + return width; + width += utf8_width(&string, NULL); + } +} + int is_utf8(const char *text) { while (*text) { diff --git a/utf8.h b/utf8.h index 98cce1b03..2f1b14ff4 100644 --- a/utf8.h +++ b/utf8.h @@ -5,6 +5,7 @@ typedef unsigned int ucs_char_t; /* assuming 32bit int */ ucs_char_t pick_one_utf8_char(const char **start, size_t *remainder_p); int utf8_width(const char **start, size_t *remainder_p); +int utf8_strwidth(const char *string); int is_utf8(const char *text); int is_encoding_utf8(const char *name);