]> Cypherpunks repositories - keks.git/commitdiff
Command-line pretty-printer
authorSergey Matveev <stargrave@stargrave.org>
Wed, 13 Nov 2024 13:59:33 +0000 (16:59 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 13 Nov 2024 17:34:30 +0000 (20:34 +0300)
pyac/pyac.py

index 85a30a59028ee1572ec66165ddbc1b3d1dfe9a65aa35764a66d04114871bd4c5..da93f15164fb9ed3b6c3a02b5d2a6dbe0357dcbe7596b0f7e8bbc0d9834ec749 100644 (file)
@@ -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())