Fixup ia64 32-bit register clock cycle read
[fio.git] / parse.c
diff --git a/parse.c b/parse.c
index 144794aa09b34d903e2e44969ba788adc70de25f..51cefcaef4abd3d93db61e658d5ae4c29b6d437a 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -10,7 +10,7 @@
 #include <limits.h>
 #include <stdlib.h>
 #include <math.h>
-#include <values.h>
+#include <float.h>
 
 #include "parse.h"
 #include "debug.h"
@@ -51,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 (o->minfp == MINDOUBLE && o->maxfp == MAXDOUBLE)
+               if (o->minfp == DBL_MIN && o->maxfp == DBL_MAX)
                        return;
 
                logger("%20s: min=%f", "range", o->minfp);
-               if (o->maxfp != MAXDOUBLE)
+               if (o->maxfp != DBL_MAX)
                        logger(", max=%f", o->maxfp);
                logger("\n");
        } else {
@@ -502,12 +502,27 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
                break;
        }
        case FIO_OPT_FLOAT_LIST: {
+               char *cp2;
+
+               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;
                }
@@ -525,6 +540,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) {
+                       int 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: {
@@ -1092,8 +1124,8 @@ void option_init(struct fio_option *o)
                        o->maxval = UINT_MAX;
        }
        if (o->type == FIO_OPT_FLOAT_LIST) {
-               o->minfp = MINDOUBLE;
-               o->maxfp = MAXDOUBLE;
+               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"