Skip to content

Commit

Permalink
Rework make_usage to print the usage message immediately
Browse files Browse the repository at this point in the history
Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
  • Loading branch information
Alex Riesen authored and Junio C Hamano committed Oct 30, 2007
1 parent beb4743 commit f389c80
Showing 1 changed file with 22 additions and 25 deletions.
47 changes: 22 additions & 25 deletions parse-options.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#include "git-compat-util.h"
#include "parse-options.h"
#include "strbuf.h"

#define OPT_SHORT 1
#define OPT_UNSET 2
Expand Down Expand Up @@ -172,59 +171,57 @@ int parse_options(int argc, const char **argv, const struct option *options,
void usage_with_options(const char * const *usagestr,
const struct option *opts)
{
struct strbuf sb;

strbuf_init(&sb, 4096);
strbuf_addstr(&sb, *usagestr);
strbuf_addch(&sb, '\n');
while (*++usagestr)
strbuf_addf(&sb, " %s\n", *usagestr);
fprintf(stderr, "usage: %s\n", *usagestr++);
while (*usagestr && **usagestr)
fprintf(stderr, " or: %s\n", *usagestr++);
while (*usagestr)
fprintf(stderr, " %s\n", *usagestr++);

if (opts->type != OPTION_GROUP)
strbuf_addch(&sb, '\n');
fputc('\n', stderr);

for (; opts->type != OPTION_END; opts++) {
size_t pos;
int pad;

if (opts->type == OPTION_GROUP) {
strbuf_addch(&sb, '\n');
fputc('\n', stderr);
if (*opts->help)
strbuf_addf(&sb, "%s\n", opts->help);
fprintf(stderr, "%s\n", opts->help);
continue;
}

pos = sb.len;
strbuf_addstr(&sb, " ");
pos = fprintf(stderr, " ");
if (opts->short_name)
strbuf_addf(&sb, "-%c", opts->short_name);
pos += fprintf(stderr, "-%c", opts->short_name);
if (opts->long_name && opts->short_name)
strbuf_addstr(&sb, ", ");
pos += fprintf(stderr, ", ");
if (opts->long_name)
strbuf_addf(&sb, "--%s", opts->long_name);
pos += fprintf(stderr, "--%s", opts->long_name);

switch (opts->type) {
case OPTION_INTEGER:
strbuf_addstr(&sb, " <n>");
pos += fprintf(stderr, " <n>");
break;
case OPTION_STRING:
if (opts->argh)
strbuf_addf(&sb, " <%s>", opts->argh);
pos += fprintf(stderr, " <%s>", opts->argh);
else
strbuf_addstr(&sb, " ...");
pos += fprintf(stderr, " ...");
break;
default:
break;
}

pad = sb.len - pos;
if (pad <= USAGE_OPTS_WIDTH)
pad = USAGE_OPTS_WIDTH - pad;
if (pos <= USAGE_OPTS_WIDTH)
pad = USAGE_OPTS_WIDTH - pos;
else {
strbuf_addch(&sb, '\n');
fputc('\n', stderr);
pad = USAGE_OPTS_WIDTH;
}
strbuf_addf(&sb, "%*s%s\n", pad + USAGE_GAP, "", opts->help);
fprintf(stderr, "%*s%s\n", pad + USAGE_GAP, "", opts->help);
}
usage(sb.buf);
fputc('\n', stderr);

exit(129);
}

0 comments on commit f389c80

Please sign in to comment.