Commit | Line | Data |
---|---|---|
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 | 9 | static 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 | 21 | char * |
c5980113 DS |
22 | #if __STDC__ |
23 | vis(register char *dst, register char c, register int flag, char nextc) | |
24 | #else | |
a11b735c MT |
25 | vis(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 | 114 | done: |
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 | 129 | int |
8da38493 | 130 | strvis(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 | 144 | int |
8da38493 | 145 | strvisx(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 | } |