xref: /csrg-svn/lib/libc/gen/vis.c (revision 44302)
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