]> git.cworth.org Git - apitrace/blobdiff - tracedump.cpp
tracedump: Add tri-state --color option (auto, always, or never)
[apitrace] / tracedump.cpp
index 22f62e3692c5ce45857b86df235615dd99db9f49..3b3ed0aa4482a283f3dec218877d9245daef9a90 100644 (file)
  */
 
 
+#include <string.h>
+
 #include "trace_parser.hpp"
 
 
+enum ColorOption {
+    COLOR_OPTION_NEVER = 0,
+    COLOR_OPTION_ALWAYS = 1,
+    COLOR_OPTION_AUTO = -1
+};
+
+static ColorOption color = COLOR_OPTION_AUTO;
+
+
+static void usage(void) {
+    std::cout <<
+        "Usage: tracedump [OPTION] [TRACE]...\n"
+        "Dump TRACE to standard output.\n"
+        "\n"
+        "  --help               display this help and exit\n"
+        "  --color[=WHEN]\n"
+        "  --colour[=WHEN]      colored syntax highlighting;\n"
+        "                       WHEN is 'always', 'never', or 'auto'\n"
+    ;
+}
+
+
 int main(int argc, char **argv)
 {
-    for (int i = 1; i < argc; ++i) {
+    int i;
+
+    for (i = 1; i < argc; ++i) {
+        const char *arg = argv[i];
+
+        if (arg[0] != '-') {
+            break;
+        }
+
+        if (!strcmp(arg, "--")) {
+            break;
+        } else if (!strcmp(arg, "--help")) {
+            usage();
+            return 0;
+        } else if (!strcmp(arg, "--color=auto") ||
+                   !strcmp(arg, "--colour=auto")) {
+            color = COLOR_OPTION_AUTO;
+        } else if (!strcmp(arg, "--color") ||
+                   !strcmp(arg, "--colour") ||
+                   !strcmp(arg, "--color=always") ||
+                   !strcmp(arg, "--colour=always")) {
+            color = COLOR_OPTION_ALWAYS;
+        } else if (!strcmp(arg, "--color=never") ||
+                   !strcmp(arg, "--colour=never") ||
+                   !strcmp(arg, "--no-color") ||
+                   !strcmp(arg, "--no-colour")) {
+            color = COLOR_OPTION_NEVER;
+        } else {
+            std::cerr << "error: unknown option " << arg << "\n";
+            usage();
+            return 1;
+        }
+    }
+
+    if (color == COLOR_OPTION_AUTO) {
+#ifdef _WIN32
+        color = COLOR_OPTION_ALWAYS;
+#else
+        color = isatty(1) ? COLOR_OPTION_ALWAYS : COLOR_OPTION_NEVER;
+#endif
+    }
+
+    for (; i < argc; ++i) {
         Trace::Parser p;
-        if (p.open(argv[i])) {
-            Trace::Call *call;
-            call = p.parse_call();
-            while (call) {
-                std::cout << *call;
-                delete call;
-                call = p.parse_call();
-            }
+
+        if (!p.open(argv[i])) {
+            std::cerr << "error: failed to open " << argv[i] << "\n";
+            return 1;
+        }
+
+        Trace::Call *call;
+        while ((call = p.parse_call())) {
+            call->dump(std::cout, color);
+            delete call;
         }
     }
+
     return 0;
 }