summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2007-07-07 21:38:16 +0000
committerBruno Haible <bruno@clisp.org>2007-07-07 21:38:16 +0000
commit7599e817ca9e12244449ca2fad855b96f6c8b817 (patch)
tree8c52047e97b3ac3f6044a24e9ca9e378d4a95713 /lib
parentb7f0f487160002614050bf70533c41970ad2b108 (diff)
downloadgnulib-7599e817ca9e12244449ca2fad855b96f6c8b817.tar.gz
Work around MacOS X wcwidth(0x0301) bug.
Diffstat (limited to 'lib')
-rw-r--r--lib/wcwidth.c24
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
+ }
}