X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=json.awk;h=93f6b498c9c277bcaff45551f1d6b3cd599d9102;hb=7c0cb1f9fb1b5684991570e0fcb401a0502c7ee3;hp=6408253a49ce0273620edca1d2e3a0869855721c;hpb=74f2519f03ada38ce9309ae4d15a32c83affd645;p=~andy%2Frhawk diff --git a/json.awk b/json.awk index 6408253..93f6b49 100644 --- a/json.awk +++ b/json.awk @@ -114,23 +114,28 @@ function json_write_string(string) # Read functions -function json_tokenize(str, tokens, i, items, table, type, found) +function json_tokenize(str, tokens, i, line, items, table, type, found) { table["term"] = "^[\\[\\]{}:,]" table["str"] = "^\"[^\"]*\"" table["num"] = "^[+-]?[0-9]+(.[0-9]+)?" table["var"] = "^(true|false|null)" - table["space"] = "^[ \\t\\n]+" - i = 0 + table["space"] = "^[ \\t]+" + table["line"] = "^\n" + i = 0; + line = 1; while (length(str) > 0) { found = 0 for (type in table) { #print "match: str=["str"] type="type" regex=/"table[type]"/" if (match(str, table[type], items) > 0) { #print " len="RLENGTH" item=["items[0]"]" + if (type == "line") + line++; if (type == "term") type = items[0] - if (type != "space") { + if (type != "space" && type != "line") { + tokens[i]["line"] = line tokens[i]["type"] = type tokens[i]["text"] = items[0] i++ @@ -141,7 +146,7 @@ function json_tokenize(str, tokens, i, items, table, type, found) } } if (!found) { - debug("error tokenizing") + debug("line " line ": error tokenizing") return 0 } } @@ -152,11 +157,12 @@ function json_tokenize(str, tokens, i, items, table, type, found) # tokens[i]["type"], tokens[i]["text"] } -function json_parse_value(tokens, i, value, key, type, text) +function json_parse_value(tokens, i, value, key, line, type, text) { if (!i ) i = 0; if (!depth) depth = 0 depth++ + line = tokens[i]["line"] type = tokens[i]["type"] text = tokens[i]["text"] #printf "parse %d: i=%-2d type=%-3s text=%s\n", depth, i, type, text @@ -166,7 +172,7 @@ function json_parse_value(tokens, i, value, key, type, text) case "str": i = json_parse_string(tokens, i, value, key); break case "num": i = json_parse_number(tokens, i, value, key); break case "var": i = json_parse_var(tokens, i, value, key); break - default: debug("error: type="type" text="text); return 0 + default: debug("line "line": error type="type" text="text); return 0 } depth-- return i @@ -177,18 +183,20 @@ function json_parse_object(tokens, i, value, key, object, k, v) if (tokens[i++]["text"] != "{") return 0; - do { - delete k - delete v - if (!(i=json_parse_value(tokens, i, k, 0))) - return 0 - if (tokens[i++]["text"] != ":") - return 0 - if (!(i=json_parse_value(tokens, i, v, 0))) - return 0 - json_copy(object, k[0], v[0]) - } while (tokens[i++]["text"] == ",") - i-- + if (tokens[i]["text"] != "}") { + do { + delete k + delete v + if (!(i=json_parse_value(tokens, i, k, 0))) + return 0 + if (tokens[i++]["text"] != ":") + return 0 + if (!(i=json_parse_value(tokens, i, v, 0))) + return 0 + json_copy(object, k[0], v[0]) + } while (tokens[i++]["text"] == ",") + i-- + } if (tokens[i++]["text"] != "}") return 0; @@ -199,17 +207,18 @@ function json_parse_object(tokens, i, value, key, object, k, v) function json_parse_array(tokens, i, value, key, array, k, v) { - #print "parse_array: .." if (tokens[i++]["text"] != "[") return 0; - do { - delete v - if (!(i=json_parse_value(tokens, i, v, 0))) - return 0 - json_copy(array, k++, v[0]) - } while (tokens[i++]["text"] == ",") - i-- + if (tokens[i]["text"] != "]") { + do { + delete v + if (!(i=json_parse_value(tokens, i, v, 0))) + return 0 + json_copy(array, k++, v[0]) + } while (tokens[i++]["text"] == ",") + i-- + } if (tokens[i++]["text"] != "]") return 0; @@ -262,6 +271,7 @@ function json_load(file, var, line, text, tokens, data, key) return data[0] for (key in data[0]) json_copy(var, key, data[0][key]) + return 1 } function json_save(file, var, cmd, tmp) @@ -310,25 +320,27 @@ function json_test_read() json_parse_value(tokens, 0, array, 0) print json_write_value(array[0]) - json = "{ \"first\": { \"arr\": [ \"\", " \ - " -1, " \ - " 1.2, " \ - " true, " \ - " false, " \ - " null ], " \ - " \"number\": 42, " \ - " \"obj\": { \"A\": \"a!\", " \ - " \"B\": \"b!\", " \ - " \"C\": \"c!\" }, " \ - " \"str\": \"hello, world\" }, " \ - " \"second\": { \"arr\": [ \"zero\", " \ - " \"one\", " \ - " \"two\" ], " \ - " \"number\": 42, " \ - " \"obj\": { \"A\": \"a!\", " \ - " \"B\": \"b!\", " \ - " \"C\": \"c!\" }, " \ - " \"str\": \"hello, world\" } }" + json = "{ \"first\": { \"arr\": [ \"\", \n" \ + " -1, \n" \ + " 1.2, \n" \ + " true, \n" \ + " false, \n" \ + " null ], \n" \ + " \"number\": 42, \n" \ + " \"eobj\": [ ], \n" \ + " \"earr\": { }, \n" \ + " \"obj\": { \"A\": \"a!\", \n" \ + " \"B\": \"b!\", \n" \ + " \"C\": \"c!\" }, \n" \ + " \"str\": \"hello, world\" }, \n" \ + " \"second\": { \"arr\": [ \"zero\", \n" \ + " \"one\", \n" \ + " \"two\" ], \n" \ + " \"number\": 42, \n" \ + " \"obj\": { \"A\": \"a!\", \n" \ + " \"B\": \"b!\", \n" \ + " \"C\": \"c!\" }, \n" \ + " \"str\": \"hello, world\" } }\n" json_tokenize(json, tokens) json_parse_value(tokens, 0, array, 0)