X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fopt%2Fhelpers.c;h=e531a7d3aa2bc9d250e0608f21f0604d66e13733;hb=b377324e5c1ad356b535f4c3724251c626abdf40;hp=2c771bc3309062aa7cfea03423f719128f3c9686;hpb=79715b8c08446fe5e74d2ab9e9db00175169eab3;p=ccan diff --git a/ccan/opt/helpers.c b/ccan/opt/helpers.c index 2c771bc3..e531a7d3 100644 --- a/ccan/opt/helpers.c +++ b/ccan/opt/helpers.c @@ -116,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)++; @@ -195,9 +238,10 @@ static char *set_llong_with_suffix(const char *arg, long long *ll, const long long base) { char *endp; - if (!arg[0]) + if (!arg[0]){ + *ll = 0; return arg_bad("'%s' (an empty string) is not a number", arg); - + } errno = 0; *ll = strtoll(arg, &endp, 0); if (errno)