aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/json/json.c8
-rw-r--r--src/json/test_json.c2
-rw-r--r--src/json/test_json/test_json_backspaces.json2
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"