X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=cli%2Fcli_main.cpp;h=a776107fd12a13c6ae2a01cff510245b096af115;hb=4c5f6fa4d7474bc2a13a6c00bd3f4ac47ff56920;hp=e96673ac70e251442e6bd1f20e430dccc164269f;hpb=646a00d12f31f75fa444d356a667fd64bd0ec323;p=apitrace diff --git a/cli/cli_main.cpp b/cli/cli_main.cpp index e96673a..a776107 100644 --- a/cli/cli_main.cpp +++ b/cli/cli_main.cpp @@ -27,7 +27,7 @@ /* - * Top-level application for accessing almost of apitrace + * Top-level application for accessing almost all of apitrace * functionality. */ @@ -40,42 +40,41 @@ #define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0])) -typedef void (*command_usage_t) (void); -typedef int (*command_function_t) (int argc, char *argv[], int first_command_arg); - -typedef struct { - const char *name; - const char *synopsis; - command_usage_t usage; - command_function_t function; -} Command; - -#define APITRACE_HELP_SYNOPSIS "Print detailed help for the given command." +static const char *help_synopsis = "Print detailed help for the given command."; static void list_commands(void); static void -apitrace_help_usage() +help_usage() { - std::cout << "usage: apitrace help []\n" - APITRACE_HELP_SYNOPSIS "\n" + std::cout + << "usage: apitrace help []\n" + << help_synopsis << "\n" "\n"; list_commands(); } static int -apitrace_help_command(int argc, char *argv[], int first_command_arg); - -static Command commands[] = { - { "dump", - APITRACE_DUMP_SYNOPSIS, - apitrace_dump_usage, - apitrace_dump_command }, - { "help", - APITRACE_HELP_SYNOPSIS, - apitrace_help_usage, - apitrace_help_command } +do_help_command(int argc, char *argv[]); + +const Command help_command = { + "help", + help_synopsis, + help_usage, + do_help_command +}; + +static const Command * commands[] = { + &diff_command, + &diff_state_command, + &diff_images_command, + &dump_command, + &pickle_command, + &repack_command, + &trace_command, + &trim_command, + &help_command }; static void @@ -91,7 +90,7 @@ usage(void) static void list_commands(void) { - Command *command; + const Command *command; int i, max_width = 0; std::cout << "The available commands are as follows:\n\n"; @@ -99,15 +98,16 @@ list_commands(void) { std::cout << std::setiosflags(std::ios::left); for (i = 0; i < ARRAY_SIZE(commands); i++) { - command = &commands[i]; - if (strlen(command->name) > max_width) + command = commands[i]; + if (strlen(command->name) > max_width) { max_width = strlen(command->name); + } } for (i = 0; i < ARRAY_SIZE(commands); i++) { - command = &commands[i]; + command = commands[i]; - std::cout << " " << std::setw(max_width+2) << command->name + std::cout << " " << std::setw(max_width + 2) << command->name << " " << command->synopsis << "\n"; } @@ -117,20 +117,20 @@ list_commands(void) { static int -apitrace_help_command(int argc, char *argv[], int first_arg_command) +do_help_command(int argc, char *argv[]) { - Command *command; + const Command *command; int i; - if (first_arg_command == argc) { - apitrace_help_usage(); + if (argc != 1) { + help_usage(); return 0; } - char *command_name = argv[first_arg_command]; + char *command_name = argv[0]; for (i = 0; i < ARRAY_SIZE(commands); i++) { - command = &commands[i]; + command = commands[i]; if (strcmp(command_name, command->name) == 0) { (command->usage) (); @@ -147,14 +147,9 @@ apitrace_help_command(int argc, char *argv[], int first_arg_command) int main(int argc, char **argv) { - const char *command_name = "trace"; - Command *command; - int i, first_command_arg; - - if (argc == 1) { - usage(); - return 1; - } + const char *command_name; + const Command *command; + int i; for (i = 1; i < argc; ++i) { const char *arg = argv[i]; @@ -164,29 +159,33 @@ main(int argc, char **argv) } if (strcmp(arg, "--help") == 0) { - return apitrace_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]; + command = commands[i]; if (strcmp(command_name, command->name) == 0) - return (command->function) (argc, argv, first_command_arg); + return (command->function) (argc, argv); } std::cerr << "Error: unknown command " << command_name << " (see \"apitrace help\").\n"; - return 1; + return 1; }