]> git.ozlabs.org Git - ccan/blobdiff - ccan/opt/usage.c
ccan: allow user to set some bits in opt_table.type.
[ccan] / ccan / opt / usage.c
index b71fb334627f174fbc8bfd2022e87c0304d43fd8..4ed279197fe808ac391d39a93df1dbb9e8b14126 100644 (file)
@@ -4,11 +4,14 @@
 #include <sys/ioctl.h>
 #include <sys/termios.h> /* Required on Solaris for struct winsize */
 #endif
+#if HAVE_SYS_UNISTD_H
 #include <sys/unistd.h> /* Required on Solaris for ioctl */
+#endif
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdint.h>
+#include <stdarg.h>
 #include "private.h"
 
 /* We only use this for pointer comparisons. */
@@ -69,7 +72,8 @@ static size_t consume_words(const char *words, size_t maxlen, size_t *prefix,
                }
        }
 
-       *start = (words[oldlen - 1] == '\n');
+       if (oldlen != 0)
+               *start = (words[oldlen - 1] == '\n');
        return oldlen;
 }
 
@@ -107,7 +111,7 @@ static char *add_desc(char *base, size_t *len, size_t *max,
 
        base = add_str(base, len, max, opt->names);
        off = strlen(opt->names);
-       if (opt->type == OPT_HASARG
+       if ((opt->type & OPT_HASARG)
            && !strchr(opt->names, ' ')
            && !strchr(opt->names, '=')) {
                base = add_str(base, len, max, " <arg>");
@@ -178,10 +182,10 @@ char *opt_usage(const char *argv0, const char *extra)
                size_t l;
                if (opt_table[i].desc == opt_hidden)
                        continue;
-               if (opt_table[i].type == OPT_SUBTABLE)
+               if (opt_table[i].type & OPT_SUBTABLE)
                        continue;
                l = strlen(opt_table[i].names);
-               if (opt_table[i].type == OPT_HASARG
+               if ((opt_table[i].type & OPT_HASARG)
                    && !strchr(opt_table[i].names, ' ')
                    && !strchr(opt_table[i].names, '='))
                        l += strlen(" <arg>");
@@ -217,7 +221,7 @@ char *opt_usage(const char *argv0, const char *extra)
        for (i = 0; i < opt_count; i++) {
                if (opt_table[i].desc == opt_hidden)
                        continue;
-               if (opt_table[i].type == OPT_SUBTABLE) {
+               if (opt_table[i].type & OPT_SUBTABLE) {
                        ret = add_str(ret, &len, &max, opt_table[i].desc);
                        ret = add_str(ret, &len, &max, ":\n");
                        continue;
@@ -227,3 +231,17 @@ char *opt_usage(const char *argv0, const char *extra)
        ret[len] = '\0';
        return ret;
 }
+
+void opt_usage_exit_fail(const char *msg, ...)
+{
+       va_list ap;
+
+       if (opt_argv0)
+               fprintf(stderr, "%s: ", opt_argv0);
+       va_start(ap, msg);
+       vfprintf(stderr, msg, ap);
+       va_end(ap);
+       fprintf(stderr, "\n%s",
+               opt_usage(opt_argv0 ? opt_argv0 : "<program>", NULL));
+       exit(1);
+}