From 616d8f65f269152adf6b329fc73132f1edc1863c919f2487946ca779c32f1314 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Mon, 14 Oct 2024 11:33:16 +0300 Subject: [PATCH] Colourise printer --- cyac/cmd/print-items.c | 63 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/cyac/cmd/print-items.c b/cyac/cmd/print-items.c index 7811e29..38b4150 100644 --- a/cyac/cmd/print-items.c +++ b/cyac/cmd/print-items.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,15 @@ #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) { @@ -41,8 +51,9 @@ 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( @@ -52,18 +63,29 @@ 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; @@ -104,7 +126,11 @@ printer( 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; @@ -116,7 +142,7 @@ printer( 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--; @@ -125,7 +151,11 @@ printer( 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) { @@ -140,7 +170,7 @@ printer( } idx = items->list[idx].next; } - for (int i = 0; i < OffDigits + 1; i++) { + for (int i = 0; i < OffDigits + 3; i++) { fputs(" ", stdout); } indent--; @@ -149,7 +179,12 @@ printer( 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; @@ -161,7 +196,7 @@ printer( 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--; @@ -219,8 +254,10 @@ printer( 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); @@ -267,8 +304,10 @@ main(int argc, char **argv) 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); -- 2.50.0