]> Cypherpunks repositories - keks.git/commitdiff
Ability to skip storing of offsets
authorSergey Matveev <stargrave@stargrave.org>
Thu, 17 Oct 2024 08:54:37 +0000 (11:54 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Thu, 17 Oct 2024 08:54:37 +0000 (11:54 +0300)
cyac/cmd/print-items/print-items.c
cyac/lib/items.c
cyac/lib/items.h

index a24c043398c3c682e618858090b7b70abbaf222656b178a9e82275cf001e6f40..35190918be6a28cf25c09777dc7a0201cfaf717e2e9f8f928f6a4085642905df 100644 (file)
@@ -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);
index a13b56517a6c21e03366adb94a323f20e703845d3d4a24368e44dbd292dadbdb..af0eacf3b28dfe90461a52100954d8915dbcf38d30856d2bd1f4838eb034ef01 100644 (file)
@@ -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));
index 47770a1e812cf184f70a32bdc4646f06fe9e2e1de7b4cdda1abd46f60a7001aa..961d3a942c8c719cae9f0b587b0352b143edb904a30f94bdce49b08d70aad8ab 100644 (file)
@@ -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;
 };