diff options
author | Bruno Haible <bruno@clisp.org> | 2007-07-07 21:38:16 +0000 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2007-07-07 21:38:16 +0000 |
commit | 7599e817ca9e12244449ca2fad855b96f6c8b817 (patch) | |
tree | 8c52047e97b3ac3f6044a24e9ca9e378d4a95713 /lib/wcwidth.c | |
parent | b7f0f487160002614050bf70533c41970ad2b108 (diff) | |
download | gnulib-7599e817ca9e12244449ca2fad855b96f6c8b817.tar.gz |
Work around MacOS X wcwidth(0x0301) bug.
Diffstat (limited to 'lib/wcwidth.c')
-rw-r--r-- | lib/wcwidth.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/lib/wcwidth.c b/lib/wcwidth.c index 57fb0a467b..77042c2ae3 100644 --- a/lib/wcwidth.c +++ b/lib/wcwidth.c @@ -23,8 +23,30 @@ /* Get iswprint. */ #include <wctype.h> +#include "localcharset.h" +#include "streq.h" +#include "uniwidth.h" + +#undef wcwidth + int rpl_wcwidth (wchar_t wc) { - return wc == 0 ? 0 : iswprint (wc) ? 1 : -1; + /* In UTF-8 locales, use a Unicode aware width function. */ + const char *encoding = locale_charset (); + if (STREQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0 ,0)) + { + /* We assume that in a UTF-8 locale, a wide character is the same as a + Unicode character. */ + return uc_width (wc, encoding); + } + else + { + /* Otherwise, fall back to the system's wcwidth function. */ +#if HAVE_WCWIDTH + return wcwidth (wc); +#else + return wc == 0 ? 0 : iswprint (wc) ? 1 : -1; +#endif + } } |