X-Git-Url: https://git.cworth.org/git?p=notmuch;a=blobdiff_plain;f=notmuch.c;h=3ce30b456a369266d9831ccf089deeb66763f7ad;hp=e5c2aeb383c23fa404e1034308435e2d0129f7ec;hb=0018a8d787a98f80c665061daa9b0c73839d3666;hpb=d08af93c65310c2d5ec8033040854f8ff4e5550f diff --git a/notmuch.c b/notmuch.c index e5c2aeb3..3ce30b45 100644 --- a/notmuch.c +++ b/notmuch.c @@ -43,6 +43,35 @@ notmuch_help_command (notmuch_config_t *config, int argc, char *argv[]); static int notmuch_command (notmuch_config_t *config, int argc, char *argv[]); +static int +_help_for (const char *topic); + +static notmuch_bool_t print_version = FALSE, print_help = FALSE; + +const notmuch_opt_desc_t notmuch_shared_options [] = { + { NOTMUCH_OPT_BOOLEAN, &print_version, "version", 'v', 0 }, + { NOTMUCH_OPT_BOOLEAN, &print_help, "help", 'h', 0 }, + {0, 0, 0, 0, 0} +}; + +/* any subcommand wanting to support these options should call + * inherit notmuch_shared_options and call + * notmuch_process_shared_options (subcommand_name); + */ +void +notmuch_process_shared_options (const char *subcommand_name) { + if (print_version) { + printf ("notmuch " STRINGIFY(NOTMUCH_VERSION) "\n"); + exit (EXIT_SUCCESS); + } + + if (print_help) { + int ret = _help_for (subcommand_name); + exit (ret); + } +} + + static command_t commands[] = { { NULL, notmuch_command, TRUE, "Notmuch main command." }, @@ -177,21 +206,19 @@ exec_man (const char *page) } static int -notmuch_help_command (notmuch_config_t *config, int argc, char *argv[]) +_help_for (const char *topic_name) { command_t *command; help_topic_t *topic; unsigned int i; - argc--; argv++; /* Ignore "help" */ - - if (argc == 0) { + if (!topic_name) { printf ("The notmuch mail system.\n\n"); usage (stdout); return EXIT_SUCCESS; } - if (strcmp (argv[0], "help") == 0) { + if (strcmp (topic_name, "help") == 0) { printf ("The notmuch help system.\n\n" "\tNotmuch uses the man command to display help. In case\n" "\tof difficulties check that MANPATH includes the pages\n" @@ -200,26 +227,38 @@ notmuch_help_command (notmuch_config_t *config, int argc, char *argv[]) return EXIT_SUCCESS; } - command = find_command (argv[0]); + command = find_command (topic_name); if (command) { - char *page = talloc_asprintf (config, "notmuch-%s", command->name); + char *page = talloc_asprintf (NULL, "notmuch-%s", command->name); exec_man (page); } for (i = 0; i < ARRAY_SIZE (help_topics); i++) { topic = &help_topics[i]; - if (strcmp (argv[0], topic->name) == 0) { - char *page = talloc_asprintf (config, "notmuch-%s", topic->name); + if (strcmp (topic_name, topic->name) == 0) { + char *page = talloc_asprintf (NULL, "notmuch-%s", topic->name); exec_man (page); } } fprintf (stderr, "\nSorry, %s is not a known command. There's not much I can do to help.\n\n", - argv[0]); + topic_name); return EXIT_FAILURE; } +static int +notmuch_help_command (unused (notmuch_config_t * config), int argc, char *argv[]) +{ + argc--; argv++; /* Ignore "help" */ + + if (argc == 0) { + return _help_for (NULL); + } + + return _help_for (argv[0]); +} + /* Handle the case of "notmuch" being invoked with no command * argument. For now we just call notmuch_setup_command, but we plan * to be more clever about this in the future. @@ -285,14 +324,12 @@ main (int argc, char *argv[]) command_t *command; char *config_file_name = NULL; notmuch_config_t *config = NULL; - notmuch_bool_t print_help=FALSE, print_version=FALSE; int opt_index; int ret; notmuch_opt_desc_t options[] = { - { NOTMUCH_OPT_BOOLEAN, &print_help, "help", 'h', 0 }, - { NOTMUCH_OPT_BOOLEAN, &print_version, "version", 'v', 0 }, { NOTMUCH_OPT_STRING, &config_file_name, "config", 'c', 0 }, + { NOTMUCH_OPT_INHERIT, (void *) ¬much_shared_options, NULL, 0, 0 }, { 0, 0, 0, 0, 0 } }; @@ -314,24 +351,7 @@ main (int argc, char *argv[]) goto DONE; } - /* Handle notmuch --help [command] and notmuch command --help. */ - if (print_help || - (opt_index + 1 < argc && strcmp (argv[opt_index + 1], "--help") == 0)) { - /* - * Pass the first positional argument as argv[1] so the help - * command can give help for it. The help command ignores the - * argv[0] passed to it. - */ - ret = notmuch_help_command (NULL, argc - opt_index + 1, - argv + opt_index - 1); - goto DONE; - } - - if (print_version) { - printf ("notmuch " STRINGIFY(NOTMUCH_VERSION) "\n"); - ret = EXIT_SUCCESS; - goto DONE; - } + notmuch_process_shared_options (NULL); if (opt_index < argc) command_name = argv[opt_index];