annotate rvinterf/libprint/back_esc.c @ 926:6a0aa8d36d06

rvinterf backslash escape: introduce libprint The new helper function library named libprint is meant to replace the badly misnamed libg23, and will soon contain functions for printing all of the same kinds of GPF TST packets that are now handled in libg23. However, we are also moving safe_print_trace() from libasync to this new library, and changing it to emit our new backslash escape format.
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 23 May 2023 03:47:46 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
926
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * The function implemented in this module prints a potentially-dirty string
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * into a buffer with C-style backslash escapes, including doubling of any
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * already-present backslashes. The output buffer must be sized for up to
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * 4x expansion, plus the terminating NUL.
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 */
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <sys/types.h>
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <ctype.h>
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <stdio.h>
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 void
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 safe_print_trace(src, srclen, dest)
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 u_char *src;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 char *dest;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 {
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 int i, c;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 char *dp;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 dp = dest;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 for (i = 0; i < srclen; i++) {
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 c = src[i];
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 switch (c) {
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 case '\\':
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 *dp++ = '\\';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 *dp++ = '\\';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 continue;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 case '\r':
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 *dp++ = '\\';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 *dp++ = 'r';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 continue;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 case '\n':
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 *dp++ = '\\';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 *dp++ = 'n';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 continue;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 }
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 if (c >= ' ' && c <= '~')
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 *dp++ = c;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 else if (c <= 7 && (i+1 == srclen || !isdigit(src[i+1]))) {
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 sprintf(dp, "\\%d", c);
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 dp += 2;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 } else {
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 sprintf(dp, "\\x%02X", c);
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 dp += 4;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 }
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 }
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 *dp = '\0';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 }