]> git.draconx.ca Git - dxcommon.git/blobdiff - src/help.c
copysym: Fix pointer qualifier mismatch.
[dxcommon.git] / src / help.c
index 0ceb8f418fce80bfe166cd681ed52aa1c7d2ac06..f96025f1298fdcad10c29953d64cd92aef0da7bb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2021 Nick Bowler
+ * Copyright © 2021-2023 Nick Bowler
  *
  * Helper functions for formatting --help program output.
  *
@@ -28,6 +28,7 @@
 #endif
 
 #if ENABLE_NLS
+#      include <locale.h>
 #      include <gettext.h>
 #      include <mbswidth.h>
 #else
  */
 static int option_type(const struct option *opt)
 {
-       return ((opt->val <= CHAR_MAX) << 2) | (opt->has_arg & 3);
+       int ret = opt->has_arg & 3;
+
+       if (!opt->flag)
+               ret |= (opt->val <= CHAR_MAX) << 2;
+
+       return ret;
 }
 
 enum {
@@ -71,6 +77,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 +124,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 +138,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 +170,7 @@ no_translate:
        case OPT_LONG_WITHOUT_ARG:
                w = printf("  --%s", opt->name);
                break;
+#endif
        default:
                assert(0);
        }
@@ -144,7 +185,13 @@ out:
 
 void help_print_desc(const struct option *opt, const char *s, int i, int w)
 {
-       for (s = pgettext_expr(opt->name, s); *s; w = 0) {
+       if (opt)
+               s = pgettext_expr(opt->name, s);
+
+       if (i && s[0] == '\0')
+               putchar('\n');
+
+       for (; *s; w = 0) {
                const char *nl = strchr(s, '\n');
                int n = (nl ? nl-s : -1);