7 #include "xmlrpc_int.h"
8 #include "xmlrpc_config.h"
13 xmlrpc_makePrintable(const char * const input
) {
14 /*----------------------------------------------------------------------------
15 Convert an arbitrary string of bytes (null-terminated, though) to
16 printable ASCII. E.g. convert newlines to "\n".
18 Return the result in newly malloc'ed storage. Return NULL if we can't
20 -----------------------------------------------------------------------------*/
22 const size_t inputLength
= strlen(input
);
24 output
= malloc(inputLength
*4+1);
27 unsigned int inputCursor
, outputCursor
;
29 for (inputCursor
= 0, outputCursor
= 0;
30 inputCursor
< inputLength
;
33 if (isprint((int)(input
[inputCursor
])))
34 output
[outputCursor
++] = input
[inputCursor
];
35 else if (input
[inputCursor
] == '\n') {
36 output
[outputCursor
++] = '\\';
37 output
[outputCursor
++] = 'n';
38 } else if (input
[inputCursor
] == '\t') {
39 output
[outputCursor
++] = '\\';
40 output
[outputCursor
++] = 't';
41 } else if (input
[inputCursor
] == '\a') {
42 output
[outputCursor
++] = '\\';
43 output
[outputCursor
++] = 'a';
44 } else if (input
[inputCursor
] == '\r') {
45 output
[outputCursor
++] = '\\';
46 output
[outputCursor
++] = 'r';
48 snprintf(&output
[outputCursor
], 4, "\\x%02x",
52 output
[outputCursor
+1] = '\0';
60 xmlrpc_makePrintableChar(char const input
) {
65 retval
= strdup("\\0");
72 retval
= xmlrpc_makePrintable(buffer
);