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) {

Reply via email to