summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2025-07-14 17:35:10 +0200
committerMarc Vertes <mvertes@free.fr>2025-07-14 17:35:10 +0200
commit67dd4112a7b7b7851b8a16d4715354a3a79a02a9 (patch)
tree10fd333c62b9a760c21ae4b34ca88bee3644e1e7
parentda2a57d9209f36c5439c1051a97f2af4a5faa0dc (diff)
improve key management
-rwxr-xr-xmp18
-rw-r--r--readme.md1
-rwxr-xr-xtests20
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' '{}'