trace_to_text: Add support for producing ctrace files

Change-Id: I262074abc8eea976ab73bacd3eb5c9aa8d1f52dc
diff --git a/tools/trace_to_text/main.cc b/tools/trace_to_text/main.cc
index 9377bb6..52ff38e 100644
--- a/tools/trace_to_text/main.cc
+++ b/tools/trace_to_text/main.cc
@@ -20,7 +20,6 @@
 #include <vector>
 
 #include "perfetto/base/logging.h"
-#include "perfetto/ext/base/string_utils.h"
 #include "tools/trace_to_text/symbolize_profile.h"
 #include "tools/trace_to_text/trace_to_profile.h"
 #include "tools/trace_to_text/trace_to_systrace.h"
@@ -32,33 +31,22 @@
 #define PERFETTO_GET_GIT_REVISION() "unknown"
 #endif
 
+namespace perfetto {
+namespace trace_to_text {
 namespace {
 
 int Usage(const char* argv0) {
   printf(
-      "Usage: %s systrace|json|text|profile [--pid PID] "
-      "[--timestamps TIMESTAMP1,TIMESTAMP2,...] "
-      "[--truncate start|end] [trace.pb] "
+      "Usage: %s systrace|json|ctrace|text|profile [--truncate start|end] "
+      "[trace.pb] "
       "[trace.txt]\n",
       argv0);
   return 1;
 }
 
-uint64_t StringToUint64OrDie(const char* str) {
-  char* end;
-  uint64_t number = static_cast<uint64_t>(strtoll(str, &end, 10));
-  if (*end != '\0')
-    PERFETTO_FATAL("Invalid %s. Expected decimal integer.", str);
-  return number;
-}
-}  // namespace
-
-int main(int argc, char** argv) {
+int Main(int argc, char** argv) {
   std::vector<const char*> positional_args;
-  perfetto::trace_to_text::Keep truncate_keep =
-      perfetto::trace_to_text::Keep::kAll;
-  uint64_t pid = 0;
-  std::vector<uint64_t> timestamps;
+  Keep truncate_keep = Keep::kAll;
   for (int i = 1; i < argc; i++) {
     if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0) {
       printf("%s\n", PERFETTO_GET_GIT_REVISION());
@@ -67,25 +55,15 @@
                strcmp(argv[i], "--truncate") == 0) {
       i++;
       if (i <= argc && strcmp(argv[i], "start") == 0) {
-        truncate_keep = perfetto::trace_to_text::Keep::kStart;
+        truncate_keep = Keep::kStart;
       } else if (i <= argc && strcmp(argv[i], "end") == 0) {
-        truncate_keep = perfetto::trace_to_text::Keep::kEnd;
+        truncate_keep = Keep::kEnd;
       } else {
         PERFETTO_ELOG(
             "--truncate must specify whether to keep the end or the "
             "start of the trace.");
         return Usage(argv[0]);
       }
-    } else if (i <= argc && strcmp(argv[i], "--pid") == 0) {
-      i++;
-      pid = StringToUint64OrDie(argv[i]);
-    } else if (i <= argc && strcmp(argv[i], "--timestamps") == 0) {
-      i++;
-      std::vector<std::string> ts_strings =
-          perfetto::base::SplitString(argv[i], ",");
-      for (const auto& ts : ts_strings) {
-        timestamps.emplace_back(StringToUint64OrDie(ts.c_str()));
-      }
     } else {
       positional_args.push_back(argv[i]);
     }
@@ -127,30 +105,39 @@
   std::string format(positional_args[0]);
 
   if (format == "json")
-    return perfetto::trace_to_text::TraceToSystrace(input_stream, output_stream,
-                                                    truncate_keep,
-                                                    /*wrap_in_json=*/true);
+    return TraceToSystrace(input_stream, output_stream, kSystraceJson,
+                           truncate_keep);
+
   if (format == "systrace")
-    return perfetto::trace_to_text::TraceToSystrace(input_stream, output_stream,
-                                                    truncate_keep,
-                                                    /*wrap_in_json=*/false);
-  if (truncate_keep != perfetto::trace_to_text::Keep::kAll) {
+    return TraceToSystrace(input_stream, output_stream, kSystraceNormal,
+                           truncate_keep);
+
+  if (format == "ctrace")
+    return TraceToSystrace(input_stream, output_stream, kSystraceCompressed,
+                           truncate_keep);
+
+  if (truncate_keep != Keep::kAll) {
     PERFETTO_ELOG(
         "--truncate is unsupported for text|profile|symbolize format.");
     return 1;
   }
 
   if (format == "text")
-    return perfetto::trace_to_text::TraceToText(input_stream, output_stream);
+    return TraceToText(input_stream, output_stream);
 
-  if (format == "profile") {
-    return perfetto::trace_to_text::TraceToProfile(input_stream, output_stream,
-                                                   pid, timestamps);
-  }
+  if (format == "profile")
+    return TraceToProfile(input_stream, output_stream);
 
   if (format == "symbolize")
-    return perfetto::trace_to_text::SymbolizeProfile(input_stream,
-                                                     output_stream);
+    return SymbolizeProfile(input_stream, output_stream);
 
   return Usage(argv[0]);
 }
+
+}  // namespace
+}  // namespace trace_to_text
+}  // namespace perfetto
+
+int main(int argc, char** argv) {
+  return perfetto::trace_to_text::Main(argc, argv);
+}