+#include <babeltrace/ctf-ir/metadata.h> /* for clocks */
+
+#define DEFAULT_FILE_ARRAY_SIZE 1
+static char *opt_input_format;
+static char *opt_output_format;
+
+static const char *opt_input_path;
+static const char *opt_output_path;
+
+static struct format *fmt_read;
+
+void strlower(char *str)
+{
+ while (*str) {
+ *str = tolower(*str);
+ str++;
+ }
+}
+
+enum {
+ OPT_NONE = 0,
+ OPT_HELP,
+ OPT_LIST,
+ OPT_VERBOSE,
+ OPT_DEBUG,
+ OPT_NAMES,
+ OPT_FIELDS,
+ OPT_NO_DELTA,
+ OPT_CLOCK_OFFSET,
+ OPT_CLOCK_RAW,
+ OPT_CLOCK_SECONDS,
+ OPT_CLOCK_DATE,
+ OPT_CLOCK_GMT,
+ OPT_CLOCK_FORCE_CORRELATE,
+};
+
+static struct poptOption long_options[] = {
+ /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
+ { "input-format", 'i', POPT_ARG_STRING, &opt_input_format, OPT_NONE, NULL, NULL },
+ { "output-format", 'o', POPT_ARG_STRING, &opt_output_format, OPT_NONE, NULL, NULL },
+ { "help", 'h', POPT_ARG_NONE, NULL, OPT_HELP, NULL, NULL },
+ { "list", 'l', POPT_ARG_NONE, NULL, OPT_LIST, NULL, NULL },
+ { "verbose", 'v', POPT_ARG_NONE, NULL, OPT_VERBOSE, NULL, NULL },
+ { "debug", 'd', POPT_ARG_NONE, NULL, OPT_DEBUG, NULL, NULL },
+ { "names", 'n', POPT_ARG_STRING, NULL, OPT_NAMES, NULL, NULL },
+ { "fields", 'f', POPT_ARG_STRING, NULL, OPT_FIELDS, NULL, NULL },
+ { "no-delta", 0, POPT_ARG_NONE, NULL, OPT_NO_DELTA, NULL, NULL },
+ { "clock-offset", 0, POPT_ARG_STRING, NULL, OPT_CLOCK_OFFSET, NULL, NULL },
+ { "clock-raw", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_RAW, NULL, NULL },
+ { "clock-seconds", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_SECONDS, NULL, NULL },
+ { "clock-date", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_DATE, NULL, NULL },
+ { "clock-gmt", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_GMT, NULL, NULL },
+ { "clock-force-correlate", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_FORCE_CORRELATE, NULL, NULL },
+ { NULL, 0, 0, NULL, 0, NULL, NULL },
+};
+
+static void list_formats(FILE *fp)
+{
+ fprintf(fp, "\n");
+ bt_fprintf_format_list(fp);
+}
+
+static void usage(FILE *fp)
+{
+ fprintf(fp, "BabelTrace Trace Viewer and Converter %s\n\n", VERSION);
+ fprintf(fp, "usage : babeltrace [OPTIONS] INPUT <OUTPUT>\n");
+ fprintf(fp, "\n");
+ fprintf(fp, " INPUT Input trace path\n");
+ fprintf(fp, " OUTPUT Output trace path (default: stdout)\n");
+ fprintf(fp, "\n");
+ fprintf(fp, " -i, --input-format FORMAT Input trace format (default: ctf)\n");
+ fprintf(fp, " -o, --output-format FORMAT Output trace format (default: text)\n");
+ fprintf(fp, "\n");
+ fprintf(fp, " -h, --help This help message\n");
+ fprintf(fp, " -l, --list List available formats\n");
+ fprintf(fp, " -v, --verbose Verbose mode\n");
+ fprintf(fp, " (or set BABELTRACE_VERBOSE environment variable)\n");
+ fprintf(fp, " -d, --debug Debug mode\n");
+ fprintf(fp, " (or set BABELTRACE_DEBUG environment variable)\n");
+ fprintf(fp, " --no-delta Do not print time delta between consecutive events\n");
+ fprintf(fp, " -n, --names name1<,name2,...> Print field names:\n");
+ fprintf(fp, " (payload OR args OR arg)\n");
+ fprintf(fp, " all, scope, header, (context OR ctx)\n");
+ fprintf(fp, " (payload active by default)\n");
+ fprintf(fp, " -f, --fields name1<,name2,...> Print additional fields:\n");
+ fprintf(fp, " all, trace, trace:domain, trace:procname,\n");
+ fprintf(fp, " trace:vpid, loglevel.\n");
+ fprintf(fp, " --clock-raw Disregard internal clock offset (use raw value)\n");
+ fprintf(fp, " --clock-offset seconds Clock offset in seconds\n");
+ fprintf(fp, " --clock-seconds Print the timestamps as [sec.ns]\n");
+ fprintf(fp, " (default is: [hh:mm:ss.ns])\n");
+ fprintf(fp, " --clock-date Print clock date\n");
+ fprintf(fp, " --clock-gmt Print clock in GMT time zone (default: local time zone)\n");
+ fprintf(fp, " --clock-force-correlate Assume that clocks are inherently correlated\n");
+ fprintf(fp, " across traces.\n");
+ list_formats(fp);
+ fprintf(fp, "\n");
+}
+
+static int get_names_args(poptContext *pc)
+{
+ char *str, *strlist, *strctx;
+
+ opt_payload_field_names = 0;
+ strlist = (char *) poptGetOptArg(*pc);
+ if (!strlist) {
+ return -EINVAL;
+ }
+ str = strtok_r(strlist, ",", &strctx);
+ do {
+ if (!strcmp(str, "all"))
+ opt_all_field_names = 1;
+ else if (!strcmp(str, "scope"))
+ opt_scope_field_names = 1;
+ else if (!strcmp(str, "context") || !strcmp(str, "ctx"))
+ opt_context_field_names = 1;
+ else if (!strcmp(str, "header"))
+ opt_header_field_names = 1;
+ else if (!strcmp(str, "payload") || !strcmp(str, "args") || !strcmp(str, "arg"))
+ opt_payload_field_names = 1;
+ else {
+ fprintf(stderr, "[error] unknown field name type %s\n", str);
+ return -EINVAL;
+ }
+ } while ((str = strtok_r(NULL, ",", &strctx)));
+ return 0;
+}
+
+static int get_fields_args(poptContext *pc)