Module Name: src
Committed By: christos
Date: Wed Feb 20 18:40:50 UTC 2013
Modified Files:
src/lib/libc/gen: vis.c
Log Message:
Make the masks 64 bit wide so that they fit 6 character wide conversions.
Explain what's wrong with MB_LEN_MAX currently.
To generate a diff of this commit:
cvs rdiff -u -r1.56 -r1.57 src/lib/libc/gen/vis.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/gen/vis.c
diff -u src/lib/libc/gen/vis.c:1.56 src/lib/libc/gen/vis.c:1.57
--- src/lib/libc/gen/vis.c:1.56 Wed Feb 20 13:09:13 2013
+++ src/lib/libc/gen/vis.c Wed Feb 20 13:40:49 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: vis.c,v 1.56 2013/02/20 18:09:13 riz Exp $ */
+/* $NetBSD: vis.c,v 1.57 2013/02/20 18:40:49 christos Exp $ */
/*-
* Copyright (c) 1989, 1993
@@ -57,7 +57,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: vis.c,v 1.56 2013/02/20 18:09:13 riz Exp $");
+__RCSID("$NetBSD: vis.c,v 1.57 2013/02/20 18:40:49 christos Exp $");
#endif /* LIBC_SCCS and not lint */
#ifdef __FBSDID
__FBSDID("$FreeBSD$");
@@ -105,6 +105,17 @@ static wchar_t *do_svis(wchar_t *, wint_
#define MAXEXTRAS 10
+#ifdef notyet
+/*
+ * On NetBSD MB_LEN_MAX is currently 32 which does not fit on any integer
+ * integral type and it is probably wrong, since currently the maximum
+ * number of bytes and character needs is 6. Until this is fixed, the
+ * loops below are using sizeof(uint64_t) - 1 instead of MB_LEN_MAX, and
+ * the assertion is commented out.
+ */
+__CTASSERT(MB_LEN_MAX <= sizeof(uint64_t))
+#endif
+
/*
* This is do_hvis, for HTTP style (RFC 1808)
*/
@@ -238,7 +249,7 @@ static wchar_t *
do_svis(wchar_t *dst, wint_t c, int flags, wint_t nextc, const wchar_t *extra)
{
int iswextra, i, shft;
- wint_t bmsk, wmsk;
+ uint64_t bmsk, wmsk;
iswextra = wcschr(extra, c) != NULL;
if (!iswextra && (iswgraph(c) || iswwhite(c) ||
@@ -249,9 +260,9 @@ do_svis(wchar_t *dst, wint_t c, int flag
/* See comment in istrsenvisx() output loop, below. */
wmsk = 0;
- for (i = sizeof(wint_t) - 1; i >= 0; i--) {
+ for (i = sizeof(uint64_t) - 1; i >= 0; i--) {
shft = i * NBBY;
- bmsk = (wint_t)(0xffL << shft);
+ bmsk = (uint64_t)(0xffL << shft);
wmsk |= bmsk;
if ((c & wmsk) || i == 0)
dst = do_mbyte(dst, (wint_t)(
@@ -324,7 +335,8 @@ istrsenvisx(char *mbdst, size_t *dlen, c
{
wchar_t *dst, *src, *pdst, *psrc, *start, *extra;
size_t len, olen;
- wint_t c, bmsk, wmsk;
+ uint64_t bmsk, wmsk;
+ wint_t c;
visfun_t f;
int clen = 0, cerr = 0, error = -1, i, shft;
ssize_t mbslength, maxolen;
@@ -461,9 +473,9 @@ istrsenvisx(char *mbdst, size_t *dlen, c
*/
clen = 0;
wmsk = 0;
- for (i = sizeof(wint_t) - 1; i >= 0; i--) {
+ for (i = sizeof(uint64_t) - 1; i >= 0; i--) {
shft = i * NBBY;
- bmsk = (wint_t)(0xffL << shft);
+ bmsk = (uint64_t)(0xffL << shft);
wmsk |= bmsk;
if ((*dst & wmsk) || i == 0)
mbdst[clen++] = (char)((unsigned int)