From 5b1b12ec9e5df91f8c8e3897b588244ae9873bfc Mon Sep 17 00:00:00 2001 From: panasenco Date: Mon, 19 Apr 2021 21:46:11 -0700 Subject: [PATCH] Fixed forward slash special case issue, added a bunch of test files that were successfully read! --- src/lib/json.pl | 10 ++-- src/tests/json/fail_bigint.json | 1 + src/tests/json/pass_alnum.json | 1 + src/tests/json/pass_bigfloat.json | 1 + src/tests/json/pass_everything.json | 56 ++++++++++++++++++++++ src/tests/json/pass_forward_slash.json | 1 + src/tests/json/pass_hex.json | 1 + src/tests/json/pass_mandatory_escapes.json | 1 + src/tests/json/pass_null.json | 1 + src/tests/json/pass_smallfloat.json | 1 + src/tests/json/pass_special.json | 1 + 11 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/tests/json/fail_bigint.json create mode 100644 src/tests/json/pass_alnum.json create mode 100644 src/tests/json/pass_bigfloat.json create mode 100644 src/tests/json/pass_everything.json create mode 100644 src/tests/json/pass_forward_slash.json create mode 100644 src/tests/json/pass_hex.json create mode 100644 src/tests/json/pass_mandatory_escapes.json create mode 100644 src/tests/json/pass_null.json create mode 100644 src/tests/json/pass_smallfloat.json create mode 100644 src/tests/json/pass_special.json diff --git a/src/lib/json.pl b/src/lib/json.pl index 1b0340f6..a134d30a 100644 --- a/src/lib/json.pl +++ b/src/lib/json.pl @@ -148,7 +148,7 @@ json_characters([Char|Chars]) --> json_character(Char), json_characters(Chars). escape_map([ '"' - '"', ('\\') - ('\\'), - ('/') - ('/'), + ('/') - ('/'), /* Forward slash parsed with or without a preceding backslash, but always generated with. */ '\b' - 'b', '\f' - 'f', '\n' - 'n', @@ -156,9 +156,13 @@ escape_map([ '\t' - 't' ]). json_character(PrintChar) --> + { ( nonvar(PrintChar) -> + dif(PrintChar, '/') /* Don't generate forward slash without preceding backslash */ + ; true + ) }, [PrintChar], - { escape_map(EscapeMap), - \+ member(PrintChar-_, EscapeMap), + { dif(PrintChar, '"'), + dif(PrintChar, '\\'), char_code(PrintChar, PrintCharCode), PrintCharCode in 32..1114111 /* 20.10FFFF */ }. json_character(EscapeChar) --> "\\", json_escape(EscapeChar). diff --git a/src/tests/json/fail_bigint.json b/src/tests/json/fail_bigint.json new file mode 100644 index 00000000..09c33d95 --- /dev/null +++ b/src/tests/json/fail_bigint.json @@ -0,0 +1 @@ +23456789012E666 diff --git a/src/tests/json/pass_alnum.json b/src/tests/json/pass_alnum.json new file mode 100644 index 00000000..b37bf501 --- /dev/null +++ b/src/tests/json/pass_alnum.json @@ -0,0 +1 @@ +"ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwyz0123456789" diff --git a/src/tests/json/pass_bigfloat.json b/src/tests/json/pass_bigfloat.json new file mode 100644 index 00000000..1c996bda --- /dev/null +++ b/src/tests/json/pass_bigfloat.json @@ -0,0 +1 @@ +1.234567890E+34 diff --git a/src/tests/json/pass_everything.json b/src/tests/json/pass_everything.json new file mode 100644 index 00000000..086b5562 --- /dev/null +++ b/src/tests/json/pass_everything.json @@ -0,0 +1,56 @@ +[ + "JSON Test Pattern pass1", + {"object with 1 member":["array with 1 element"]}, + {}, + [], + -42, + true, + false, + null, + { + "integer": 1234567890, + "real": -9876.543210, + "e": 0.123456789e-12, + "E": 1.234567890E+34, + "": 23456789012E66, + "zero": 0, + "one": 1, + "space": " ", + "quote": "\"", + "backslash": "\\", + "controls": "\b\f\n\r\t", + "slash": "/ & \/", + "alpha": "abcdefghijklmnopqrstuvwyz", + "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", + "digit": "0123456789", + "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", + "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + "true": true, + "false": false, + "null": null, + "array":[ ], + "object":{ }, + "address": "50 St. James Street", + "url": "http://www.JSON.org/", + "comment": "// /* */": " ", + " s p a c e d " :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ], + "compact": [1,2,3,4,5,6,7], + "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", + "quotes": "" \u0022 %22 0x22 034 "", + "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" +: "A key can be any string" + }, + 0.5 ,98.6 +, +99.44 +, + +1066 + + +,"rosebud"] diff --git a/src/tests/json/pass_forward_slash.json b/src/tests/json/pass_forward_slash.json new file mode 100644 index 00000000..803b3248 --- /dev/null +++ b/src/tests/json/pass_forward_slash.json @@ -0,0 +1 @@ +"/ & \/" diff --git a/src/tests/json/pass_hex.json b/src/tests/json/pass_hex.json new file mode 100644 index 00000000..e33d13b8 --- /dev/null +++ b/src/tests/json/pass_hex.json @@ -0,0 +1 @@ +"\u0123\u4567\u89AB\uCDEF\uabcd\uef4A" diff --git a/src/tests/json/pass_mandatory_escapes.json b/src/tests/json/pass_mandatory_escapes.json new file mode 100644 index 00000000..7a3191ba --- /dev/null +++ b/src/tests/json/pass_mandatory_escapes.json @@ -0,0 +1 @@ +" \" \\ \b\f\n\r\t " diff --git a/src/tests/json/pass_null.json b/src/tests/json/pass_null.json new file mode 100644 index 00000000..19765bd5 --- /dev/null +++ b/src/tests/json/pass_null.json @@ -0,0 +1 @@ +null diff --git a/src/tests/json/pass_smallfloat.json b/src/tests/json/pass_smallfloat.json new file mode 100644 index 00000000..85a4e511 --- /dev/null +++ b/src/tests/json/pass_smallfloat.json @@ -0,0 +1 @@ +0.123456789e-12 diff --git a/src/tests/json/pass_special.json b/src/tests/json/pass_special.json new file mode 100644 index 00000000..dbb9e9c7 --- /dev/null +++ b/src/tests/json/pass_special.json @@ -0,0 +1 @@ +"`1~!@#$%^&*()_+-={':[,]}|;.?" -- 2.54.0