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