|
|
#define _XOPEN_SOURCE 600 |
|
|
|
|
|
#include <stdarg.h> |
|
|
#include <string.h> |
|
|
#include <stdio.h> |
|
|
#include <stdlib.h> |
|
|
#include <ctype.h> |
|
|
|
|
|
#include "xmlrpc_config.h" |
|
|
#include "xmlrpc-c/string_int.h" |
|
|
|
|
|
|
|
|
|
|
|
const char * |
|
|
xmlrpc_makePrintable_lp(const char * const input, |
|
|
size_t const inputLength) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char * output; |
|
|
|
|
|
output = malloc(inputLength*4+1); |
|
|
|
|
|
|
|
|
if (output != NULL) { |
|
|
unsigned int inputCursor, outputCursor; |
|
|
|
|
|
for (inputCursor = 0, outputCursor = 0; |
|
|
inputCursor < inputLength; |
|
|
++inputCursor) { |
|
|
|
|
|
if (0) { |
|
|
} else if (input[inputCursor] == '\\') { |
|
|
output[outputCursor++] = '\\'; |
|
|
output[outputCursor++] = '\\'; |
|
|
} else if (input[inputCursor] == '\n') { |
|
|
output[outputCursor++] = '\\'; |
|
|
output[outputCursor++] = 'n'; |
|
|
} else if (input[inputCursor] == '\t') { |
|
|
output[outputCursor++] = '\\'; |
|
|
output[outputCursor++] = 't'; |
|
|
} else if (input[inputCursor] == '\a') { |
|
|
output[outputCursor++] = '\\'; |
|
|
output[outputCursor++] = 'a'; |
|
|
} else if (input[inputCursor] == '\r') { |
|
|
output[outputCursor++] = '\\'; |
|
|
output[outputCursor++] = 'r'; |
|
|
} else if (isprint(input[inputCursor])) { |
|
|
output[outputCursor++] = input[inputCursor]; |
|
|
} else { |
|
|
XMLRPC_SNPRINTF(&output[outputCursor], 5, "\\x%02x", |
|
|
(unsigned char)input[inputCursor]); |
|
|
outputCursor += 4; |
|
|
} |
|
|
} |
|
|
output[outputCursor++] = '\0'; |
|
|
} |
|
|
return output; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const char * |
|
|
xmlrpc_makePrintable(const char * const input) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return xmlrpc_makePrintable_lp(input, strlen(input)); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const char * |
|
|
xmlrpc_makePrintableChar(char const input) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char * retval; |
|
|
|
|
|
if (input == '\0') |
|
|
retval = strdup("\\0"); |
|
|
else { |
|
|
char buffer[2]; |
|
|
|
|
|
buffer[0] = input; |
|
|
buffer[1] = '\0'; |
|
|
|
|
|
retval = xmlrpc_makePrintable(buffer); |
|
|
} |
|
|
return retval; |
|
|
} |
|
|
|