| /*- | 
 |  * Copyright (c) 1989, 1993 | 
 |  *	The Regents of the University of California.  All rights reserved. | 
 |  * | 
 |  * Redistribution and use in source and binary forms, with or without | 
 |  * modification, are permitted provided that the following conditions | 
 |  * are met: | 
 |  * 1. Redistributions of source code must retain the above copyright | 
 |  *    notice, this list of conditions and the following disclaimer. | 
 |  * 2. Redistributions in binary form must reproduce the above copyright | 
 |  *    notice, this list of conditions and the following disclaimer in the | 
 |  *    documentation and/or other materials provided with the distribution. | 
 |  * 3. All advertising materials mentioning features or use of this software | 
 |  *    must display the following acknowledgement: | 
 |  *	This product includes software developed by the University of | 
 |  *	California, Berkeley and its contributors. | 
 |  * 4. Neither the name of the University nor the names of its contributors | 
 |  *    may be used to endorse or promote products derived from this software | 
 |  *    without specific prior written permission. | 
 |  * | 
 |  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | 
 |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
 |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
 |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | 
 |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
 |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 
 |  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
 |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 
 |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 
 |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
 |  * SUCH DAMAGE. | 
 |  */ | 
 |  | 
 | #if defined(LIBC_SCCS) && !defined(lint) | 
 | static char rcsid[] = "$OpenBSD: vis.c,v 1.5 2000/07/19 15:25:13 deraadt Exp $"; | 
 | #endif /* LIBC_SCCS and not lint */ | 
 |  | 
 | #ifndef HAVE_VIS | 
 |  | 
 | #include "includes.h" | 
 |  | 
 | #define	isoctal(c)	(((u_char)(c)) >= '0' && ((u_char)(c)) <= '7') | 
 |  | 
 | /* | 
 |  * vis - visually encode characters | 
 |  */ | 
 | char *vis(char *dst, int c, int flag, int nextc) | 
 | { | 
 | 	if (((u_int)c <= UCHAR_MAX && isascii((u_char)c) && | 
 | 	    isgraph((u_char)c)) || | 
 | 	   ((flag & VIS_SP) == 0 && c == ' ') || | 
 | 	   ((flag & VIS_TAB) == 0 && c == '\t') || | 
 | 	   ((flag & VIS_NL) == 0 && c == '\n') || | 
 | 	   ((flag & VIS_SAFE) && (c == '\b' || c == '\007' || c == '\r'))) { | 
 | 		*dst++ = c; | 
 | 		if (c == '\\' && (flag & VIS_NOSLASH) == 0) | 
 | 			*dst++ = '\\'; | 
 | 		*dst = '\0'; | 
 | 		return (dst); | 
 | 	} | 
 |  | 
 | 	if (flag & VIS_CSTYLE) { | 
 | 		switch(c) { | 
 | 		case '\n': | 
 | 			*dst++ = '\\'; | 
 | 			*dst++ = 'n'; | 
 | 			goto done; | 
 | 		case '\r': | 
 | 			*dst++ = '\\'; | 
 | 			*dst++ = 'r'; | 
 | 			goto done; | 
 | 		case '\b': | 
 | 			*dst++ = '\\'; | 
 | 			*dst++ = 'b'; | 
 | 			goto done; | 
 | #ifdef __STDC__ | 
 | 		case '\a': | 
 | #else | 
 | 		case '\007': | 
 | #endif | 
 | 			*dst++ = '\\'; | 
 | 			*dst++ = 'a'; | 
 | 			goto done; | 
 | 		case '\v': | 
 | 			*dst++ = '\\'; | 
 | 			*dst++ = 'v'; | 
 | 			goto done; | 
 | 		case '\t': | 
 | 			*dst++ = '\\'; | 
 | 			*dst++ = 't'; | 
 | 			goto done; | 
 | 		case '\f': | 
 | 			*dst++ = '\\'; | 
 | 			*dst++ = 'f'; | 
 | 			goto done; | 
 | 		case ' ': | 
 | 			*dst++ = '\\'; | 
 | 			*dst++ = 's'; | 
 | 			goto done; | 
 | 		case '\0': | 
 | 			*dst++ = '\\'; | 
 | 			*dst++ = '0'; | 
 | 			if (isoctal(nextc)) { | 
 | 				*dst++ = '0'; | 
 | 				*dst++ = '0'; | 
 | 			} | 
 | 			goto done; | 
 | 		} | 
 | 	} | 
 | 	if (((c & 0177) == ' ') || (flag & VIS_OCTAL)) {	 | 
 | 		*dst++ = '\\'; | 
 | 		*dst++ = ((u_char)c >> 6 & 07) + '0'; | 
 | 		*dst++ = ((u_char)c >> 3 & 07) + '0'; | 
 | 		*dst++ = ((u_char)c & 07) + '0'; | 
 | 		goto done; | 
 | 	} | 
 | 	if ((flag & VIS_NOSLASH) == 0) | 
 | 		*dst++ = '\\'; | 
 | 	if (c & 0200) { | 
 | 		c &= 0177; | 
 | 		*dst++ = 'M'; | 
 | 	} | 
 | 	if (iscntrl(c)) { | 
 | 		*dst++ = '^'; | 
 | 		if (c == 0177) | 
 | 			*dst++ = '?'; | 
 | 		else | 
 | 			*dst++ = c + '@'; | 
 | 	} else { | 
 | 		*dst++ = '-'; | 
 | 		*dst++ = c; | 
 | 	} | 
 | done: | 
 | 	*dst = '\0'; | 
 | 	return (dst); | 
 | } | 
 | #endif /* HAVE_VIS */ |