diff options
Diffstat (limited to 'utils/write_c_string_literal.c')
-rw-r--r-- | utils/write_c_string_literal.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/utils/write_c_string_literal.c b/utils/write_c_string_literal.c new file mode 100644 index 00000000..e8b2f53b --- /dev/null +++ b/utils/write_c_string_literal.c @@ -0,0 +1,39 @@ +/* + * Write data to a file or BinarySink in the form of a C string + * literal, with any non-printable-ASCII character escaped + * appropriately. + */ + +#include "defs.h" +#include "misc.h" + +void BinarySink_put_c_string_literal(BinarySink *bs, ptrlen str) +{ + for (const char *p = str.ptr; p < (const char *)str.ptr + str.len; p++) { + char c = *p; + + if (c == '\n') + put_datalit(bs, "\\n"); + else if (c == '\r') + put_datalit(bs, "\\r"); + else if (c == '\t') + put_datalit(bs, "\\t"); + else if (c == '\b') + put_datalit(bs, "\\b"); + else if (c == '\\') + put_datalit(bs, "\\\\"); + else if (c == '"') + put_datalit(bs, "\\\""); + else if (c >= 32 && c <= 126) + put_byte(bs, c); + else + put_fmt(bs, "\\%03o", (unsigned)c & 0xFFU); + } +} + +void write_c_string_literal(FILE *fp, ptrlen str) +{ + stdio_sink s; + stdio_sink_init(&s, fp); + put_c_string_literal(&s, str); +} |