Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/gen Add VIS_NOLOCALE to avoid ambiguous conversions.



details:   https://anonhg.NetBSD.org/src/rev/a2a099fe0b78
branches:  trunk
changeset: 808559:a2a099fe0b78
user:      christos <christos%NetBSD.org@localhost>
date:      Sat May 23 11:47:56 2015 +0000

description:
Add VIS_NOLOCALE to avoid ambiguous conversions.

diffstat:

 lib/libc/gen/vis.3 |   9 +++++++--
 lib/libc/gen/vis.c |  26 ++++++++++++++++----------
 2 files changed, 23 insertions(+), 12 deletions(-)

diffs (98 lines):

diff -r d970015a3144 -r a2a099fe0b78 lib/libc/gen/vis.3
--- a/lib/libc/gen/vis.3        Sat May 23 09:18:01 2015 +0000
+++ b/lib/libc/gen/vis.3        Sat May 23 11:47:56 2015 +0000
@@ -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 @@
 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.
diff -r d970015a3144 -r a2a099fe0b78 lib/libc/gen/vis.c
--- a/lib/libc/gen/vis.c        Sat May 23 09:18:01 2015 +0000
+++ b/lib/libc/gen/vis.c        Sat May 23 11:47:56 2015 +0000
@@ -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 @@
        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 @@
        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 @@
        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 @@
        /* 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);



Home | Main Index | Thread Index | Old Index