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);
"encoding/hex"
"flag"
"fmt"
+ "io"
"log"
"os"
"strconv"
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")
}