11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* $OpenBSD: vis.c,v 1.19 2005/09/01 17:15:49 millert Exp $ */ 21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*- 31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 1989, 1993 41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * The Regents of the University of California. All rights reserved. 51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Redistribution and use in source and binary forms, with or without 71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * modification, are permitted provided that the following conditions 81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * are met: 91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 1. Redistributions of source code must retain the above copyright 101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * notice, this list of conditions and the following disclaimer. 111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 2. Redistributions in binary form must reproduce the above copyright 121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * notice, this list of conditions and the following disclaimer in the 131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * documentation and/or other materials provided with the distribution. 141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 3. Neither the name of the University nor the names of its contributors 151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * may be used to endorse or promote products derived from this software 161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * without specific prior written permission. 171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * SUCH DAMAGE. 291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* OPENBSD ORIGINAL: lib/libc/gen/vis.c */ 321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "includes.h" 341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#if !defined(HAVE_STRNVIS) 351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <ctype.h> 371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <string.h> 381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "vis.h" 401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7') 421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define isvisible(c) \ 431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood (((u_int)(c) <= UCHAR_MAX && isascii((u_char)(c)) && \ 441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood (((c) != '*' && (c) != '?' && (c) != '[' && (c) != '#') || \ 451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood (flag & VIS_GLOB) == 0) && isgraph((u_char)(c))) || \ 461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ((flag & VIS_SP) == 0 && (c) == ' ') || \ 471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ((flag & VIS_TAB) == 0 && (c) == '\t') || \ 481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ((flag & VIS_NL) == 0 && (c) == '\n') || \ 491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ((flag & VIS_SAFE) && ((c) == '\b' || \ 501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood (c) == '\007' || (c) == '\r' || \ 511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood isgraph((u_char)(c))))) 521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * vis - visually encode characters 551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodchar * 571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvis(char *dst, int c, int flag, int nextc) 581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (isvisible(c)) { 601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = c; 611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (c == '\\' && (flag & VIS_NOSLASH) == 0) 621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst = '\0'; 641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (dst); 651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (flag & VIS_CSTYLE) { 681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood switch(c) { 691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case '\n': 701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = 'n'; 721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood goto done; 731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case '\r': 741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = 'r'; 761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood goto done; 771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case '\b': 781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = 'b'; 801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood goto done; 811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case '\a': 821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = 'a'; 841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood goto done; 851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case '\v': 861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = 'v'; 881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood goto done; 891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case '\t': 901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = 't'; 921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood goto done; 931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case '\f': 941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = 'f'; 961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood goto done; 971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case ' ': 981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = 's'; 1001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood goto done; 1011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood case '\0': 1021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 1031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '0'; 1041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (isoctal(nextc)) { 1051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '0'; 1061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '0'; 1071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood goto done; 1091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (((c & 0177) == ' ') || (flag & VIS_OCTAL) || 1121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ((flag & VIS_GLOB) && (c == '*' || c == '?' || c == '[' || c == '#'))) { 1131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 1141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = ((u_char)c >> 6 & 07) + '0'; 1151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = ((u_char)c >> 3 & 07) + '0'; 1161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = ((u_char)c & 07) + '0'; 1171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood goto done; 1181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if ((flag & VIS_NOSLASH) == 0) 1201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 1211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (c & 0200) { 1221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood c &= 0177; 1231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = 'M'; 1241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (iscntrl((u_char)c)) { 1261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '^'; 1271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (c == 0177) 1281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '?'; 1291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else 1301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = c + '@'; 1311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } else { 1321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '-'; 1331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = c; 1341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwooddone: 1361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst = '\0'; 1371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (dst); 1381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 1411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * strvis, strnvis, strvisx - visually encode characters from src into dst 1421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 1431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Dst must be 4 times the size of src to account for possible 1441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * expansion. The length of dst, not including the trailing NULL, 1451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * is returned. 1461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 1471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Strnvis will write no more than siz-1 bytes (and will NULL terminate). 1481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * The number of bytes needed to fully encode the string is returned. 1491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 1501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Strvisx encodes exactly len bytes from src into dst. 1511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * This is useful for encoding a block of data. 1521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 1531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint 1541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstrvis(char *dst, const char *src, int flag) 1551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char c; 1571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char *start; 1581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood for (start = dst; (c = *src);) 1601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood dst = vis(dst, c, flag, *++src); 1611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst = '\0'; 1621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (dst - start); 1631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint 1661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstrnvis(char *dst, const char *src, size_t siz, int flag) 1671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char *start, *end; 1691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char tbuf[5]; 1701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood int c, i; 1711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood i = 0; 1731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood for (start = dst, end = start + siz - 1; (c = *src) && dst < end; ) { 1741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (isvisible(c)) { 1751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood i = 1; 1761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = c; 1771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (c == '\\' && (flag & VIS_NOSLASH) == 0) { 1781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* need space for the extra '\\' */ 1791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (dst < end) 1801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst++ = '\\'; 1811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else { 1821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood dst--; 1831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood i = 2; 1841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood break; 1851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood src++; 1881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } else { 1891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood i = vis(tbuf, c, flag, *++src) - tbuf; 1901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (dst + i <= end) { 1911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood memcpy(dst, tbuf, i); 1921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood dst += i; 1931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } else { 1941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood src--; 1951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood break; 1961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (siz > 0) 2001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst = '\0'; 2011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (dst + i > end) { 2021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* adjust return value for truncation */ 2031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood while ((c = *src)) 2041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood dst += vis(tbuf, c, flag, *++src) - tbuf; 2051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 2061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (dst - start); 2071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint 2101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstrvisx(char *dst, const char *src, size_t len, int flag) 2111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 2121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char c; 2131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char *start; 2141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood for (start = dst; len > 1; len--) { 2161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood c = *src; 2171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood dst = vis(dst, c, flag, *++src); 2181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 2191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (len) 2201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood dst = vis(dst, *src, flag, '\0'); 2211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *dst = '\0'; 2221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (dst - start); 2231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 226