]> Cypherpunks repositories - keks.git/commitdiff
Colourise printer
authorSergey Matveev <stargrave@stargrave.org>
Mon, 14 Oct 2024 08:33:16 +0000 (11:33 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Mon, 14 Oct 2024 17:27:47 +0000 (20:27 +0300)
cyac/cmd/print-items.c

index 7811e298fde80733b33b0b469dedd971a51df91e5022c31cdc8b09f286407c13..38b415027f2b02eaea116272a68a29df7523eadecc0a23cec13386cffee2ac99 100644 (file)
@@ -17,6 +17,7 @@
 #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)
 {
@@ -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);