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