macro and text revision (-mdoc version 3)
[unix-history] / usr / src / lib / libc / gen / vis.c
CommitLineData
8da38493 1/*-
9c260c06
MT
2 * Copyright (c) 1989 The Regents of the University of California.
3 * All rights reserved.
4 *
8da38493 5 * %sccs.include.redist.c%
9c260c06
MT
6 */
7
8#if defined(LIBC_SCCS) && !defined(lint)
c5980113 9static char sccsid[] = "@(#)vis.c 5.4 (Berkeley) %G%";
9c260c06
MT
10#endif /* LIBC_SCCS and not lint */
11
12#include <sys/types.h>
13#include <ctype.h>
8da38493 14#include <vis.h>
9c260c06 15
9c260c06
MT
16#define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
17
18/*
a11b735c 19 * vis - visually encode characters
9c260c06 20 */
9c260c06 21char *
c5980113
DS
22#if __STDC__
23vis(register char *dst, register char c, register int flag, char nextc)
24#else
a11b735c
MT
25vis(dst, c, flag, nextc)
26 register char *dst, c;
27 char nextc;
28 register int flag;
c5980113 29#endif
9c260c06 30{
a11b735c 31 if (isascii(c) && isgraph(c) ||
8da38493
MT
32 ((flag & VIS_SP) == 0 && c == ' ') ||
33 ((flag & VIS_TAB) == 0 && c == '\t') ||
34 ((flag & VIS_NL) == 0 && c == '\n') ||
a11b735c
MT
35 ((flag & VIS_SAFE) && (c == '\b' || c == '\007' || c == '\r'))) {
36 *dst++ = c;
37 if (c == '\\' && (flag & VIS_NOSLASH) == 0)
38 *dst++ = '\\';
39 *dst = '\0';
40 return (dst);
9c260c06 41 }
a11b735c 42
a11b735c 43 if (flag & VIS_CSTYLE) {
9c260c06
MT
44 switch(c) {
45 case '\n':
8da38493 46 *dst++ = '\\';
a11b735c 47 *dst++ = 'n';
9c260c06
MT
48 goto done;
49 case '\r':
8da38493 50 *dst++ = '\\';
a11b735c 51 *dst++ = 'r';
9c260c06
MT
52 goto done;
53 case '\b':
8da38493 54 *dst++ = '\\';
a11b735c 55 *dst++ = 'b';
9c260c06 56 goto done;
c5980113
DS
57#if __STDC__
58 case '\a':
59#else
60 case '\007':
61#endif
8da38493 62 *dst++ = '\\';
a11b735c 63 *dst++ = 'a';
9c260c06
MT
64 goto done;
65 case '\v':
8da38493 66 *dst++ = '\\';
a11b735c 67 *dst++ = 'v';
9c260c06
MT
68 goto done;
69 case '\t':
8da38493 70 *dst++ = '\\';
a11b735c 71 *dst++ = 't';
9c260c06
MT
72 goto done;
73 case '\f':
8da38493 74 *dst++ = '\\';
a11b735c 75 *dst++ = 'f';
9c260c06
MT
76 goto done;
77 case ' ':
8da38493 78 *dst++ = '\\';
a11b735c 79 *dst++ = 's';
9c260c06
MT
80 goto done;
81 case '\0':
8da38493 82 *dst++ = '\\';
a11b735c 83 *dst++ = '0';
8da38493 84 if (isoctal(nextc)) {
a11b735c
MT
85 *dst++ = '0';
86 *dst++ = '0';
9c260c06
MT
87 }
88 goto done;
89 }
90 }
a11b735c 91 if (((c & 0177) == ' ') || (flag & VIS_OCTAL)) {
8da38493 92 *dst++ = '\\';
a11b735c
MT
93 *dst++ = ((u_char)c >> 6 & 07) + '0';
94 *dst++ = ((u_char)c >> 3 & 07) + '0';
95 *dst++ = ((u_char)c & 07) + '0';
9c260c06
MT
96 goto done;
97 }
8da38493
MT
98 if ((flag & VIS_NOSLASH) == 0)
99 *dst++ = '\\';
a11b735c
MT
100 if (c & 0200) {
101 c &= 0177;
102 *dst++ = 'M';
103 }
104 if (iscntrl(c)) {
105 *dst++ = '^';
106 if (c == 0177)
107 *dst++ = '?';
9c260c06 108 else
a11b735c
MT
109 *dst++ = c + '@';
110 } else {
111 *dst++ = '-';
112 *dst++ = c;
9c260c06 113 }
9c260c06 114done:
a11b735c
MT
115 *dst = '\0';
116 return (dst);
9c260c06
MT
117}
118
9c260c06 119/*
8da38493
MT
120 * strvis, strvisx - visually encode characters from src into dst
121 *
122 * Dst must be 4 times the size of src to account for possible
123 * expansion. The length of dst, not including the trailing NULL,
124 * is returned.
9c260c06 125 *
8da38493
MT
126 * Strvisx encodes exactly len bytes from src into dst.
127 * This is useful for encoding a block of data.
9c260c06 128 */
c5980113 129int
8da38493 130strvis(dst, src, flag)
c5980113
DS
131 register char *dst;
132 register const char *src;
133 int flag;
9c260c06 134{
8da38493
MT
135 register char c;
136 char *start = dst;
9c260c06 137
8da38493
MT
138 for (;c = *src; src++)
139 dst = vis(dst, c, flag, *(src+1));
9c260c06 140
8da38493 141 return (dst - start);
9c260c06 142}
a11b735c 143
c5980113 144int
8da38493 145strvisx(dst, src, len, flag)
c5980113
DS
146 register char *dst;
147 register const char *src;
148 register size_t len;
149 int flag;
a11b735c
MT
150{
151 char *start = dst;
152
8da38493
MT
153 while (len > 1) {
154 dst = vis(dst, *src, flag, *(src+1));
155 len--;
a11b735c 156 }
8da38493
MT
157 if (len)
158 dst = vis(dst, *src, flag, '\0');
a11b735c
MT
159
160 return (dst - start);
161}