X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=parse.c;h=144794aa09b34d903e2e44969ba788adc70de25f;hp=13783fa6d60c06f1df0fb82dcaf18ac2636750ae;hb=266506958a1dbaa41800f0b1170217d81c702f47;hpb=bfe1d59237aeb5a9c3540b0beb69c686af41dfa9 diff --git a/parse.c b/parse.c index 13783fa6..144794aa 100644 --- a/parse.c +++ b/parse.c @@ -10,11 +10,13 @@ #include #include #include +#include #include "parse.h" #include "debug.h" #include "options.h" #include "minmax.h" +#include "lib/ieee754.h" static struct fio_option *fio_options; extern unsigned int fio_get_kb_base(void *); @@ -49,11 +51,11 @@ static void show_option_range(struct fio_option *o, int (*logger)(const char *format, ...)) { if (o->type == FIO_OPT_FLOAT_LIST){ - if (isnan(o->minfp) && isnan(o->maxfp)) + if (o->minfp == MINDOUBLE && o->maxfp == MAXDOUBLE) return; logger("%20s: min=%f", "range", o->minfp); - if (!isnan(o->maxfp)) + if (o->maxfp != MAXDOUBLE) logger(", max=%f", o->maxfp); logger("\n"); } else { @@ -344,6 +346,11 @@ static int opt_len(const char *str) return (int)(postfix - str); } +static int str_match_len(const struct value_pair *vp, const char *str) +{ + return max(strlen(vp->ival), opt_len(str)); +} + #define val_store(ptr, val, off, or, data) \ do { \ ptr = td_var((data), (off)); \ @@ -357,7 +364,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, int first, int more, int curr) { int il, *ilp; - double* flp; + fio_fp64_t *flp; long long ull, *ullp; long ul1, ul2; double uf; @@ -388,7 +395,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, if (!vp->ival || vp->ival[0] == '\0') continue; all_skipped = 0; - if (!strncmp(vp->ival, ptr, opt_len(ptr))) { + if (!strncmp(vp->ival, ptr, str_match_len(vp, ptr))) { ret = 0; if (o->roff1) { if (vp->or) @@ -495,12 +502,6 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, break; } case FIO_OPT_FLOAT_LIST: { - - if (first) { - ul2 = 1; - ilp = td_var(data, o->off2); - *ilp = ul2; - } if (curr >= o->maxlen) { log_err("the list exceeding max length %d\n", o->maxlen); @@ -510,19 +511,19 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, log_err("not a floating point value: %s\n", ptr); return 1; } - if (!isnan(o->maxfp) && uf > o->maxfp) { + if (uf > o->maxfp) { log_err("value out of range: %f" " (range max: %f)\n", uf, o->maxfp); return 1; } - if (!isnan(o->minfp) && uf < o->minfp) { + if (uf < o->minfp) { log_err("value out of range: %f" " (range min: %f)\n", uf, o->minfp); return 1; } flp = td_var(data, o->off1); - flp[curr] = uf; + flp[curr].u.f = uf; break; } @@ -549,7 +550,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, if (!vp->ival || vp->ival[0] == '\0') continue; all_skipped = 0; - if (!strncmp(vp->ival, ptr, opt_len(ptr))) { + if (!strncmp(vp->ival, ptr, str_match_len(vp, ptr))) { char *rest; ret = 0; @@ -1091,8 +1092,8 @@ void option_init(struct fio_option *o) o->maxval = UINT_MAX; } if (o->type == FIO_OPT_FLOAT_LIST) { - o->minfp = NAN; - o->maxfp = NAN; + o->minfp = MINDOUBLE; + o->maxfp = MAXDOUBLE; } if (o->type == FIO_OPT_STR_SET && o->def) { log_err("Option %s: string set option with"