Use Linux man page formatting in arg_show_usage()
Fix the problem that very long option names are truncated.
BUG=aomedia:2868
Change-Id: Ic389212b7de3fc8905e1634a168540f7cb9d1ebc
diff --git a/common/args.c b/common/args.c
index 068c8d2..7d110cc 100644
--- a/common/args.c
+++ b/common/args.c
@@ -201,30 +201,37 @@
return new_argv;
}
+// Use the formatting of the Linux man pages for cp, ls, mv, rm, etc.
void arg_show_usage(FILE *fp, const struct arg_def *const *defs) {
- char option_text[40] = { 0 };
-
for (; *defs; defs++) {
const struct arg_def *def = *defs;
char *short_val = def->has_val ? " <arg>" : "";
char *long_val = def->has_val ? "=<arg>" : "";
+ // Options start after 7 spaces.
+ fputs(" ", fp);
+ int n = 0;
if (def->short_name && def->long_name) {
- char *comma = def->has_val ? "," : ", ";
-
- snprintf(option_text, 37, "-%s%s%s --%s%6s", def->short_name, short_val,
- comma, def->long_name, long_val);
+ n = fprintf(fp, "-%s%s, --%s%s", def->short_name, short_val,
+ def->long_name, long_val);
} else if (def->short_name)
- snprintf(option_text, 37, "-%s%s", def->short_name, short_val);
+ n = fprintf(fp, "-%s%s", def->short_name, short_val);
else if (def->long_name)
- snprintf(option_text, 37, " --%s%s", def->long_name, long_val);
+ n = fprintf(fp, "--%s%s", def->long_name, long_val);
- fprintf(fp, " %-37s\t%s\n", option_text, def->desc);
+ // Descriptions start after 14 spaces. If an option is shorter than 7
+ // characters, its description starts on the same line.
+ if (n < 7)
+ for (int i = 0; i < 7 - n; i++) fputc(' ', fp);
+ else
+ fputs("\n ", fp);
+ fprintf(fp, "%s\n", def->desc);
if (def->enums) {
const struct arg_enum_list *listptr;
- fprintf(fp, " %-37s\t ", "");
+ // Enums start after 16 spaces.
+ fputs(" ", fp);
for (listptr = def->enums; listptr->name; listptr++)
fprintf(fp, "%s%s", listptr->name, listptr[1].name ? ", " : "\n");