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