]> granicus.if.org Git - jq/commitdiff
Handle NUL in escaped-string output 758/head
authorAssaf Gordon <assafgordon@gmail.com>
Mon, 20 Apr 2015 20:51:48 +0000 (16:51 -0400)
committerAssaf Gordon <assafgordon@gmail.com>
Mon, 20 Apr 2015 20:51:48 +0000 (16:51 -0400)
When escaping string (e.g. for `@tsv` or `@csv` outputs),
escape NULs as '\0'.

Existing behaviour, unchanged by this patch:

    $ echo '"a\u0000b"' | ./jq '.'
    "a\u0000b"
    $ echo '"a\u0000b"' | ./jq -r '.' | od -a
    0000000   a nul   b  nl
    0000004

When using `@tsv`, escape NUL to `\0`:

    $ echo '"a\u0000b"' | ./jq -r '[.]|@tsv'
    a\0b
    $ echo '"a\u0000b"' | ./jq '[.]|@tsv'
    "a\\0b"

builtin.c

index 16037983f6185385af2ae84e7f0ee4d73f63267a..24838ea6af74134127e66a0686ad5d888c491c14 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -336,6 +336,7 @@ static jv escape_string(jv input, const char* escapings) {
   assert(jv_get_kind(input) == JV_KIND_STRING);
   const char* lookup[128] = {0};
   const char* p = escapings;
+  lookup[0] = "\\0";
   while (*p) {
     lookup[(int)*p] = p+1;
     p++;
@@ -349,7 +350,6 @@ static jv escape_string(jv input, const char* escapings) {
   const char* cstart;
   int c = 0;
   while ((i = jvp_utf8_next((cstart = i), end, &c))) {
-    assert(c > 0);
     if (c < 128 && lookup[c]) {
       ret = jv_string_append_str(ret, lookup[c]);
     } else {