From 67dd4112a7b7b7851b8a16d4715354a3a79a02a9 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Mon, 14 Jul 2025 17:35:10 +0200 Subject: improve key management --- mp | 18 ++++++++---------- readme.md | 1 - tests | 20 ++++++++++---------- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/mp b/mp index bd07162..06631cb 100755 --- a/mp +++ b/mp @@ -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) "]" diff --git a/readme.md b/readme.md index 69268e4..57b6462 100644 --- a/readme.md +++ b/readme.md @@ -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 diff --git a/tests b/tests index 8e5d20b..e416f3f 100755 --- a/tests +++ b/tests @@ -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' '{}' -- cgit v1.2.3