1*44302Smarc /*- 239284Smarc * Copyright (c) 1989 The Regents of the University of California. 339284Smarc * All rights reserved. 439284Smarc * 5*44302Smarc * %sccs.include.redist.c% 639284Smarc */ 739284Smarc 839284Smarc #if defined(LIBC_SCCS) && !defined(lint) 9*44302Smarc static char sccsid[] = "@(#)vis.c 5.3 (Berkeley) 06/26/90"; 1039284Smarc #endif /* LIBC_SCCS and not lint */ 1139284Smarc 1239284Smarc #include <sys/types.h> 1339284Smarc #include <ctype.h> 14*44302Smarc #include <vis.h> 1539284Smarc 1639284Smarc #define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7') 1739284Smarc 1839284Smarc /* 1941757Smarc * vis - visually encode characters 2039284Smarc */ 2139284Smarc char * 2241757Smarc vis(dst, c, flag, nextc) 2341757Smarc register char *dst, c; 2441757Smarc char nextc; 2541757Smarc register int flag; 2639284Smarc { 2741757Smarc if (isascii(c) && isgraph(c) || 28*44302Smarc ((flag & VIS_SP) == 0 && c == ' ') || 29*44302Smarc ((flag & VIS_TAB) == 0 && c == '\t') || 30*44302Smarc ((flag & VIS_NL) == 0 && c == '\n') || 3141757Smarc ((flag & VIS_SAFE) && (c == '\b' || c == '\007' || c == '\r'))) { 3241757Smarc *dst++ = c; 3341757Smarc if (c == '\\' && (flag & VIS_NOSLASH) == 0) 3441757Smarc *dst++ = '\\'; 3541757Smarc *dst = '\0'; 3641757Smarc return (dst); 3741757Smarc } 3839284Smarc 3941757Smarc if (flag & VIS_CSTYLE) { 4039284Smarc switch(c) { 4139284Smarc case '\n': 42*44302Smarc *dst++ = '\\'; 4341757Smarc *dst++ = 'n'; 4439284Smarc goto done; 4539284Smarc case '\r': 46*44302Smarc *dst++ = '\\'; 4741757Smarc *dst++ = 'r'; 4839284Smarc goto done; 4939284Smarc case '\b': 50*44302Smarc *dst++ = '\\'; 5141757Smarc *dst++ = 'b'; 5239284Smarc goto done; 5341757Smarc case '\007': /* waiting for ansi compiler */ 54*44302Smarc *dst++ = '\\'; 5541757Smarc *dst++ = 'a'; 5639284Smarc goto done; 5739284Smarc case '\v': 58*44302Smarc *dst++ = '\\'; 5941757Smarc *dst++ = 'v'; 6039284Smarc goto done; 6139284Smarc case '\t': 62*44302Smarc *dst++ = '\\'; 6341757Smarc *dst++ = 't'; 6439284Smarc goto done; 6539284Smarc case '\f': 66*44302Smarc *dst++ = '\\'; 6741757Smarc *dst++ = 'f'; 6839284Smarc goto done; 6939284Smarc case ' ': 70*44302Smarc *dst++ = '\\'; 7141757Smarc *dst++ = 's'; 7239284Smarc goto done; 7339284Smarc case '\0': 74*44302Smarc *dst++ = '\\'; 7541757Smarc *dst++ = '0'; 76*44302Smarc if (isoctal(nextc)) { 7741757Smarc *dst++ = '0'; 7841757Smarc *dst++ = '0'; 7939284Smarc } 8039284Smarc goto done; 8139284Smarc } 8239284Smarc } 8341757Smarc if (((c & 0177) == ' ') || (flag & VIS_OCTAL)) { 84*44302Smarc *dst++ = '\\'; 8541757Smarc *dst++ = ((u_char)c >> 6 & 07) + '0'; 8641757Smarc *dst++ = ((u_char)c >> 3 & 07) + '0'; 8741757Smarc *dst++ = ((u_char)c & 07) + '0'; 8839284Smarc goto done; 8939284Smarc } 90*44302Smarc if ((flag & VIS_NOSLASH) == 0) 91*44302Smarc *dst++ = '\\'; 9241757Smarc if (c & 0200) { 9341757Smarc c &= 0177; 9441757Smarc *dst++ = 'M'; 9541757Smarc } 9641757Smarc if (iscntrl(c)) { 9741757Smarc *dst++ = '^'; 9841757Smarc if (c == 0177) 9941757Smarc *dst++ = '?'; 10039284Smarc else 10141757Smarc *dst++ = c + '@'; 10241757Smarc } else { 10341757Smarc *dst++ = '-'; 10441757Smarc *dst++ = c; 10539284Smarc } 10639284Smarc done: 10741757Smarc *dst = '\0'; 10841757Smarc return (dst); 10939284Smarc } 11039284Smarc 11139284Smarc /* 112*44302Smarc * strvis, strvisx - visually encode characters from src into dst 113*44302Smarc * 114*44302Smarc * Dst must be 4 times the size of src to account for possible 115*44302Smarc * expansion. The length of dst, not including the trailing NULL, 116*44302Smarc * is returned. 11739284Smarc * 118*44302Smarc * Strvisx encodes exactly len bytes from src into dst. 119*44302Smarc * This is useful for encoding a block of data. 12039284Smarc */ 121*44302Smarc strvis(dst, src, flag) 122*44302Smarc register char *dst, *src; 12339284Smarc { 124*44302Smarc register char c; 125*44302Smarc char *start = dst; 12639284Smarc 127*44302Smarc for (;c = *src; src++) 128*44302Smarc dst = vis(dst, c, flag, *(src+1)); 12939284Smarc 130*44302Smarc return (dst - start); 13139284Smarc } 13241757Smarc 133*44302Smarc strvisx(dst, src, len, flag) 13441757Smarc register char *dst, *src; 13541757Smarc register int len; 13641757Smarc { 13741757Smarc char *start = dst; 13841757Smarc 139*44302Smarc while (len > 1) { 140*44302Smarc dst = vis(dst, *src, flag, *(src+1)); 141*44302Smarc len--; 14241757Smarc } 143*44302Smarc if (len) 144*44302Smarc dst = vis(dst, *src, flag, '\0'); 14541757Smarc 14641757Smarc return (dst - start); 14741757Smarc } 148