]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/opt-help.c
Redblack: Added search_up
[libucw.git] / ucw / opt-help.c
index c69c22d360e6f55b498acf0f396360ad01fd36c2..fdd3ec74108a9e5d543431de306a7c7a500b2c55 100644 (file)
@@ -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; 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);
     }
   }
@@ -135,13 +138,13 @@ void opt_help(const struct opt_section * sec) {
   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) {
@@ -158,8 +161,9 @@ 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)
 {
-  opt_help(data);
+  struct opt_context *oc = data;
+  opt_help(oc->options);
   exit(0);
 }