diff options
| author | tnozaki <tnozaki@NetBSD.org> | 2008-08-12 20:51:25 +0000 |
|---|---|---|
| committer | tnozaki <tnozaki@NetBSD.org> | 2008-08-12 20:51:25 +0000 |
| commit | b5174f925f439c60c61602dbd4e0930d1386aaee (patch) | |
| tree | b30df91277e78d04977813f1c566318d282f89c9 /lib/libc | |
| parent | 24128eeff53407ea840b3d3aabde841562192c09 (diff) | |
SUSv3 says, wcwidth(wc) returns:
1) wc is nul wide-character, return 0.
2) wc is printable wide-character, return column width.
3) else, return -1.
but our implementation, case 3) returns 0. it's wrong!
Diffstat (limited to 'lib/libc')
| -rw-r--r-- | lib/libc/locale/iswctype.c | 13 | ||||
| -rw-r--r-- | lib/libc/locale/iswctype_sb.c | 10 | ||||
| -rw-r--r-- | lib/libc/string/wcswidth.c | 10 |
3 files changed, 23 insertions, 10 deletions
diff --git a/lib/libc/locale/iswctype.c b/lib/libc/locale/iswctype.c index de6465daee6..27c53ba6898 100644 --- a/lib/libc/locale/iswctype.c +++ b/lib/libc/locale/iswctype.c @@ -1,4 +1,4 @@ -/* $NetBSD: iswctype.c,v 1.15 2005/02/09 21:35:46 kleink Exp $ */ +/* $NetBSD: iswctype.c,v 1.16 2008/08/12 20:51:25 tnozaki Exp $ */ /* * Copyright (c) 1989 The Regents of the University of California. @@ -36,7 +36,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: iswctype.c,v 1.15 2005/02/09 21:35:46 kleink Exp $"); +__RCSID("$NetBSD: iswctype.c,v 1.16 2008/08/12 20:51:25 tnozaki Exp $"); #endif /* LIBC_SCCS and not lint */ #include "namespace.h" @@ -212,7 +212,14 @@ int wcwidth(c) wchar_t c; { - return (((unsigned)__runetype_w(c) & _CTYPE_SWM) >> _CTYPE_SWS); + _RuneType x; + + if (c == L'\0') + return 0; + x = __runetype_w(c); + if (x & _CTYPE_R) + return ((unsigned)x & _CTYPE_SWM) >> _CTYPE_SWS; + return -1; } #undef wctrans diff --git a/lib/libc/locale/iswctype_sb.c b/lib/libc/locale/iswctype_sb.c index 5507b2068ab..f0179e96b29 100644 --- a/lib/libc/locale/iswctype_sb.c +++ b/lib/libc/locale/iswctype_sb.c @@ -1,4 +1,4 @@ -/* $NetBSD: iswctype_sb.c,v 1.4 2004/07/21 20:27:46 tshiozak Exp $ */ +/* $NetBSD: iswctype_sb.c,v 1.5 2008/08/12 20:51:25 tnozaki Exp $ */ /* * Copyright (c) 1989 The Regents of the University of California. @@ -36,7 +36,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: iswctype_sb.c,v 1.4 2004/07/21 20:27:46 tshiozak Exp $"); +__RCSID("$NetBSD: iswctype_sb.c,v 1.5 2008/08/12 20:51:25 tnozaki Exp $"); #endif /* LIBC_SCCS and not lint */ #include <wchar.h> @@ -161,5 +161,9 @@ int wcwidth(c) wchar_t c; { - return 1; + if (c == L'\0') + return 0; + if (isprint((int)c)) + return 1; + return -1; } diff --git a/lib/libc/string/wcswidth.c b/lib/libc/string/wcswidth.c index bb7531badb7..54fc98a3159 100644 --- a/lib/libc/string/wcswidth.c +++ b/lib/libc/string/wcswidth.c @@ -1,4 +1,4 @@ -/* $NetBSD: wcswidth.c,v 1.3 2005/02/09 21:35:47 kleink Exp $ */ +/* $NetBSD: wcswidth.c,v 1.4 2008/08/12 20:51:25 tnozaki Exp $ */ /*- * Copyright (c)1999 Citrus Project, @@ -30,7 +30,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: wcswidth.c,v 1.3 2005/02/09 21:35:47 kleink Exp $"); +__RCSID("$NetBSD: wcswidth.c,v 1.4 2008/08/12 20:51:25 tnozaki Exp $"); #endif /* LIBC_SCCS and not lint */ #include "namespace.h" @@ -42,13 +42,15 @@ wcswidth(s, n) const wchar_t *s; size_t n; { - int w; + int w, x; _DIAGASSERT(s != NULL); w = 0; while (n && *s) { - w += wcwidth(*s); + x = wcwidth(*s); + if (x > 0) + w += x; s++; n--; } |
