}
static bool NoColour = false;
+static bool NoOffsets = false;
static int OffDigits = 0;
static char OffFmt[16] = {0};
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);
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,
break;
}
case YACItemMap: {
- printf(
+ fprintf(
+ stdout,
"{ %s%zd%s\n",
NoColour ? "" : ColourCyan,
item->atom.v.list.len,
break;
}
case YACItemBlob:
- printf(
+ fprintf(
+ stdout,
"BLOB[ %s%zu l=%zu%s\n",
NoColour ? "" : ColourCyan,
item->atom.v.blob.chunks,
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;
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);
if (items->list == NULL) {
return YACErrNoMem;
}
+ items->offsets = calloc((size_t)(items->cap), sizeof(size_t));
+ if (items->offsets == NULL) {
+ return YACErrNoMem;
+ }
return YACErrNo;
}
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;
}
}
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));