From 0c841f275da71f6c05abc0ee351f8c8337b6c1935a35fa44235330af3a241e10 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Thu, 17 Oct 2024 11:54:37 +0300 Subject: [PATCH] Ability to skip storing of offsets --- cyac/cmd/print-items/print-items.c | 46 ++++++++++++++++++++++++------ cyac/lib/items.c | 23 +++++++++++++-- cyac/lib/items.h | 2 +- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/cyac/cmd/print-items/print-items.c b/cyac/cmd/print-items/print-items.c index a24c043..3519091 100644 --- a/cyac/cmd/print-items/print-items.c +++ b/cyac/cmd/print-items/print-items.c @@ -49,6 +49,7 @@ printIndent(const size_t indent) } static bool NoColour = false; +static bool NoOffsets = false; static int OffDigits = 0; static char OffFmt[16] = {0}; @@ -61,9 +62,23 @@ printer( size_t listIdx, const char *mapKey) { - printf("%s%zd%s ", NoColour ? "" : ColourBlue, indent, NoColour ? "" : ColourReset); + fprintf( + stdout, + "%s%zd%s ", + NoColour ? "" : ColourBlue, + indent, + NoColour ? "" : ColourReset); struct YACItem *item = &(items->list[idx]); - printf(OffFmt, NoColour ? "" : ColourRed, item->off, NoColour ? "" : ColourReset); + if (NoOffsets) { + fputs(" ", stdout); + } else { + fprintf( + stdout, + OffFmt, + NoColour ? "" : ColourRed, + items->offsets[idx], + NoColour ? "" : ColourReset); + } if (item->atom.typ == YACItemEOC) { indent--; assert(indent >= 0); @@ -108,7 +123,8 @@ printer( fprintf(stdout, "%zd\n", item->atom.v.nint); break; case YACItemList: { - printf( + fprintf( + stdout, "[ %s%zd%s\n", NoColour ? "" : ColourCyan, item->atom.v.list.len, @@ -133,7 +149,8 @@ printer( break; } case YACItemMap: { - printf( + fprintf( + stdout, "{ %s%zd%s\n", NoColour ? "" : ColourCyan, item->atom.v.list.len, @@ -161,7 +178,8 @@ printer( break; } case YACItemBlob: - printf( + fprintf( + stdout, "BLOB[ %s%zu l=%zu%s\n", NoColour ? "" : ColourCyan, item->atom.v.blob.chunks, @@ -242,13 +260,22 @@ main(int argc, char **argv) exit(EXIT_FAILURE); } NoColour = getenv("NO_COLOR") != NULL; + NoOffsets = getenv("NO_OFFSETS") != NULL; OffDigits = (int)(1 + floor(log10((double)len))); snprintf(OffFmt, sizeof OffFmt, "%%s%%0%dzd%%s ", OffDigits); struct YACItems items; - YACItemsInit(&items); + enum YACErr err = YACItemsInit(&items); + if (err != YACErrNo) { + fprintf(stderr, "err: %s\n", YACErr2Str(err)); + return EXIT_FAILURE; + } + if (NoOffsets) { + free(items.offsets); + items.offsets = NULL; + } size_t off = 0; - enum YACErr err = YACItemsParse(&items, &off, buf, len); + err = YACItemsParse(&items, &off, buf, len); if (err != YACErrNo) { fprintf(stderr, "err: %s\n", YACErr2Str(err)); return EXIT_FAILURE; @@ -258,7 +285,10 @@ main(int argc, char **argv) fprintf(stderr, "err: %s\n", YACErr2Str(err)); return EXIT_FAILURE; } - printf("items: %zu size: %zu\n", items.len, items.len * sizeof(struct YACItem)); + printf( + "items: %zu size: %zu\n", + items.len, + items.len * (sizeof(struct YACItem) + (NoOffsets ? 0 : sizeof(size_t)))); if (getenv("DO_ENCODE") != NULL) { unsigned char *dst = malloc(len); assert(dst != NULL); diff --git a/cyac/lib/items.c b/cyac/lib/items.c index a13b565..af0eacf 100644 --- a/cyac/lib/items.c +++ b/cyac/lib/items.c @@ -36,6 +36,10 @@ YACItemsInit(struct YACItems *items) if (items->list == NULL) { return YACErrNoMem; } + items->offsets = calloc((size_t)(items->cap), sizeof(size_t)); + if (items->offsets == NULL) { + return YACErrNoMem; + } return YACErrNo; } @@ -55,13 +59,24 @@ yacItemsGrow(struct YACItems *items) return YACErrNoMem; } } - const size_t size = (size_t)(items->cap) * sizeof(struct YACItem); + + size_t size = (size_t)(items->cap) * sizeof(struct YACItem); items->list = realloc(items->list, size); if (items->list == NULL) { return YACErrNoMem; } - const size_t begin = items->len * sizeof(struct YACItem); + size_t begin = items->len * sizeof(struct YACItem); memset((unsigned char *)(items->list) + begin, 0, size - begin); + + if (items->offsets != NULL) { + size = (size_t)(items->cap) * sizeof(size_t); + items->offsets = realloc(items->offsets, size); + if (items->offsets == NULL) { + return YACErrNoMem; + } + begin = items->len * sizeof(size_t); + memset((unsigned char *)(items->offsets) + begin, 0, size - begin); + } return YACErrNo; } @@ -81,7 +96,9 @@ yacItemsAdd( } struct YACItem *item = &(items->list[items->len]); item->next = 0; - item->off = *off; + if (items->offsets != NULL) { + items->offsets[items->len] = *off; + } size_t got = 0; assert(len >= (*off)); err = YACAtomDecode(&got, &(item->atom), buf + *off, len - (*off)); diff --git a/cyac/lib/items.h b/cyac/lib/items.h index 47770a1..961d3a9 100644 --- a/cyac/lib/items.h +++ b/cyac/lib/items.h @@ -24,7 +24,6 @@ // item, until its length is less than chunk len. // @end deftypevar struct YACItem { - size_t off; size_t next; struct YACAtom atom; }; @@ -38,6 +37,7 @@ struct YACItem { // @end deftypevar struct YACItems { struct YACItem *list; + size_t *offsets; size_t len; ptrdiff_t cap; }; -- 2.48.1