From 44816f3d91b2d05fad4fbad24678588d84ce55cad2936286398ead2dcab2b14c Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Thu, 23 Jan 2025 10:19:22 +0300 Subject: [PATCH] Try pp till EOF --- c/cmd/pp/pp.c | 56 ++++++++++++++++++++--------------------------- go/cmd/pp/main.go | 21 +++++++++--------- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/c/cmd/pp/pp.c b/c/cmd/pp/pp.c index 717893b..a596446 100644 --- a/c/cmd/pp/pp.c +++ b/c/cmd/pp/pp.c @@ -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); diff --git a/go/cmd/pp/main.go b/go/cmd/pp/main.go index 5ffa4e9..fcee45e 100644 --- a/go/cmd/pp/main.go +++ b/go/cmd/pp/main.go @@ -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") } -- 2.48.1