]> Cypherpunks repositories - keks.git/commitdiff
Better C printer
authorSergey Matveev <stargrave@stargrave.org>
Wed, 9 Oct 2024 09:58:19 +0000 (12:58 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 9 Oct 2024 10:11:46 +0000 (13:11 +0300)
cyac/README
cyac/clean
cyac/cmd/.gitignore [moved from cyac/example/.gitignore with 54% similarity]
cyac/cmd/all.do [new file with mode: 0644]
cyac/cmd/clean [new file with mode: 0755]
cyac/cmd/default.do [moved from cyac/example/default.do with 100% similarity]
cyac/cmd/print.c [moved from cyac/example/print-map.c with 86% similarity]
cyac/cmd/test-vector.c [moved from cyac/example/test-vector.c with 100% similarity]
cyac/example/all.do [deleted file]
cyac/example/clean [deleted file]
cyac/iter.c

index 41c7d662b8525f7296acbc2e8892fe58599bb811d78a383e53350f5d6cd67df4..c12c3fb7ac559269197ec994d93584fe7c132757b3f5b4aa5155d5581898d2d6 100644 (file)
@@ -17,7 +17,7 @@ enc.* contains encoders for various atoms. Containers and blobs must
 be made manually, by finishing them with proper EOC/BIN and sorting the
 keys. enctai.* contains converter from UTC to TAI64.
 
-example/test-vector.c is the same structure as in tyac/test-vector.tcl.
+cmd/test-vector.c is the same structure as in tyac/test-vector.tcl.
 Their outputs must be the same.
 
 Project uses redo (http://cr.yp.to/redo.html) build system, but it is
index 4ced8c32f41e1477cc75d175c6f1eb9ab201a70888cb0631ca8e299ca9f75a77..593bb0ee48522fc63c5a7151e5748e31f65a585fb9c17b4e8d748cb3a5a9f45e 100755 (executable)
@@ -1,4 +1,4 @@
 #!/bin/sh -e
 
-( cd example ; ./clean )
+( cd cmd ; ./clean )
 exec rm -f *.o *.a compile_flags.txt
similarity index 54%
rename from cyac/example/.gitignore
rename to cyac/cmd/.gitignore
index 4681da69be05cbf8e908e8d25969267ba3df07b88ed3e8cf1255bf045956f34c..141e7b825317bde3df13e4b137a76a9ca40acee68e025815788d0b8e50d9d509 100644 (file)
@@ -1,2 +1,2 @@
-/print-map
+/print
 /test-vector
diff --git a/cyac/cmd/all.do b/cyac/cmd/all.do
new file mode 100644 (file)
index 0000000..f4beb87
--- /dev/null
@@ -0,0 +1 @@
+redo-ifchange print test-vector
diff --git a/cyac/cmd/clean b/cyac/cmd/clean
new file mode 100755 (executable)
index 0000000..f59dba6
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh -e
+
+exec rm -f print test-vector
similarity index 100%
rename from cyac/example/default.do
rename to cyac/cmd/default.do
similarity index 86%
rename from cyac/example/print-map.c
rename to cyac/cmd/print.c
index 62d8aec3c6a3e561967cd4409249454ec663ae5eb900c3f5bab0cbf912e02efe..214fc3fd129b03bb24baceacc4fcb76c4a1f18684b9941ba74745f75318d3fca 100644 (file)
@@ -69,6 +69,7 @@ myCb(
             return YACErrUnexpectedEOC;
         }
     }
+    printf("%04zd ", *off);
     for (ptrdiff_t i = 0; i < state->indent; i++) {
         fputs("  ", stdout);
     }
@@ -83,7 +84,6 @@ myCb(
     enum YACErr err = YACErrInvalid;
     switch (atom->typ) {
     case YACItemEOC:
-        fputs("]\n", stdout);
         break;
     case YACItemNIL:
         fputs("NIL\n", stdout);
@@ -96,7 +96,7 @@ myCb(
         break;
     case YACItemUUID:
         printf(
-            "UUID[%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x]\n",
+            "UUID(%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x)\n",
             atom->val.buf[0],
             atom->val.buf[1],
             atom->val.buf[2],
@@ -121,28 +121,31 @@ myCb(
         fprintf(stdout, "%zd\n", atom->val.sint);
         break;
     case YACItemList:
-        fputs("LIST [\n", stdout);
+        fputs("[\n", stdout);
         state->indent++;
         err = YACIterList(cbState, atom, off, buf, len, myCb);
         if (err != YACErrNo) {
             return err;
         }
+        fputs("]\n", stdout);
         break;
     case YACItemMap:
-        fputs("MAP [\n", stdout);
+        fputs("{\n", stdout);
         state->indent++;
         err = YACIterMap(cbState, atom, off, buf, len, myCb);
         if (err != YACErrNo) {
             return err;
         }
+        fputs("}\n", stdout);
         break;
     case YACItemBlob:
-        fputs("BLOB [\n", stdout);
+        fputs("BLOB(\n", stdout);
         state->indent++;
         err = YACIterBlob(cbState, atom, off, buf, len, myCb);
         if (err != YACErrNo) {
             return err;
         }
+        fputs(")\n", stdout);
         break;
     case YACItemFloat:
         fputs("FLOAT: TODO\n", stdout);
@@ -150,23 +153,23 @@ myCb(
     case YACItemTAI64:
         if ((atom->len) == 16) {
             hex = HexEnc(atom->val.buf, atom->len);
-            fprintf(stdout, "TAI64NA: %s\n", hex);
+            fprintf(stdout, "TAI64NA(%s)\n", hex);
             free(hex);
             break;
         }
         switch (atom->len) {
         case 8:
-            fputs("TAI64", stdout);
+            fputs("TAI64(", stdout);
             break;
         case 12:
-            fputs("TAI64N", stdout);
+            fputs("TAI64N(", stdout);
             break;
         }
         struct timeval tv;
         err = YACTAI64ToTimeval(&tv, atom->val.buf, atom->len);
         if (err == YACErrTAI64BadNsec) {
             hex = HexEnc(atom->val.buf, atom->len);
-            fprintf(stdout, "unrepresentable: %s\n", hex);
+            fprintf(stdout, "unrepresentable: %s)\n", hex);
             free(hex);
             break;
         }
@@ -177,7 +180,7 @@ myCb(
         struct tm *tm = localtime(&t);
         if (tm == NULL) {
             hex = HexEnc(atom->val.buf, atom->len);
-            fprintf(stdout, "unrepresentable: %s\n", hex);
+            fprintf(stdout, "unrepresentable: %s)\n", hex);
             free(hex);
             break;
         }
@@ -187,11 +190,11 @@ myCb(
         if ((atom->len) == 12) {
             fprintf(stdout, ".%zu", tv.tv_usec);
         }
-        fputs("\n", stdout);
+        fputs(")\n", stdout);
         break;
     case YACItemBin:
         hex = HexEnc(atom->val.buf, atom->len);
-        fprintf(stdout, "BIN(%s)\n", hex);
+        fprintf(stdout, "%zu:%s\n", atom->len, hex);
         free(hex);
         break;
     case YACItemStr:
@@ -201,15 +204,15 @@ myCb(
         break;
     case YACItemChunk:
         hex = HexEnc(atom->val.buf, atom->len);
-        fprintf(stdout, "CHUNK(%s)\n", hex);
+        fprintf(stdout, "%s\n", hex);
         free(hex);
         break;
     case YACItemChunkLen:
-        fprintf(stdout, "chunkLen: %zu\n", atom->val.uint);
+        fprintf(stdout, "l=%zu\n", atom->val.uint);
         break;
     case YACItemRaw:
         hex = HexEnc(atom->val.buf, atom->len);
-        fprintf(stdout, "RAW: 0x%X %s\n", atom->tag, hex);
+        fprintf(stdout, "(t=0x%X l=%zu v=%s)\n", atom->tag, atom->len, hex);
         free(hex);
         break;
     default:
@@ -240,16 +243,11 @@ main(int argc, char **argv)
         fprintf(stderr, "map err: %d\n", err);
         return EXIT_FAILURE;
     }
-    if (atom.typ != YACItemMap) {
-        fputs("non map\n", stderr);
-        return EXIT_FAILURE;
-    }
     off += atom.off;
-    struct CbState cbState = {.indent = 1};
-    fputs("MAP [\n", stdout);
-    err = YACIterMap(&cbState, &atom, &off, buf, len, myCb);
+    struct CbState cbState = {.indent = 0};
+    err = myCb(NULL, 0, -1, &cbState, &atom, &off, buf, len);
     if (err != YACErrNo) {
-        fprintf(stderr, "iter err: %d\n", err);
+        fprintf(stderr, "err: %d\n", err);
         return EXIT_FAILURE;
     }
     assert(cbState.indent == 0);
diff --git a/cyac/example/all.do b/cyac/example/all.do
deleted file mode 100644 (file)
index e32e2ab..0000000
+++ /dev/null
@@ -1 +0,0 @@
-redo-ifchange print-map test-vector
diff --git a/cyac/example/clean b/cyac/example/clean
deleted file mode 100755 (executable)
index 2403ed9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh -e
-
-exec rm -f print-map test-vector
index a7071cc3eb5a0cbd0e550e2053e0881a7ec393c33b379c586999d0a517d878b9..9405ccad3b660c66a60a6ada402c187a82cfea18fa2ab127797e59ff295a7a5e 100644 (file)
@@ -127,7 +127,7 @@ YACIterBlob(
         return YACErrLenTooBig;
     }
     atom->typ = YACItemChunkLen;
-    err = cb(NULL, 0, 0, cbState, atom, off, buf, len);
+    err = cb(NULL, 0, -1, cbState, atom, off, buf, len);
     if (err != YACErrNo) {
         return err;
     }
@@ -143,6 +143,7 @@ YACIterBlob(
             if (((ptrdiff_t)len - *off) <= (ptrdiff_t)chunkLen) {
                 return YACErrBlobShortChunk;
             }
+            atom->typ = YACItemChunk;
             atom->val.buf = buf + *off;
             atom->len = chunkLen;
             (*off) += chunkLen;
@@ -171,12 +172,9 @@ YACIterBlob(
         default:
             return YACErrBlobBadAtom;
         }
-        if ((atom->len) > 0) {
-            atom->typ = YACItemChunk;
-            err = cb(NULL, 0, (ptrdiff_t)n, cbState, atom, off, buf, len);
-            if (err != YACErrNo) {
-                return err;
-            }
+        err = cb(NULL, 0, (ptrdiff_t)n, cbState, atom, off, buf, len);
+        if (err != YACErrNo) {
+            return err;
         }
     }
     atom->typ = YACItemEOC;