/*
- * Top-level application for accessing almost of apitrace
+ * Top-level application for accessing almost all of apitrace
* functionality.
*/
}
static int
-help_command(int argc, char *argv[], int first_command_arg);
+do_help_command(int argc, char *argv[]);
-const Command help = {
+const Command help_command = {
"help",
help_synopsis,
help_usage,
- help_command
+ do_help_command
};
static const Command * commands[] = {
- &dump,
- &help,
+ &diff_command,
+ &diff_state_command,
+ &diff_images_command,
+ &dump_command,
+ &dump_images_command,
+ &pickle_command,
+ &sed_command,
+ &repack_command,
+ &retrace_command,
+ &trace_command,
+ &trim_command,
+ &help_command
+};
+
+/* Aliases provide a mechanism to allow compatibility with old command
+ * names (such as "retrace") for current commands (such as the replay
+ * command). */
+typedef struct {
+ const char *name;
+ const Command *command;
+} Alias;
+
+static const Alias aliases[] = {
+ { "retrace", &retrace_command }
};
static void
static int
-help_command(int argc, char *argv[], int first_arg_command)
+do_help_command(int argc, char *argv[])
{
const Command *command;
int i;
- if (first_arg_command == argc) {
+ if (argc != 2) {
help_usage();
return 0;
}
- char *command_name = argv[first_arg_command];
+ char *command_name = argv[1];
for (i = 0; i < ARRAY_SIZE(commands); i++) {
command = commands[i];
int
main(int argc, char **argv)
{
- const char *command_name = "trace";
+ const char *command_name;
const Command *command;
- int i, first_command_arg;
-
- if (argc == 1) {
- usage();
- return 1;
- }
+ const Alias *alias;
+ int i;
for (i = 1; i < argc; ++i) {
const char *arg = argv[i];
}
if (strcmp(arg, "--help") == 0) {
- return help_command (0, NULL, 0);
+ return do_help_command(0, NULL);
} else {
std::cerr << "Error: unknown option " << arg << "\n";
usage();
return 1;
}
}
- first_command_arg = i;
- if (first_command_arg < argc) {
- command_name = argv[first_command_arg];
- first_command_arg++;
+ if (i == argc) {
+ usage();
+ return 1;
}
+ command_name = argv[i];
+
+ argc -= i;
+ argv = &argv[i];
+
for (i = 0; i < ARRAY_SIZE(commands); i++) {
command = commands[i];
if (strcmp(command_name, command->name) == 0)
- return (command->function) (argc, argv, first_command_arg);
+ return (command->function) (argc, argv);
+ }
+
+ for (i = 0; i < ARRAY_SIZE(aliases); i++) {
+ alias = &aliases[i];
+
+ if (strcmp(command_name, alias->name) == 0)
+ return (alias->command->function) (argc, argv);
}
std::cerr << "Error: unknown command " << command_name
<< " (see \"apitrace help\").\n";
- return 1;
+ return 1;
}