Module Name:    src
Committed By:   christos
Date:           Sat May 23 11:47:56 UTC 2015

Modified Files:
        src/lib/libc/gen: vis.3 vis.c

Log Message:
Add VIS_NOLOCALE to avoid ambiguous conversions.


To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/lib/libc/gen/vis.3
cvs rdiff -u -r1.66 -r1.67 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.3
diff -u src/lib/libc/gen/vis.3:1.42 src/lib/libc/gen/vis.3:1.43
--- src/lib/libc/gen/vis.3:1.42	Thu Sep 25 22:30:27 2014
+++ src/lib/libc/gen/vis.3	Sat May 23 07:47:56 2015
@@ -1,4 +1,4 @@
-.\"	$NetBSD: vis.3,v 1.42 2014/09/26 02:30:27 wiz Exp $
+.\"	$NetBSD: vis.3,v 1.43 2015/05/23 11:47:56 christos Exp $
 .\"
 .\" Copyright (c) 1989, 1991, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"     @(#)vis.3	8.1 (Berkeley) 6/9/93
 .\"
-.Dd September 26, 2014
+.Dd May 23, 2015
 .Dt VIS 3
 .Os
 .Sh NAME
@@ -436,6 +436,11 @@ The encoding conversion is influenced by
 environment variable which defines the set of characters
 that can be copied without encoding.
 .Pp
+If
+.Dv VIS_NOLOCALE
+is set, processing is done assuming the C locale and overriding
+any other environment settings.
+.Pp
 When 8-bit data is present in the input,
 .Ev LC_CTYPE
 must be set to the correct locale or to the C locale.

Index: src/lib/libc/gen/vis.c
diff -u src/lib/libc/gen/vis.c:1.66 src/lib/libc/gen/vis.c:1.67
--- src/lib/libc/gen/vis.c:1.66	Fri Sep 26 11:58:59 2014
+++ src/lib/libc/gen/vis.c	Sat May 23 07:47:56 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: vis.c,v 1.66 2014/09/26 15:58:59 roy Exp $	*/
+/*	$NetBSD: vis.c,v 1.67 2015/05/23 11:47:56 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.66 2014/09/26 15:58:59 roy Exp $");
+__RCSID("$NetBSD: vis.c,v 1.67 2015/05/23 11:47:56 christos Exp $");
 #endif /* LIBC_SCCS and not lint */
 #ifdef __FBSDID
 __FBSDID("$FreeBSD$");
@@ -334,7 +334,7 @@ makeextralist(int flags, const char *src
 	if ((dst = calloc(len + MAXEXTRAS, sizeof(*dst))) == NULL)
 		return NULL;
 
-	if (mbstowcs(dst, src, len) == (size_t)-1) {
+	if ((flags & VIS_NOLOCALE) || mbstowcs(dst, src, len) == (size_t)-1) {
 		size_t i;
 		for (i = 0; i < len; i++)
 			dst[i] = (wchar_t)(u_char)src[i];
@@ -373,7 +373,7 @@ istrsenvisx(char *mbdst, size_t *dlen, c
 	uint64_t bmsk, wmsk;
 	wint_t c;
 	visfun_t f;
-	int clen = 0, cerr = 0, error = -1, i, shft;
+	int clen = 0, cerr, error = -1, i, shft;
 	ssize_t mbslength, maxolen;
 
 	_DIAGASSERT(mbdst != NULL);
@@ -402,9 +402,13 @@ istrsenvisx(char *mbdst, size_t *dlen, c
 	dst = pdst;
 	src = psrc;
 
-	/* Use caller's multibyte conversion error flag. */
-	if (cerr_ptr)
-		cerr = *cerr_ptr;
+	if (flags & VIS_NOLOCALE) {
+		/* Do one byte at a time conversion */
+		cerr = 1;
+	} else {
+		/* Use caller's multibyte conversion error flag. */
+		cerr = cerr_ptr ? *cerr_ptr : 0;
+	}
 
 	/*
 	 * Input loop.
@@ -531,9 +535,11 @@ istrsenvisx(char *mbdst, size_t *dlen, c
 	/* Terminate the output string. */
 	*mbdst = '\0';
 
-	/* Pass conversion error flag out. */
-	if (cerr_ptr)
-		*cerr_ptr = cerr;
+	if (flags & VIS_NOLOCALE) {
+		/* Pass conversion error flag out. */
+		if (cerr_ptr)
+			*cerr_ptr = cerr;
+	}
 
 	free(extra);
 	free(pdst);

Reply via email to