]> Cypherpunks repositories - keks.git/commitdiff
Try pp till EOF
authorSergey Matveev <stargrave@stargrave.org>
Thu, 23 Jan 2025 07:19:22 +0000 (10:19 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Thu, 23 Jan 2025 07:19:22 +0000 (10:19 +0300)
c/cmd/pp/pp.c
go/cmd/pp/main.go

index 717893bbadad7efa01b2002fa566591c2cd9cb2156ef3e2da0cbc5e5c00c2aea..a5964462c30934217a115afaab2910fc5860fbf456511bb61a5dcaa643efd494 100644 (file)
@@ -353,47 +353,39 @@ main(int argc, char **argv)
     size_t off = 0;
     struct timespec started;
     struct timespec finished;
-AfterMagic:
-    errno = 0;
-    if (clock_gettime(CLOCK_MONOTONIC_PRECISE, &started) != 0) {
-        fprintf(stderr, "clock_gettime(started): %s\n", strerror(errno));
-        exit(EXIT_FAILURE);
-    }
-    err = KEKSItemsParse(&items, &off, buf, len);
-    errno = 0;
-    if (clock_gettime(CLOCK_MONOTONIC_PRECISE, &finished) != 0) {
-        fprintf(stderr, "clock_gettime(finished): %s\n", strerror(errno));
-        exit(EXIT_FAILURE);
-    }
-    if (err != KEKSErrNo) {
-        fprintf(stderr, "err: %s\n", KEKSErr2Str(err));
-        return EXIT_FAILURE;
-    }
-    if ((items.len == 1) && (items.list[0].atom.typ == KEKSItemMagic)) {
-        goto AfterMagic;
-    }
-    if (!onlyTotals) {
-        setenv("TZ", "UTC", 1);
-        err = printer(&items, 0, 0, false, 0, NULL);
+    while (off < len) {
+        errno = 0;
+        if (clock_gettime(CLOCK_MONOTONIC_PRECISE, &started) != 0) {
+            fprintf(stderr, "clock_gettime(started): %s\n", strerror(errno));
+            exit(EXIT_FAILURE);
+        }
+        err = KEKSItemsParse(&items, &off, buf, len);
+        errno = 0;
+        if (clock_gettime(CLOCK_MONOTONIC_PRECISE, &finished) != 0) {
+            fprintf(stderr, "clock_gettime(finished): %s\n", strerror(errno));
+            exit(EXIT_FAILURE);
+        }
         if (err != KEKSErrNo) {
             fprintf(stderr, "err: %s\n", KEKSErr2Str(err));
             return EXIT_FAILURE;
         }
-        if ((items.len > 1) && (items.list[0].atom.typ == KEKSItemMagic)) {
-            err = printer(&items, 1, 0, false, 0, NULL);
+        if (!onlyTotals) {
+            setenv("TZ", "UTC", 1);
+            err = printer(&items, 0, 0, false, 0, NULL);
             if (err != KEKSErrNo) {
                 fprintf(stderr, "err: %s\n", KEKSErr2Str(err));
                 return EXIT_FAILURE;
             }
         }
-    }
-    if (!noTotals) {
-        printf(
-            "items: %zu  size: %zu  time: %zuns\n",
-            items.len,
-            items.len * (sizeof(struct KEKSItem) + (NoOffsets ? 0 : sizeof(size_t))),
-            1000000000 * (finished.tv_sec - started.tv_sec) + finished.tv_nsec -
-                started.tv_nsec);
+        if (!noTotals) {
+            printf(
+                "items: %zu  size: %zu  time: %zuns\n",
+                items.len,
+                items.len *
+                    (sizeof(struct KEKSItem) + (NoOffsets ? 0 : sizeof(size_t))),
+                1000000000 * (finished.tv_sec - started.tv_sec) + finished.tv_nsec -
+                    started.tv_nsec);
+        }
     }
     if (off < len) {
         char *hex = HexEnc(buf + off, len - off);
index 5ffa4e9e6e2563d7bdec2d20ecaef480f39c538a8a8703811a626e8a3f3c9449..fcee45e77eaaaef5424f9a0bbe5adbf5f25a5117ad8051f126c622b607c92d7d 100644 (file)
@@ -20,6 +20,7 @@ import (
        "encoding/hex"
        "flag"
        "fmt"
+       "io"
        "log"
        "os"
        "strconv"
@@ -172,19 +173,19 @@ func main() {
        flag.Parse()
        br := bufio.NewReader(os.Stdin)
        var off int64
+       var ctx *keks.Decoder
+       var err error
        for {
-               ctx := keks.NewDecoderFromReader(br, &keks.DecodeOpts{SaveOffsets: true})
+               ctx = keks.NewDecoderFromReader(br, &keks.DecodeOpts{SaveOffsets: true})
                ctx.Read = off
-               t, err := ctx.Parse()
-               if err != nil {
+               if _, err = ctx.Parse(); err != nil {
+                       if err == io.EOF {
+                               break
+                       }
                        log.Fatal(err)
                }
-               iter := ctx.Iter()
-               printer(iter, 1, false, false)
-               if t != types.Magic {
-                       fmt.Println(ctx.Read, "bytes")
-                       break
-               }
-               off += ctx.Read
+               printer(ctx.Iter(), 1, false, false)
+               off = ctx.Read
        }
+       fmt.Println(ctx.Read, "bytes")
 }