X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=parse.c;h=12a35bdc0ef57f550adf8f208a1c542572aaccf6;hp=3fda69cd263c79ffde4fd1f687f2091d816236f9;hb=619adf9c5aa472904eec3a62f13030e6b261ea25;hpb=fd112d34a2cfdc2d9efcd394e38b6d87b357c23d diff --git a/parse.c b/parse.c index 3fda69cd..12a35bdc 100644 --- a/parse.c +++ b/parse.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "parse.h" #include "debug.h" @@ -50,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 == DBL_MIN && o->maxfp == DBL_MAX) return; logger("%20s: min=%f", "range", o->minfp); - if (!isnan(o->maxfp)) + if (o->maxfp != DBL_MAX) logger(", max=%f", o->maxfp); logger("\n"); } else { @@ -368,10 +369,11 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, long ul1, ul2; double uf; char **cp = NULL; + char *cp2; int ret = 0, is_time = 0; const struct value_pair *vp; struct value_pair posval[PARSE_MAX_VP]; - int i, all_skipped = 1; + int i, len, all_skipped = 1; dprint(FD_PARSE, "__handle_option=%s, type=%d, ptr=%s\n", o->name, o->type, ptr); @@ -501,21 +503,34 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, break; } case FIO_OPT_FLOAT_LIST: { + if (first) { + /* + ** Initialize precision to 0 and zero out list + ** in case specified list is shorter than default + */ + ul2 = 0; + ilp = td_var(data, o->off2); + *ilp = ul2; + + flp = td_var(data, o->off1); + for(i = 0; i < o->maxlen; i++) + flp[i].u.f = 0.0; + } if (curr >= o->maxlen) { log_err("the list exceeding max length %d\n", o->maxlen); return 1; } - if (!str_to_float(ptr, &uf)){ + if (!str_to_float(ptr, &uf)) { 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; @@ -524,6 +539,23 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data, flp = td_var(data, o->off1); flp[curr].u.f = uf; + /* + ** Calculate precision for output by counting + ** number of digits after period. Find first + ** period in entire remaining list each time + */ + cp2 = strchr(ptr, '.'); + if (cp2 != NULL) { + len = 0; + + while (*++cp2 != '\0' && *cp2 >= '0' && *cp2 <= '9') + len++; + + ilp = td_var(data, o->off2); + if (len > *ilp) + *ilp = len; + } + break; } case FIO_OPT_STR_STORE: { @@ -1091,11 +1123,8 @@ void option_init(struct fio_option *o) o->maxval = UINT_MAX; } if (o->type == FIO_OPT_FLOAT_LIST) { -#ifndef NAN -#define NAN __builtin_nanf("") -#endif - o->minfp = NAN; - o->maxfp = NAN; + o->minfp = DBL_MIN; + o->maxfp = DBL_MAX; } if (o->type == FIO_OPT_STR_SET && o->def) { log_err("Option %s: string set option with"