Module Name: src
Committed By: christos
Date: Wed Feb 13 22:15:44 UTC 2013
Modified Files:
src/lib/libc/gen: vis.c
Log Message:
Fix from J.R. Oldroyd for wide chars > 2
To generate a diff of this commit:
cvs rdiff -u -r1.49 -r1.50 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.49 src/lib/libc/gen/vis.c:1.50
--- src/lib/libc/gen/vis.c:1.49 Wed Feb 13 10:22:09 2013
+++ src/lib/libc/gen/vis.c Wed Feb 13 17:15:43 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: vis.c,v 1.49 2013/02/13 15:22:09 christos Exp $ */
+/* $NetBSD: vis.c,v 1.50 2013/02/13 22:15:43 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.49 2013/02/13 15:22:09 christos Exp $");
+__RCSID("$NetBSD: vis.c,v 1.50 2013/02/13 22:15:43 christos Exp $");
#endif /* LIBC_SCCS and not lint */
#ifdef __FBSDID
__FBSDID("$FreeBSD$");
@@ -288,10 +288,11 @@ istrsnvisx(char *mbdst, size_t *dlen, co
int flag, const char *mbextra)
{
wchar_t *dst, *src, *pdst, *psrc, *start, *extra, *nextra;
- size_t len, olen, mbslength;
+ size_t len, olen;
wint_t c;
visfun_t f;
int clen, error = -1;
+ ssize_t mbslength;
_DIAGASSERT(mbdst != NULL);
_DIAGASSERT(mbsrc != NULL);
@@ -311,30 +312,25 @@ istrsnvisx(char *mbdst, size_t *dlen, co
dst = pdst;
src = psrc;
- if (mblength > 1) {
- mbslength = mblength;
- while (mbslength) {
- clen = mbtowc(src, mbsrc, mbslength);
- if (clen < 0) {
- *src = (wint_t)(u_char)*mbsrc;
- clen = 1;
- }
- if (clen == 0)
- clen = 1;
- src++;
- mbsrc += clen;
- mbslength -= clen;
- }
- len = src - psrc;
- src = psrc;
- } else {
- len = mblength;
- src[0] = (wint_t)(u_char)mbsrc[0];
- src[1] = (wint_t)(u_char)mbsrc[1];
- }
if (mblength < len)
len = mblength;
+ mbslength = (ssize_t)mblength;
+ while (mbslength > 0) {
+ clen = mbtowc(src, mbsrc, MB_LEN_MAX);
+ if (clen < 0) {
+ *src = (wint_t)(u_char)*mbsrc;
+ clen = 1;
+ }`
+ if (clen == 0)
+ clen = 1;
+ src++;
+ mbsrc += clen;
+ mbslength -= clen;
+ }
+ len = src - psrc;
+ src = psrc;
+
mbstowcs(extra, mbextra, strlen(mbextra));
MAKEEXTRALIST(flag, nextra, extra);
if (!nextra) {