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) {
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)
+ ;
else {
struct opt_precomputed opt;
opt_precompute(&opt, item);
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; i<n; i++) {
+ uint n = GARY_SIZE(h.lines);
+ uint widths[3] = { 0, 0, 0 };
+ for (uint i=0; i<n; i++) {
struct help_line *l = &h.lines[i];
- for (uns f=0; f<3; f++) {
+ for (uint f=0; f<3; f++) {
if (!l->fields[f])
l->fields[f] = "";
- uns w = strlen(l->fields[f]);
+ uint w = strlen(l->fields[f]);
widths[f] = MAX(widths[f], w);
}
}
widths[1] += 4;
// Print columns
- for (uns i=0; i<n; i++) {
+ for (uint i=0; i<n; i++) {
struct help_line *l = &h.lines[i];
if (l->extra)
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) {
mp_delete(h.pool);
}
+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);
+ exit(0);
+}