Add a fuzz/c --color flag
diff --git a/fuzz/c/fuzzlib/fuzzlib.c b/fuzz/c/fuzzlib/fuzzlib.c
index f2c88f7..ee6af96 100644
--- a/fuzz/c/fuzzlib/fuzzlib.c
+++ b/fuzz/c/fuzzlib/fuzzlib.c
@@ -114,6 +114,8 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
+static bool flag_color;
+
 static int num_files_processed;
 
 static struct {
@@ -121,6 +123,15 @@
   size_t len;
 } relative_cwd;
 
+void  //
+errorf(const char* msg) {
+  if (flag_color) {
+    printf("\e[31m%s\e[0m\n", msg);
+  } else {
+    printf("%s\n", msg);
+  }
+}
+
 static int  //
 visit(char* filename);
 
@@ -128,14 +139,14 @@
 visit_dir(int fd) {
   int cwd_fd = open(".", O_RDONLY, 0);
   if (fchdir(fd)) {
-    printf("failed\n");
+    errorf("failed");
     fprintf(stderr, "FAIL: fchdir: %s\n", strerror(errno));
     return 1;
   }
 
   DIR* d = fdopendir(fd);
   if (!d) {
-    printf("failed\n");
+    errorf("failed");
     fprintf(stderr, "FAIL: fdopendir: %s\n", strerror(errno));
     return 1;
   }
@@ -173,7 +184,7 @@
 static int  //
 visit_reg(int fd, off_t size) {
   if ((size < 0) || (0x7FFFFFFF < size)) {
-    printf("failed\n");
+    errorf("failed");
     fprintf(stderr, "FAIL: file size out of bounds");
     return 1;
   }
@@ -182,17 +193,20 @@
   if (size > 0) {
     data = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
     if (data == MAP_FAILED) {
-      printf("failed\n");
+      errorf("failed");
       fprintf(stderr, "FAIL: mmap: %s\n", strerror(errno));
       return 1;
     }
   }
 
   const char* msg = llvmFuzzerTestOneInput((const uint8_t*)(data), size);
-  if (!msg) {
-    msg = "+ok";
+  if (msg) {
+    errorf(msg);
+  } else if (flag_color) {
+    printf("\e[32mok\e[0m\n");
+  } else {
+    printf("ok\n");
   }
-  printf("%s\n", msg);
 
   if ((size > 0) && munmap(data, size)) {
     fprintf(stderr, "FAIL: mmap: %s\n", strerror(errno));
@@ -219,12 +233,12 @@
   struct stat z;
   int fd = open(filename, O_RDONLY, 0);
   if (fd == -1) {
-    printf("failed\n");
+    errorf("failed");
     fprintf(stderr, "FAIL: open: %s\n", strerror(errno));
     return 1;
   }
   if (fstat(fd, &z)) {
-    printf("failed\n");
+    errorf("failed");
     fprintf(stderr, "FAIL: fstat: %s\n", strerror(errno));
     return 1;
   }
@@ -244,7 +258,7 @@
     new_len++;
   }
   if ((filename_len >= PATH_MAX) || (new_len >= PATH_MAX)) {
-    printf("failed\n");
+    errorf("failed");
     fprintf(stderr, "FAIL: path is too long\n");
     return 1;
   }
@@ -265,16 +279,33 @@
 
 int  //
 main(int argc, char** argv) {
+  flag_color = false;
   num_files_processed = 0;
   relative_cwd.len = 0;
 
   int i;
   for (i = 1; i < argc; i++) {
+    if (argv[i][0] != '-') {
+      continue;
+    }
+    if ((strcmp(argv[i], "-c") == 0) ||  //
+        (strcmp(argv[i], "--color") == 0)) {
+      flag_color = true;
+      continue;
+    }
+    fprintf(stderr, "FAIL: unrecognized flag argument\n");
+    return 1;
+  }
+  for (i = 1; i < argc; i++) {
+    if (argv[i][0] == '-') {
+      continue;
+    }
     int v = visit(argv[i]);
     if (v) {
       return v;
     }
   }
+
   printf("PASS: %d files processed\n", num_files_processed);
   return 0;
 }