X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fopt%2Fusage.c;h=4ed279197fe808ac391d39a93df1dbb9e8b14126;hb=4bfa8587c9b7c8450320232837c6481d07ce77f6;hp=3edc4cf87ade8c8158eed5f01f9500944ae7c264;hpb=8071ba125bb6893b88c02353638eeac220cb99c1;p=ccan diff --git a/ccan/opt/usage.c b/ccan/opt/usage.c index 3edc4cf8..4ed27919 100644 --- a/ccan/opt/usage.c +++ b/ccan/opt/usage.c @@ -1,14 +1,17 @@ -/* Licensed under GPLv3+ - see LICENSE file for details */ +/* Licensed under GPLv2+ - see LICENSE file for details */ #include #if HAVE_SYS_TERMIOS_H #include #include /* Required on Solaris for struct winsize */ #endif +#if HAVE_SYS_UNISTD_H #include /* Required on Solaris for ioctl */ +#endif #include #include #include #include +#include #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, " "); @@ -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(" "); @@ -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 : "", NULL)); + exit(1); +}