diff options
| author | Marc Vertes <mvertes@free.fr> | 2025-07-14 17:35:10 +0200 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2025-07-14 17:35:10 +0200 |
| commit | 67dd4112a7b7b7851b8a16d4715354a3a79a02a9 (patch) | |
| tree | 10fd333c62b9a760c21ae4b34ca88bee3644e1e7 | |
| parent | da2a57d9209f36c5439c1051a97f2af4a5faa0dc (diff) | |
improve key management
| -rwxr-xr-x | mp | 18 | ||||
| -rw-r--r-- | readme.md | 1 | ||||
| -rwxr-xr-x | tests | 20 |
3 files changed, 18 insertions, 21 deletions
@@ -80,7 +80,7 @@ function parse(name, mem, key, line, i) { mem[key, "type"] = "array" for (i = 0; TOKEN != "]"; i++) { if (i > 0 && TOKEN != ",") return error("not a ','", line) - line = parse(name, mem, key SUBSEP "value" SUBSEP i, line) + line = parse(name, mem, key SUBSEP i, line) if (ERROR) { if (i == 0 && TOKEN == "]") ERROR = "" break @@ -94,10 +94,10 @@ function parse(name, mem, key, line, i) { line = scan(name, line) if (i == 0 && TOKEN == "}") break if (TOKEN != "string") return error("not a string", line) - mem[key, "key", i] = TOKSTR + mem[key, i, "key"] = TOKSTR line = scan(name, line) if (TOKEN != ":") return error("not a ':'", line) - line = parse(name, mem, key SUBSEP "value" SUBSEP i, line) + line = parse(name, mem, key SUBSEP i, line) if (ERROR) return line line = scan(name, line) } @@ -108,7 +108,7 @@ function parse(name, mem, key, line, i) { return line } -function json_format(mem, key, indent, i, k, t, s, pre, post, ksep) { +function json_format(mem, key, indent, i, t, s, pre, post, ksep) { pre = indent ? space(indent * 2) : "" post = indent ? "\n" : "" ksep = indent ? ": " : ":" @@ -119,9 +119,8 @@ function json_format(mem, key, indent, i, k, t, s, pre, post, ksep) { if (t == "object") { s = "{" post for (i = 0; ; i++) { - k = key SUBSEP "value" SUBSEP i - if (! (k SUBSEP "type" in mem)) break - s = s pre "\"" mem[key, "key", i] "\"" ksep json_format(mem, k, indent ? indent+1 : 0) "," post + if (! ((key, i , "type") in mem)) break + s = s pre "\"" mem[key, i, "key"] "\"" ksep json_format(mem, key SUBSEP i, indent ? indent+1 : 0) "," post } if (i) s = substr(s, 1, length(s) - length(post) - 1) return s post substr(pre, 3) "}" @@ -129,9 +128,8 @@ function json_format(mem, key, indent, i, k, t, s, pre, post, ksep) { if (t == "array") { s = "[" post for (i = 0; ; i++) { - k = key SUBSEP "value" SUBSEP i - if (! (k SUBSEP "type" in mem)) break - s = s pre json_format(mem, k, indent ? indent+1 : 0) "," post + if (! ((key, i , "type") in mem)) break + s = s pre json_format(mem, key SUBSEP i, indent ? indent+1 : 0) "," post } if (i) s = substr(s, 1, length(s) - length(post) - 1) return s post substr(pre, 3) "]" @@ -20,7 +20,6 @@ Key elements: - k: key (object only) - v: value (array and object) - t: type (one of T, F, N, s, n, a, o) -- l: length (number of array values, or object key-value pairs). - [0-9]+: index of key or value ## I/O @@ -14,13 +14,13 @@ run() { pass=0 fail=0 filter="$1" trap 'echo "$pass passed, $fail failed"; exit $((fail != 0))' EXIT -run basic1 'parse_string\nformat' '' -run basic2 'parse_string null\nformat' 'null' -run basic3 'parse_string true\nformat' 'true' -run basic4 'parse_string false\nformat' 'false' -run num1 'parse_string 12\nformat' '12' -run str1 'parse_string "hello"\nformat' '"hello"' -run arr1 'parse_string []\nformat' '[]' -run arr2 'parse_string [null]\nformat' '[null]' -run arr3 'parse_string [true,false]\nformat' '[true,false]' -run obj1 'parse_string {}\nformat' '{}' +run basic_1 'parse_string\nformat' '' +run basic_2 'parse_string null\nformat' 'null' +run basic_3 'parse_string true\nformat' 'true' +run basic_4 'parse_string false\nformat' 'false' +run number_1 'parse_string 12\nformat' '12' +run string_1 'parse_string "hello"\nformat' '"hello"' +run array_1 'parse_string []\nformat' '[]' +run array_2 'parse_string [null]\nformat' '[null]' +run array_3 'parse_string [true,false]\nformat' '[true,false]' +run object_1 'parse_string {}\nformat' '{}' |
