From 7574f425c08a8469304038ac89318fe359dfc16f Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 28 Apr 2024 04:01:50 +0200 Subject: [PATCH] Implement help subommand. --- dss.c | 50 +++++++++++++++++++++++++++++++++++++++++++++----- dss.suite | 21 +++++++++++++++++++++ 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/dss.c b/dss.c index 0992ec6..8e369ca 100644 --- a/dss.c +++ b/dss.c @@ -1837,20 +1837,57 @@ static void handle_version_and_help(void) exit(EXIT_SUCCESS); } -static void show_subcommand_summary(void) +static void show_subcommand_summary(bool verbose) { const struct lls_command *cmd; int i; - printf("Available subcommands:\n"); + printf("Available subcommands: "); + if (!verbose) { + for (i = 1; (cmd = lls_cmd(i, dss_suite)); i++) { + if (i > 1) + printf(", "); + printf("%s", lls_command_name(cmd)); + } + return; + } + printf("\n"); for (i = 1; (cmd = lls_cmd(i, dss_suite)); i++) { const char *name = lls_command_name(cmd); const char *purpose = lls_purpose(cmd); printf("%-11s%s\n", name, purpose); } - exit(EXIT_SUCCESS); } +static int com_help(void) +{ + int ret; + char *errctx, *help; + const char *arg; + const struct lls_command *cmd; + + ret = lls_check_arg_count(sublpr, 0, 1, &errctx); + if (ret < 0) + return lopsub_error(ret, &errctx); + if (lls_num_inputs(sublpr) == 0) { + show_subcommand_summary(OPT_GIVEN(HELP, LONG)); + return 0; + } + arg = lls_input(0, sublpr); + ret = lls_lookup_subcmd(arg, dss_suite, &errctx); + if (ret < 0) + return lopsub_error(ret, &errctx); + cmd = lls_cmd(ret, dss_suite); + if (OPT_GIVEN(HELP, LONG)) + help = lls_long_help(cmd); + else + help = lls_short_help(cmd); + printf("%s\n", help); + free(help); + return 0; +} +EXPORT_CMD_HANDLER(help); + int main(int argc, char **argv) { int ret; @@ -1869,8 +1906,11 @@ int main(int argc, char **argv) goto out; handle_version_and_help(); num_inputs = lls_num_inputs(lpr); - if (num_inputs == 0) - show_subcommand_summary(); + if (num_inputs == 0) { /* show verbose summary */ + show_subcommand_summary(true); + ret = 0; + goto out; + } ret = lls_lookup_subcmd(argv[argc - num_inputs], dss_suite, &errctx); if (ret < 0) { ret = lopsub_error(ret, &errctx); diff --git a/dss.suite b/dss.suite index f9cf8af..6d1ed4a 100644 --- a/dss.suite +++ b/dss.suite @@ -540,6 +540,27 @@ caption = Subcommands exits successfully or prints information about the first syntax error detected and terminates with exit code 1. [/description] +[subcommand help] + purpose = list available subcommands or print subcommand-specific help + non-opts-name = [subcommand] + [description] + Without any arguments, help prints the list of available + subcommands. When called with a subcommand name argument, it prints + the help text of the given subcommand. + [/description] + [option long] + short_opt = l + summary = show the long help text + [help] + If the optional argument is supplied, the long help text contains the + synopsis, the purpose and the description of the specified subcommand, + followed by the option list including summary and help text of each + option. Without --long, the short help is shown instead. This omits + the description of the subcommand and the option help. + + If no subcommand is supplied but --long is given, the list contains the + purpose of each subcommand. + [/help] [section copyright] Written by Andre Noll -- 2.39.2