From: Sergey Matveev Date: Wed, 13 Nov 2024 13:59:33 +0000 (+0300) Subject: Command-line pretty-printer X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f0e0d6255aad56f749096614cbe48383b4cf34ed31bff68a4dd0536beeb32d26;p=keks.git Command-line pretty-printer --- diff --git a/pyac/pyac.py b/pyac/pyac.py index 85a30a5..da93f15 100644 --- a/pyac/pyac.py +++ b/pyac/pyac.py @@ -226,7 +226,7 @@ def _int(v): _EOC = object() -def loads(v): +def loads(v, sets=False): if len(v) == 0: raise NotEnoughData(1) if v[0] == TagEOC: @@ -314,7 +314,7 @@ def loads(v): ret = [] v = v[1:] while True: - i, v = loads(v) + i, v = loads(v, sets=sets) if i == _EOC: break ret.append(i) @@ -323,6 +323,7 @@ def loads(v): ret = {} v = v[1:] kPrev = "" + allNILs = True while True: k, v = loads(v) if k == _EOC: @@ -331,11 +332,15 @@ def loads(v): raise DecodeError("non-string key") if (len(k) < len(kPrev)) or ((len(k) == len(kPrev)) and (k <= kPrev)): raise DecodeError("unsorted keys") - i, v = loads(v) + i, v = loads(v, sets=sets) if k == _EOC: raise DecodeError("unexpected EOC") ret[k] = i kPrev = k + if i is not None: + allNILs = False + if sets and allNILs: + ret = set(ret.keys()) return ret, v if v[0] == TagBlob: if len(v) < 1+8: @@ -359,3 +364,19 @@ def loads(v): raise DecodeError("unexpected tag") return Blob(l, b"".join(raws)), v raise DecodeError("unknown tag") + + +if __name__ == "__main__": + from argparse import ArgumentParser + from argparse import FileType + parser = ArgumentParser(description="Decode YAC file") + parser.add_argument("--nosets", action="store_true", + help="Do not fold NIL-valued maps to sets") + parser.add_argument("file", type=FileType("rb")) + args = parser.parse_args() + data = args.file.read() + data, tail = loads(data, sets=not args.nosets) + from pprint import pprint + pprint(data) + if tail != b"": + print("tail:", tail.hex())