write_c_string_literal.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /*
  2. * Write data to a file or BinarySink in the form of a C string
  3. * literal, with any non-printable-ASCII character escaped
  4. * appropriately.
  5. */
  6. #include "defs.h"
  7. #include "misc.h"
  8. void BinarySink_put_c_string_literal(BinarySink *bs, ptrlen str)
  9. {
  10. const char *p; // WINSCP
  11. for (p = str.ptr; p < (const char *)str.ptr + str.len; p++) {
  12. char c = *p;
  13. if (c == '\n')
  14. put_datalit(bs, "\\n");
  15. else if (c == '\r')
  16. put_datalit(bs, "\\r");
  17. else if (c == '\t')
  18. put_datalit(bs, "\\t");
  19. else if (c == '\b')
  20. put_datalit(bs, "\\b");
  21. else if (c == '\\')
  22. put_datalit(bs, "\\\\");
  23. else if (c == '"')
  24. put_datalit(bs, "\\\"");
  25. else if (c >= 32 && c <= 126)
  26. put_byte(bs, c);
  27. else
  28. put_fmt(bs, "\\%03o", (unsigned)c & 0xFFU);
  29. }
  30. }
  31. void write_c_string_literal(FILE *fp, ptrlen str)
  32. {
  33. stdio_sink s;
  34. stdio_sink_init(&s, fp);
  35. put_c_string_literal(&s, str);
  36. }