#include <errno.h>
#include <fcntl.h>
#include <math.h>
+#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include "hex.c.in"
+static const char *ColourRed = "\x1b[31m";
+static const char *ColourGreen = "\x1b[32m";
+static const char *ColourYellow = "\x1b[33m";
+static const char *ColourBlue = "\x1b[34m";
+static const char *ColourMagenta = "\x1b[35m";
+static const char *ColourCyan = "\x1b[36m";
+static const char *ColourWhite = "\x1b[37m";
+static const char *ColourReset = "\x1b[0m";
+
static void
printIndent(const ptrdiff_t indent)
{
}
}
+static bool NoColour = false;
static int OffDigits = 0;
-static char OffFmt[10] = {0};
+static char OffFmt[16] = {0};
static enum YACErr
printer(
ptrdiff_t listIdx,
const char *mapKey)
{
+ printf("%s%zd%s ", NoColour ? "" : ColourBlue, indent, NoColour ? "" : ColourReset);
struct YACItem *item = &(items->list[idx]);
- printf(OffFmt, item->off);
+ printf(OffFmt, NoColour ? "" : ColourRed, item->off, NoColour ? "" : ColourReset);
if (item->atom.typ == YACItemEOC) {
indent--;
assert(indent >= 0);
}
printIndent(indent);
if (listIdx >= 0) {
- fprintf(stdout, "%zu: ", listIdx);
+ fprintf(
+ stdout,
+ "%s%zu:%s ",
+ NoColour ? "" : ColourYellow,
+ listIdx,
+ NoColour ? "" : ColourReset);
}
if (mapKey != NULL) {
- fprintf(stdout, "%s: ", mapKey);
+ fprintf(
+ stdout,
+ "%s%s:%s ",
+ NoColour ? "" : ColourGreen,
+ mapKey,
+ NoColour ? "" : ColourReset);
}
char *str = NULL;
enum YACErr err = YACErrInvalid;
fprintf(stdout, "%zd\n", item->atom.val.sint);
break;
case YACItemList: {
- printf("[ %zd\n", item->atom.len);
+ printf(
+ "[ %s%zd%s\n",
+ NoColour ? "" : ColourCyan,
+ item->atom.len,
+ NoColour ? "" : ColourReset);
indent++;
idx = item->atom.val.first;
listIdx = 0;
idx = items->list[idx].next;
listIdx++;
}
- for (int i = 0; i < OffDigits + 1; i++) {
+ for (int i = 0; i < OffDigits + 3; i++) {
fputs(" ", stdout);
}
indent--;
break;
}
case YACItemMap: {
- printf("{ %zd\n", item->atom.len);
+ printf(
+ "{ %s%zd%s\n",
+ NoColour ? "" : ColourCyan,
+ item->atom.len,
+ NoColour ? "" : ColourReset);
indent++;
idx = item->atom.val.first;
while (idx != -1) {
}
idx = items->list[idx].next;
}
- for (int i = 0; i < OffDigits + 1; i++) {
+ for (int i = 0; i < OffDigits + 3; i++) {
fputs(" ", stdout);
}
indent--;
break;
}
case YACItemBlob:
- printf("BLOB[ %zu l=%zu\n", item->atom.len, item->atom.val.uint);
+ printf(
+ "BLOB[ %s%zu l=%zu%s\n",
+ NoColour ? "" : ColourCyan,
+ item->atom.len,
+ item->atom.val.uint,
+ NoColour ? "" : ColourReset);
indent++;
idx++;
listIdx = 0;
idx = items->list[idx].next;
listIdx++;
}
- for (int i = 0; i < OffDigits + 1; i++) {
+ for (int i = 0; i < OffDigits + 3; i++) {
fputs(" ", stdout);
}
indent--;
str = HexEnc(item->atom.val.buf, l);
fprintf(
stdout,
- "%zu:%s%s\n",
+ "%s%zu:%s%s%s\n",
+ NoColour ? "" : ColourMagenta,
item->atom.len,
+ NoColour ? "" : ColourReset,
str,
(item->atom.len > maxStrLen) ? "..." : "");
free(str);
buf = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
}
+ NoColour = getenv("NO_COLOR") != NULL;
+
OffDigits = (int)(1 + floor(log10((double)len)));
- snprintf(OffFmt, sizeof OffFmt, "%%0%dzd ", OffDigits);
+ snprintf(OffFmt, sizeof OffFmt, "%%s%%0%dzd%%s ", OffDigits);
struct YACItems items;
YACItemsInit(&items);