1
0

xmlrpc_strutil.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5. #include "xmlrpc.h"
  6. #include "xmlrpc_int.h"
  7. #include "xmlrpc_config.h"
  8. const char *
  9. xmlrpc_makePrintable(const char * const input) {
  10. /*----------------------------------------------------------------------------
  11. Convert an arbitrary string of bytes (null-terminated, though) to
  12. printable ASCII. E.g. convert newlines to "\n".
  13. Return the result in newly malloc'ed storage. Return NULL if we can't
  14. get the storage.
  15. -----------------------------------------------------------------------------*/
  16. char * output;
  17. const unsigned int inputLength = strlen(input);
  18. output = malloc(inputLength*4+1);
  19. if (output != NULL) {
  20. unsigned int inputCursor, outputCursor;
  21. for (inputCursor = 0, outputCursor = 0;
  22. inputCursor < inputLength;
  23. ++inputCursor) {
  24. if (isprint((int)(input[inputCursor])))
  25. output[outputCursor++] = input[inputCursor];
  26. else if (input[inputCursor] == '\n') {
  27. output[outputCursor++] = '\\';
  28. output[outputCursor++] = 'n';
  29. } else if (input[inputCursor] == '\t') {
  30. output[outputCursor++] = '\\';
  31. output[outputCursor++] = 't';
  32. } else if (input[inputCursor] == '\a') {
  33. output[outputCursor++] = '\\';
  34. output[outputCursor++] = 'a';
  35. } else if (input[inputCursor] == '\r') {
  36. output[outputCursor++] = '\\';
  37. output[outputCursor++] = 'r';
  38. } else {
  39. snprintf(&output[outputCursor], 4, "\\x%02x",
  40. input[inputCursor]);
  41. }
  42. }
  43. output[outputCursor+1] = '\0';
  44. }
  45. return output;
  46. }
  47. const char *
  48. xmlrpc_makePrintableChar(char const input) {
  49. const char * retval;
  50. if (input == '\0')
  51. retval = strdup("\\0");
  52. else {
  53. char buffer[2];
  54. buffer[0] = input;
  55. buffer[1] = '\0';
  56. retval = xmlrpc_makePrintable(buffer);
  57. }
  58. return retval;
  59. }