]> git.ozlabs.org Git - ccan/blobdiff - ccan/opt/usage.c
opt: add support for showing default value.
[ccan] / ccan / opt / usage.c
index 37ba3ed712d51fe63a8c236a6f3e45acea2f2b0d..d76c3b03ed317e3306f4ccad739ccdcac2fbdd9d 100644 (file)
@@ -25,6 +25,8 @@ static unsigned write_short_options(char *str)
        return num;
 }
 
+#define OPT_SPACE_PAD "                    "
+
 /* FIXME: Get all purdy. */
 char *opt_usage(const char *argv0, const char *extra)
 {
@@ -45,8 +47,14 @@ char *opt_usage(const char *argv0, const char *extra)
                        len += strlen("--%s/-%c") + strlen(" <arg>");
                        if (opt_table[i].longopt)
                                len += strlen(opt_table[i].longopt);
-                       if (opt_table[i].desc)
-                               len += 20 + strlen(opt_table[i].desc);
+                       if (opt_table[i].desc) {
+                               len += strlen(OPT_SPACE_PAD)
+                                       + strlen(opt_table[i].desc) + 1;
+                       }
+                       if (opt_table[i].show) {
+                               len += strlen("(default: %s)")
+                                       + OPT_SHOW_LEN + sizeof("...");
+                       }
                        len += strlen("\n");
                }
        }
@@ -89,11 +97,20 @@ char *opt_usage(const char *argv0, const char *extra)
                        len = sprintf(p, "--%s", opt_table[i].longopt);
                if (opt_table[i].flags == OPT_HASARG)
                        len += sprintf(p + len, " <arg>");
-               if (opt_table[i].desc) {
+               if (opt_table[i].desc || opt_table[i].show)
                        len += sprintf(p + len, "%.*s",
-                                      len < 20 ? 20 - len : 1,
-                                      "                    ");
+                                      len < strlen(OPT_SPACE_PAD)
+                                      ? strlen(OPT_SPACE_PAD) - len : 1,
+                                      OPT_SPACE_PAD);
+
+               if (opt_table[i].desc)
                        len += sprintf(p + len, "%s", opt_table[i].desc);
+               if (opt_table[i].show) {
+                       char buf[OPT_SHOW_LEN + sizeof("...")];
+                       strcpy(buf + OPT_SHOW_LEN, "...");
+                       opt_table[i].show(buf, opt_table[i].arg);
+                       len += sprintf(p + len, "%s(default: %s)",
+                                      opt_table[i].desc ? " " : "", buf);
                }
                p += len;
                p += sprintf(p, "\n");