summaryrefslogtreecommitdiff
path: root/lib/libc
diff options
context:
space:
mode:
authortnozaki <tnozaki@NetBSD.org>2008-08-12 20:51:25 +0000
committertnozaki <tnozaki@NetBSD.org>2008-08-12 20:51:25 +0000
commitb5174f925f439c60c61602dbd4e0930d1386aaee (patch)
treeb30df91277e78d04977813f1c566318d282f89c9 /lib/libc
parent24128eeff53407ea840b3d3aabde841562192c09 (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.c13
-rw-r--r--lib/libc/locale/iswctype_sb.c10
-rw-r--r--lib/libc/string/wcswidth.c10
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--;
}