static int usage_with_options_internal(struct parse_opt_ctx_t *ctx, const char * const *usagestr, const struct option *opts, int full, int err) { FILE *outfile = err ? stderr : stdout; if (!usagestr) return PARSE_OPT_HELP; if (!err && ctx && ctx->flags & PARSE_OPT_SHELL_EVAL) fprintf(outfile, "cat <<\\EOF\n"); fprintf_ln(outfile, _("usage: %s"), _(*usagestr++)); while (*usagestr && **usagestr) /* TRANSLATORS: the colon here should align with the one in "usage: %s" translation */ fprintf_ln(outfile, _(" or: %s"), _(*usagestr++)); while (*usagestr) { if (**usagestr) fprintf_ln(outfile, _(" %s"), _(*usagestr)); else putchar('\n'); usagestr++; } if (opts->type != OPTION_GROUP) fputc('\n', outfile); for (; opts->type != OPTION_END; opts++) { size_t pos; int pad; if (opts->type == OPTION_GROUP) { fputc('\n', outfile); if (*opts->help) fprintf(outfile, "%s\n", _(opts->help)); continue; } if (!full && (opts->flags & PARSE_OPT_HIDDEN)) continue; pos = fprintf(outfile, " "); if (opts->short_name) { if (opts->flags & PARSE_OPT_NODASH) pos += fprintf(outfile, "%c", opts->short_name); else pos += fprintf(outfile, "-%c", opts->short_name); } if (opts->long_name && opts->short_name) pos += fprintf(outfile, ", "); if (opts->long_name) pos += fprintf(outfile, "--%s", opts->long_name); if (opts->type == OPTION_NUMBER) pos += utf8_fprintf(outfile, _("-NUM")); if ((opts->flags & PARSE_OPT_LITERAL_ARGHELP) || !(opts->flags & PARSE_OPT_NOARG)) pos += usage_argh(opts, outfile); if (pos <= USAGE_OPTS_WIDTH) pad = USAGE_OPTS_WIDTH - pos; else { fputc('\n', outfile); pad = USAGE_OPTS_WIDTH; } fprintf(outfile, "%*s%s\n", pad + USAGE_GAP, "", _(opts->help)); } fputc('\n', outfile); if (!err && ctx && ctx->flags & PARSE_OPT_SHELL_EVAL) fputs("EOF\n", outfile); return PARSE_OPT_HELP; }
static int usage_with_options_internal(const char * const *usagestr, const struct option *opts, int full) { if (!usagestr) return PARSE_OPT_HELP; fprintf(stderr, "usage: %s\n", *usagestr++); while (*usagestr && **usagestr) fprintf(stderr, " or: %s\n", *usagestr++); while (*usagestr) { fprintf(stderr, "%s%s\n", **usagestr ? " " : "", *usagestr); usagestr++; } if (opts->type != OPTION_GROUP) fputc('\n', stderr); for (; opts->type != OPTION_END; opts++) { size_t pos; int pad; if (opts->type == OPTION_GROUP) { fputc('\n', stderr); if (*opts->help) fprintf(stderr, "%s\n", opts->help); continue; } if (!full && (opts->flags & PARSE_OPT_HIDDEN)) continue; pos = fprintf(stderr, " "); if (opts->short_name && !(opts->flags & PARSE_OPT_NEGHELP)) { if (opts->flags & PARSE_OPT_NODASH) pos += fprintf(stderr, "%c", opts->short_name); else pos += fprintf(stderr, "-%c", opts->short_name); } if (opts->long_name && opts->short_name) pos += fprintf(stderr, ", "); if (opts->long_name) pos += fprintf(stderr, "--%s%s", (opts->flags & PARSE_OPT_NEGHELP) ? "no-" : "", opts->long_name); if (opts->type == OPTION_NUMBER) pos += fprintf(stderr, "-NUM"); if (!(opts->flags & PARSE_OPT_NOARG)) pos += usage_argh(opts); if (pos <= USAGE_OPTS_WIDTH) pad = USAGE_OPTS_WIDTH - pos; else { fputc('\n', stderr); pad = USAGE_OPTS_WIDTH; } fprintf(stderr, "%*s%s\n", pad + USAGE_GAP, "", opts->help); } fputc('\n', stderr); return PARSE_OPT_HELP; }