[PATCH] tracedump: Add tri-state --color option (auto, always, or never)

Carl Worth cworth at cworth.org
Thu Oct 20 15:22:09 PDT 2011


This follows a pattern similar to that provided by other tools, (such
as grep). The default auto mode colorizes if stdout is a tty (except
on Windows where it always colorizes). The always and never modes
explicit enable or disable colorizing.

The old --no-color and --no-colour options are deprecated, (no longer
documented but still supported to avoid any regressions of scripts).
---

I assume that isatty isn't something we should call on Windows, but
that's honestly just guessing on my part. Let me know if I got that
wrong.

The support for the old option syntax is perhaps gratuitous, but was
easy enough to maintain. Let me know if you would prefer to drop that
instead.

-Carl

 common/formatter.hpp   |   12 ++++++++++--
 common/trace_model.cpp |    6 +++---
 common/trace_model.hpp |    9 +++++++--
 tracedump.cpp          |   24 ++++++++++++++----------
 4 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/common/formatter.hpp b/common/formatter.hpp
index 181e2d1..34b1cba 100644
--- a/common/formatter.hpp
+++ b/common/formatter.hpp
@@ -33,6 +33,7 @@
 
 #include <iostream>
 
+#include "trace_model.hpp"
 
 namespace Formatter {
 
@@ -155,8 +156,15 @@ public:
 #endif
 
 
-inline Formatter *defaultFormatter(bool color = true) {
-    if (color) {
+inline Formatter *defaultFormatter(Trace::ColorOption color = Trace::COLOR_OPTION_AUTO) {
+    bool auto_means_yes = true;
+
+#ifndef _WIN32
+    auto_means_yes = isatty(1);
+#endif
+
+    if (color == Trace::COLOR_OPTION_ALWAYS ||
+	(color == Trace::COLOR_OPTION_AUTO && auto_means_yes)) {
 #ifdef _WIN32
         return new WindowsFormatter;
 #else
diff --git a/common/trace_model.cpp b/common/trace_model.cpp
index 306b9e7..c31eb60 100644
--- a/common/trace_model.cpp
+++ b/common/trace_model.cpp
@@ -194,7 +194,7 @@ protected:
     Formatter::Attribute *literal;
 
 public:
-    Dumper(std::ostream &_os, bool color) : os(_os) {
+    Dumper(std::ostream &_os, Trace::ColorOption color) : os(_os) {
         formatter = Formatter::defaultFormatter(color);
         normal = formatter->normal();
         bold = formatter->bold();
@@ -351,7 +351,7 @@ public:
 };
 
 
-void Value::dump(std::ostream &os, bool color) {
+void Value::dump(std::ostream &os, ColorOption color) {
     Dumper d(os, color);
     visit(d);
 }
@@ -369,7 +369,7 @@ const Value & Value::operator[](size_t index) const {
     return null;
 }
 
-void Call::dump(std::ostream &os, bool color) {
+void Call::dump(std::ostream &os, ColorOption color) {
     Dumper d(os, color);
     os << no << " ";
     d.visit(this);
diff --git a/common/trace_model.hpp b/common/trace_model.hpp
index a74508e..0d939fb 100644
--- a/common/trace_model.hpp
+++ b/common/trace_model.hpp
@@ -43,6 +43,11 @@ namespace Trace {
 
 typedef unsigned Id;
 
+enum ColorOption {
+    COLOR_OPTION_AUTO,
+    COLOR_OPTION_ALWAYS,
+    COLOR_OPTION_NEVER
+};
 
 struct FunctionSig {
     Id id;
@@ -102,7 +107,7 @@ public:
 
     const Value & operator[](size_t index) const;
 
-    void dump(std::ostream &os, bool color=true);
+    void dump(std::ostream &os, ColorOption color=COLOR_OPTION_AUTO);
 };
 
 
@@ -342,7 +347,7 @@ public:
         return *(args[index]);
     }
 
-    void dump(std::ostream &os, bool color=true);
+    void dump(std::ostream &os, ColorOption color=COLOR_OPTION_AUTO);
 };
 
 
diff --git a/tracedump.cpp b/tracedump.cpp
index c210a0c..876e5ee 100644
--- a/tracedump.cpp
+++ b/tracedump.cpp
@@ -33,24 +33,20 @@
 
 #include "trace_parser.hpp"
 
-
-static bool color = true;
-
-
 static void usage(void) {
     std::cout <<
         "Usage: tracedump [OPTION] [TRACE...]\n"
         "Dump TRACE to standard output.\n"
         "\n"
-        "  --no-color   no colored syntax highlightint\n"
-        "  --no-colour  alias for --no-color\n"
+        "  --color=<WHEN>   Colored syntax highlighting\n"
+        "  --colour=<WHEN>  WHEN is 'auto', 'always', or 'never'\n"
     ;
 }
 
-
 int main(int argc, char **argv)
 {
     int i;
+    Trace::ColorOption color = Trace::COLOR_OPTION_AUTO;
 
     for (i = 1; i < argc; ++i) {
         const char *arg = argv[i];
@@ -61,9 +57,17 @@ int main(int argc, char **argv)
 
         if (!strcmp(arg, "--")) {
             break;
-        } else if (!strcmp(arg, "--no-color") ||
-                   !strcmp(arg, "--no-colour")) {
-            color = false;
+        } else if (!strcmp(arg, "--color=auto") ||
+                   !strcmp(arg, "--colour=auto")) {
+            color = Trace::COLOR_OPTION_AUTO;
+        } else if (!strcmp(arg, "--color=always") ||
+                   !strcmp(arg, "--colour=always")) {
+            color = Trace::COLOR_OPTION_ALWAYS;
+	} else if (!strcmp(arg, "--color=never") ||
+                   !strcmp(arg, "--colour=never") ||
+		   !strcmp(arg, "--no-color") ||
+		   !strcmp(arg, "--no-colour")) {
+	    color = Trace::COLOR_OPTION_NEVER;
         } else {
             std::cerr << "error: unknown option " << arg << "\n";
             usage();
-- 
1.7.7



More information about the apitrace mailing list