X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Fopt-help.c;h=fdd3ec74108a9e5d543431de306a7c7a500b2c55;hb=ec6703bb4d58e504fde8ea8429f9b26ab6632696;hp=4166cc5f717e627e41e993b0a7e7d53dd83f5885;hpb=50c7c2b64a94a085b20e375bc67180a4470c2564;p=libucw.git diff --git a/ucw/opt-help.c b/ucw/opt-help.c index 4166cc5f..fdd3ec74 100644 --- a/ucw/opt-help.c +++ b/ucw/opt-help.c @@ -28,44 +28,47 @@ struct help_line { static void opt_help_scan_item(struct help *h, struct opt_precomputed *opt) { - struct opt_item *item = opt->item; + const struct opt_item *item = opt->item; - if (opt->flags & OPT_NO_HELP) + if (!item->help) return; + bool force_col1 = 0; if (item->cls == OPT_CL_HELP) { - struct help_line *l = GARY_PUSH(h->lines, 1); - l->extra = item->help ? : ""; - return; + if (item->flags & OPT_HELP_COL) { + force_col1 = 1; + } else { + struct help_line *l = GARY_PUSH(h->lines); + l->extra = item->help; + return; + } } if (item->letter >= OPT_POSITIONAL_TAIL) return; - struct help_line *first = GARY_PUSH(h->lines, 1); - if (item->help) { - char *text = mp_strdup(h->pool, item->help); - struct help_line *l = first; - while (text) { - char *eol = strchr(text, '\n'); - if (eol) - *eol++ = 0; - - int field = (l == first ? 1 : 0); - char *f = text; - while (f) { - char *tab = strchr(f, '\t'); - if (tab) - *tab++ = 0; - if (field < 3) - l->fields[field++] = f; - f = tab; - } - - text = eol; - if (text) - l = GARY_PUSH(h->lines, 1); + struct help_line *first = GARY_PUSH(h->lines); + char *text = mp_strdup(h->pool, item->help); + struct help_line *l = first; + while (text) { + char *eol = strchr(text, '\n'); + if (eol) + *eol++ = 0; + + int field = (l == first && !force_col1 ? 1 : 0); + char *f = text; + while (f) { + char *tab = strchr(f, '\t'); + if (tab) + *tab++ = 0; + if (field < 3) + l->fields[field++] = f; + f = tab; } + + text = eol; + if (text) + l = GARY_PUSH(h->lines); } if (item->name) { @@ -92,7 +95,7 @@ static void opt_help_scan_item(struct help *h, struct opt_precomputed *opt) static void opt_help_scan(struct help *h, const struct opt_section *sec) { - for (struct opt_item * item = sec->opt; item->cls != OPT_CL_END; item++) { + for (const struct opt_item * item = sec->opt; item->cls != OPT_CL_END; item++) { if (item->cls == OPT_CL_SECTION) opt_help_scan(h, item->u.section); else if (item->cls == OPT_CL_HOOK) @@ -113,14 +116,14 @@ void opt_help(const struct opt_section * sec) { opt_help_scan(&h, sec); // Calculate natural width of each column - uns n = GARY_SIZE(h.lines); - uns widths[3] = { 0, 0, 0 }; - for (uns i=0; ifields[f]) l->fields[f] = ""; - uns w = strlen(l->fields[f]); + uint w = strlen(l->fields[f]); widths[f] = MAX(widths[f], w); } } @@ -135,13 +138,13 @@ void opt_help(const struct opt_section * sec) { widths[1] += 4; // Print columns - for (uns i=0; iextra) puts(l->extra); else { int t = 0; - for (uns f=0; f<3; f++) { + for (uint f=0; f<3; f++) { t += widths[f]; t -= printf("%s", l->fields[f]); while (t > 0) { @@ -158,7 +161,7 @@ void opt_help(const struct opt_section * sec) { mp_delete(h.pool); } -void opt_handle_help(struct opt_item * opt UNUSED, const char * value UNUSED, void * data) +void opt_handle_help(const struct opt_item * opt UNUSED, const char * value UNUSED, void * data) { struct opt_context *oc = data; opt_help(oc->options);