fprintf(outfile, "%*s", pad + USAGE_GAP, "");
}
+static const struct option *find_option_by_long_name(const struct option *opts,
+ const char *long_name)
+{
+ for (; opts->type != OPTION_END; opts++) {
+ if (opts->long_name && !strcmp(opts->long_name, long_name))
+ return opts;
+ }
+ return NULL;
+}
+
static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t *ctx,
const char * const *usagestr,
const struct option *opts,
int full, int err)
{
+ const struct option *all_opts = opts;
FILE *outfile = err ? stderr : stdout;
int need_newline;
for (; opts->type != OPTION_END; opts++) {
size_t pos;
const char *cp, *np;
+ const char *positive_name = NULL;
if (opts->type == OPTION_SUBCOMMAND)
continue;
pos += fprintf(outfile, ", ");
if (opts->long_name) {
const char *long_name = opts->long_name;
- if (opts->flags & PARSE_OPT_NONEG)
+ if ((opts->flags & PARSE_OPT_NONEG) ||
+ skip_prefix(long_name, "no-", &positive_name))
pos += fprintf(outfile, "--%s", long_name);
else
pos += fprintf(outfile, "--[no-]%s", long_name);
np++;
pos = 0;
}
+
+ if (positive_name) {
+ if (find_option_by_long_name(all_opts, positive_name))
+ continue;
+ pos = usage_indent(outfile);
+ pos += fprintf(outfile, "--%s", positive_name);
+ usage_padding(outfile, pos);
+ fprintf_ln(outfile, _("opposite of --no-%s"),
+ positive_name);
+ }
}
fputc('\n', outfile);
A helper function for the parse-options API.
--[no-]yes get a boolean
- -D, --[no-]no-doubt begins with 'no-'
+ -D, --no-doubt begins with 'no-'
+ --doubt opposite of --no-doubt
-B, --no-fear be brave
-b, --[no-]boolean increment by one
-4, --[no-]or4 bitwise-or boolean with ...0100
some-command does foo and bar!
--[no-]foo can be negated
- --[no-]no-bar can be positivated
+ --no-bar can be positivated
+ --bar opposite of --no-bar
--positive-only cannot be negated
--no-negative cannot be positivated