#include #include #include #include #include "xmlrpc.h" #include "xmlrpc_int.h" #include "xmlrpc_config.h" const char * xmlrpc_makePrintable(const char * const input) { /*---------------------------------------------------------------------------- Convert an arbitrary string of bytes (null-terminated, though) to printable ASCII. E.g. convert newlines to "\n". Return the result in newly malloc'ed storage. Return NULL if we can't get the storage. -----------------------------------------------------------------------------*/ char * output; const size_t inputLength = strlen(input); output = malloc(inputLength*4+1); if (output != NULL) { unsigned int inputCursor, outputCursor; for (inputCursor = 0, outputCursor = 0; inputCursor < inputLength; ++inputCursor) { if (isprint((int)(input[inputCursor]))) output[outputCursor++] = input[inputCursor]; 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 { snprintf(&output[outputCursor], 4, "\\x%02x", input[inputCursor]); } } output[outputCursor+1] = '\0'; } return output; } 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; }