]> git.draconx.ca Git - dxcommon.git/commitdiff
help: Add a single-dash long option mode.
authorNick Bowler <nbowler@draconx.ca>
Thu, 30 Sep 2021 01:58:46 +0000 (21:58 -0400)
committerNick Bowler <nbowler@draconx.ca>
Thu, 30 Sep 2021 01:59:17 +0000 (21:59 -0400)
For programs using getopt_long_only with single-dash long options, add a
compile time flag to select a mode that produces more appropriate help
output.  This is typical of command-line options for X applications.

Makefile.am
src/help.c
t/.gitignore
tests/functions.at

index a9f793484145c4d3769e1ff319b90aece2cb5692..3f976b1052b058bb5c03e00e4a82473cf1a3c6ee 100644 (file)
@@ -18,10 +18,17 @@ t_packtestu64_SOURCES = t/packtestu64.c src/pack.c src/tap.c
 t_packtests64_SOURCES = t/packtests64.c src/pack.c src/tap.c
 
 if HAVE_STRUCT_OPTION
-check_PROGRAMS += t/helpdesc t/helpopt
+check_PROGRAMS += t/helpdesc t/helpopt t/helpopt2
 endif
 
+EXTRA_LIBRARIES = libglohelp.a
+libglohelp_a_SOURCES = src/help.c
+libglohelp_a_CFLAGS = -DHELP_GETOPT_LONG_ONLY
+libglohelp_a_SHORTNAME = glo
+
 t_helpopt_SOURCES = t/helpopt.c src/help.c src/tap.c
+t_helpopt2_SOURCES = t/helpopt.c src/tap.c
+t_helpopt2_LDADD = $(libglohelp_a_OBJECTS)
 t_helpdesc_SOURCES = t/helpdesc.c src/help.c src/tap.c
 
 DISTCLEANFILES =
index 0ceb8f418fce80bfe166cd681ed52aa1c7d2ac06..d1dd5f5bc44055bf50a4599b0e1f24cf15ddc0bf 100644 (file)
@@ -71,6 +71,25 @@ int help_print_optstring(const struct option *opt, const char *argname, int l)
                goto no_translate;
 
        switch (option_type(opt)) {
+#if HELP_GETOPT_LONG_ONLY
+       case OPT_SHORT_WITH_OPTIONAL_ARG:
+       case OPT_LONG_WITH_OPTIONAL_ARG:
+               w = snprintf(optstring, sizeof optstring,
+                            _("  -%s [%s]"), opt->name,
+                            pgettext_expr(opt->name, argname));
+               break;
+       case OPT_SHORT_WITH_MANDATORY_ARG:
+       case OPT_LONG_WITH_MANDATORY_ARG:
+               w = snprintf(optstring, sizeof optstring,
+                            _("  -%s %s"), opt->name,
+                            pgettext_expr(opt->name, argname));
+               break;
+       case OPT_SHORT_WITHOUT_ARG:
+       case OPT_LONG_WITHOUT_ARG:
+               w = snprintf(optstring, sizeof optstring,
+                            _("  -%s"), opt->name);
+               break;
+#else
        case OPT_SHORT_WITH_OPTIONAL_ARG:
                w = snprintf(optstring, sizeof optstring,
                             _("  -%c, --%s[=%s]"), opt->val, opt->name,
@@ -99,6 +118,7 @@ int help_print_optstring(const struct option *opt, const char *argname, int l)
                w = snprintf(optstring, sizeof optstring,
                             _("  --%s"), opt->name);
                break;
+#endif
        default:
                assert(0);
        }
@@ -112,6 +132,20 @@ int help_print_optstring(const struct option *opt, const char *argname, int l)
 
 no_translate:
        switch (option_type(opt)) {
+#if HELP_GETOPT_LONG_ONLY
+       case OPT_SHORT_WITH_OPTIONAL_ARG:
+       case OPT_LONG_WITH_OPTIONAL_ARG:
+               w = printf("  -%s [%s]", opt->name, argname);
+               break;
+       case OPT_SHORT_WITH_MANDATORY_ARG:
+       case OPT_LONG_WITH_MANDATORY_ARG:
+               w = printf("  -%s %s", opt->name, argname);
+               break;
+       case OPT_SHORT_WITHOUT_ARG:
+       case OPT_LONG_WITHOUT_ARG:
+               w = printf("  -%s", opt->name);
+               break;
+#else
        case OPT_SHORT_WITH_OPTIONAL_ARG:
                w = printf("  -%c, --%s[=%s]", opt->val, opt->name, argname);
                break;
@@ -130,6 +164,7 @@ no_translate:
        case OPT_LONG_WITHOUT_ARG:
                w = printf("  --%s", opt->name);
                break;
+#endif
        default:
                assert(0);
        }
index 7fee3da6ceb3278f704ca44405c49dcaa2c2ebb5..acb4e4e5598a482baabbdaea19b50e0c2ba38f25 100644 (file)
@@ -1,4 +1,5 @@
 /helpdesc
 /helpopt
+/helpopt2
 /packtest[su]
 /packtest[su]64
index 507c10571a3c79eae484baebd74d66a145e3cfac..dbbcf6db2527c6ff7bbee0ab8718ceda1a8edbf6 100644 (file)
@@ -80,3 +80,32 @@ AT_CHECK([m4_join([ ],
 ]])
 
 AT_CLEANUP
+
+AT_SETUP([help_print_optstring (getopt_long_only)])
+
+AT_SKIP_IF([test ! -x "$builddir/t/helpopt2"])
+
+AT_CHECK([m4_join([ ],
+  ["$builddir/t/helpopt2"],
+  [--foo],
+  [--bar -b],
+  [--baz ARG],
+  [--baz -B ARG],
+  [--quux '@<:@ARG@:>@'],
+  [--quux -q '@<:@ARG@:>@'],
+  [--hello-this-is-a-very-long-option 20],
+  [--hello-this-is-a-very-long-option 50],
+  [--not-long 12])], [0],
+[[  -foo       6
+  -bar 6
+  -baz ARG     10
+  -baz ARG     10
+  -quux [ARG]  13
+  -quux [ARG]  13
+  -hello-this-is-a-very-long-option
+       0
+  -hello-this-is-a-very-long-option    35
+  -not-long    11
+]])
+
+AT_CLEANUP