diff options
Diffstat (limited to 'src/json')
| -rw-r--r-- | src/json/json.c | 8 | ||||
| -rw-r--r-- | src/json/test_json.c | 2 | ||||
| -rw-r--r-- | src/json/test_json/test_json_backspaces.json | 2 |
3 files changed, 9 insertions, 3 deletions
diff --git a/src/json/json.c b/src/json/json.c index b25839f..54057e0 100644 --- a/src/json/json.c +++ b/src/json/json.c @@ -182,7 +182,13 @@ parse_result parse_string(byte *src, uptr start_pos, uptr max_pos) { if (quote_mask != 0) { result.pos += stdc_trailing_zeros_ui(quote_mask); - break; + uptr backslash_count = 0; + while (backslash_count < result.pos && + src[result.pos - backslash_count - 1] == '\\') { + backslash_count++; + } + if (!(backslash_count & 1)) break; + result.pos++; }; } diff --git a/src/json/test_json.c b/src/json/test_json.c index b1df94b..9ab3cb7 100644 --- a/src/json/test_json.c +++ b/src/json/test_json.c @@ -219,6 +219,6 @@ i32 test_json_backspaces() { load_file(&perm, "src/json/test_json/test_json_backspaces.json"); JSON doc = JSON_parse(&perm, file.content, file.size); - t_assert_strequal(doc.as.string, S("weird text\\")); + t_assert_strequal(doc.as.string, S("weird text\\\\yo")); return 0; } diff --git a/src/json/test_json/test_json_backspaces.json b/src/json/test_json/test_json_backspaces.json index ceb65d6..8ae16fb 100644 --- a/src/json/test_json/test_json_backspaces.json +++ b/src/json/test_json/test_json_backspaces.json @@ -1 +1 @@ -"weird text\\" +"weird text\\yo" |
