X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fopt%2Fhelpers.c;h=48f4fa45991ed1809438f55ae4f840485b0d3946;hb=13b374859ed7564c5945ff9e18c7bc0e98d7532e;hp=53fb0158827aca291e5ce39ff5566da60f49c8ec;hpb=bbdf3ef3c2c14e515388c6146fd00557cee905a1;p=ccan diff --git a/ccan/opt/helpers.c b/ccan/opt/helpers.c index 53fb0158..48f4fa45 100644 --- a/ccan/opt/helpers.c +++ b/ccan/opt/helpers.c @@ -1,6 +1,9 @@ /* Licensed under GPLv3+ - see LICENSE file for details */ #include +#include +#include #include +#include #include #include #include @@ -52,7 +55,7 @@ char *opt_set_invbool_arg(const char *arg, bool *b) /* Set a char *. */ char *opt_set_charp(const char *arg, char **p) { - *p = (char *)arg; + *p = cast_const(char *, arg); return NULL; } @@ -66,8 +69,8 @@ char *opt_set_intval(const char *arg, int *i) if (err) return err; *i = l; - /* Beware truncation... */ - if (*i != l) + /* Beware truncation, but don't generate untestable code. */ + if (sizeof(*i) != sizeof(l) && *i != l) return arg_bad("value '%s' does not fit into an integer", arg); return err; } @@ -123,12 +126,18 @@ char *opt_inc_intval(int *i) char *opt_version_and_exit(const char *version) { printf("%s\n", version); + /* Don't have valgrind complain! */ + opt_free_table(); exit(0); } char *opt_usage_and_exit(const char *extra) { - printf("%s", opt_usage(opt_argv0, extra)); + char *usage = opt_usage(opt_argv0, extra); + printf("%s", usage); + /* Don't have valgrind complain! */ + opt_alloc.free(usage); + opt_free_table(); exit(0); } @@ -258,7 +267,8 @@ static char * set_long_with_suffix(const char *arg, long *l, const long base) return err; *l = ll; - if (*l != ll) + /* Beware truncation, but don't generate untestable code. */ + if (sizeof(*l) != sizeof(ll) && *l != ll) return arg_bad("value '%s' does not fit into a long", arg); return NULL; } @@ -272,7 +282,8 @@ static char * set_ulong_with_suffix(const char *arg, unsigned long *ul, const lo if (ll < 0) return arg_bad("'%s' is negative but destination is unsigned", arg); *ul = ll; - if (*ul != ll) + /* Beware truncation, but don't generate untestable code. */ + if (sizeof(*ul) != sizeof(ll) && *ul != ll) return arg_bad("value '%s' does not fit into an unsigned long", arg); return NULL; } @@ -392,9 +403,9 @@ static void show_llong_with_suffix(char buf[OPT_SHOW_LEN], long long ll, ll = tmp; } if (i == 0) - snprintf(buf, OPT_SHOW_LEN, "%lld", ll); + snprintf(buf, OPT_SHOW_LEN, "%"PRId64, (int64_t)ll); else - snprintf(buf, OPT_SHOW_LEN, "%lld%c", ll, suffixes[i - 1]); + snprintf(buf, OPT_SHOW_LEN, "%"PRId64"%c", (int64_t)ll, suffixes[i - 1]); } static void show_ullong_with_suffix(char buf[OPT_SHOW_LEN], unsigned long long ull, @@ -414,9 +425,9 @@ static void show_ullong_with_suffix(char buf[OPT_SHOW_LEN], unsigned long long u ull = tmp; } if (i == 0) - snprintf(buf, OPT_SHOW_LEN, "%llu", ull); + snprintf(buf, OPT_SHOW_LEN, "%"PRIu64, (uint64_t)ull); else - snprintf(buf, OPT_SHOW_LEN, "%llu%c", ull, suffixes[i - 1]); + snprintf(buf, OPT_SHOW_LEN, "%"PRIu64"%c", (uint64_t)ull, suffixes[i - 1]); } /* _bi, signed */