X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fopt%2Fhelpers.c;h=747a78e9139b875e7f7f6620d194510418c2c300;hp=25929bd5bf705f6681a1c7303288a58a16d4453c;hb=b989e06c093fb7a2befae277f684fa75b64b9ef5;hpb=641b511049e5c03d45ada0c3fd829691b173e5d1 diff --git a/ccan/opt/helpers.c b/ccan/opt/helpers.c index 25929bd5..747a78e9 100644 --- a/ccan/opt/helpers.c +++ b/ccan/opt/helpers.c @@ -1,7 +1,9 @@ -/* Licensed under GPLv3+ - see LICENSE file for details */ +/* Licensed under GPLv2+ - see LICENSE file for details */ #include #include +#include #include +#include #include #include #include @@ -114,6 +116,49 @@ char *opt_set_ulongval(const char *arg, unsigned long *ul) return NULL; } +char *opt_set_floatval(const char *arg, float *f) +{ + double d; + char *err; + + err = opt_set_doubleval(arg, &d); + if (err) + return err; + + *f = d; + if (*f != d) + return arg_bad("'%s' is out of range", arg); + + return NULL; +} + +void opt_show_floatval(char buf[OPT_SHOW_LEN], const float *f) +{ + double d = *f; + opt_show_doubleval(buf, &d); +} + +char *opt_set_doubleval(const char *arg, double *d) +{ + char *endp; + + /* This is how the manpage says to do it. Yech. */ + errno = 0; + /* Don't assume strtof */ + *d = strtod(arg, &endp); + if (*endp || !arg[0]) + return arg_bad("'%s' is not a number", arg); + if (errno) + return arg_bad("'%s' is out of range", arg); + + return NULL; +} + +void opt_show_doubleval(char buf[OPT_SHOW_LEN], const double *d) +{ + snprintf(buf, OPT_SHOW_LEN, "%f", *d); +} + char *opt_inc_intval(int *i) { (*i)++; @@ -401,9 +446,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, @@ -423,9 +468,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 */