Fix recursive dump of options
[fio.git] / parse.c
diff --git a/parse.c b/parse.c
index 962538c066ecace330da6ebb1a946b4294a003e2..f9e0ebeedc3fd635ccbc8605122f37a795289678 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -10,6 +10,7 @@
 #include <limits.h>
 
 #include "parse.h"
+#include "debug.h"
 
 static int vp_cmp(const void *p1, const void *p2)
 {
@@ -106,7 +107,7 @@ static unsigned long get_mult_bytes(char c)
 /*
  * convert string into decimal value, noting any size suffix
  */
-static int str_to_decimal(const char *str, long long *val, int kilo)
+int str_to_decimal(const char *str, long long *val, int kilo)
 {
        int len;
 
@@ -188,7 +189,7 @@ static int check_int(const char *p, int *val)
 {
        if (!strlen(p))
                return 1;
-       if (strstr(p, "0x")) {
+       if (strstr(p, "0x") || strstr(p, "0X")) {
                if (sscanf(p, "%x", val) == 1)
                        return 0;
        } else {
@@ -229,6 +230,9 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
        char **cp;
        int ret = 0, is_time = 0;
 
+       dprint(FD_PARSE, "__handle_option=%s, type=%d, ptr=%s\n", o->name,
+                                                       o->type, ptr);
+
        if (!ptr && o->type != FIO_OPT_STR_SET) {
                fprintf(stderr, "Option %s requires an argument\n", o->name);
                return 1;
@@ -350,7 +354,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
                                val_store(ilp, ul1, o->off1, data);
                                val_store(ilp, ul2, o->off2, data);
                        }
-                       if (!more && o->off3 && o->off4) {
+                       if (o->off3 && o->off4) {
                                val_store(ilp, ul1, o->off3, data);
                                val_store(ilp, ul2, o->off4, data);
                        }
@@ -414,6 +418,8 @@ static int handle_option(struct fio_option *o, const char *ptr, void *data)
        const char *ptr2 = NULL;
        int r1, r2;
 
+       dprint(FD_PARSE, "handle_option=%s, ptr=%s\n", o->name, ptr);
+
        /*
         * See if we have a second set of parameters, hidden after a comma.
         * Do this before parsing the first round, to check if we should
@@ -566,30 +572,56 @@ static struct fio_option *find_child(struct fio_option *options,
 {
        struct fio_option *__o;
 
-       for (__o = &options[0]; __o->name; __o++)
+       for (__o = options + 1; __o->name; __o++)
                if (__o->parent && !strcmp(__o->parent, o->name))
                        return __o;
 
        return NULL;
 }
 
-static void print_option(struct fio_option *options, struct fio_option *o,
-                        int level)
+static void __print_option(struct fio_option *o, struct fio_option *org,
+                          int level)
 {
        char name[256], *p;
-       int i;
+       int depth;
 
        if (!o)
                return;
+       if (!org)
+               org = o;
        
        p = name;
-       for (i = 0; i < level; i++)
-               p += sprintf(p, "%s", "    ");
+       depth = level;
+       while (depth--)
+               p += sprintf(p, "%s", "  ");
 
        sprintf(p, "%s", o->name);
 
        printf("%-24s: %s\n", name, o->help);
-       print_option(options, find_child(options, o), level + 1);
+}
+
+static void print_option(struct fio_option *o)
+{
+       struct fio_option *parent;
+       struct fio_option *__o;
+       unsigned int printed;
+       unsigned int level;
+
+       __print_option(o, NULL, 0);
+       parent = o;
+       level = 0;
+       do {
+               level++;
+               printed = 0;
+
+               while ((__o = find_child(o, parent)) != NULL) {
+                       __print_option(__o, o, level);
+                       o = __o;
+                       printed++;
+               }
+
+               parent = o;
+       } while (printed);
 }
 
 int show_cmd_help(struct fio_option *options, const char *name)
@@ -628,7 +660,7 @@ int show_cmd_help(struct fio_option *options, const char *name)
                                printf("%24s: %s\n", o->name, o->help);
                        if (show_all) {
                                if (!o->parent)
-                                       print_option(options, o, 0);
+                                       print_option(o);
                                continue;
                        }
                }
@@ -660,6 +692,8 @@ void fill_default_options(void *data, struct fio_option *options)
 {
        struct fio_option *o;
 
+       dprint(FD_PARSE, "filling default options\n");
+
        for (o = &options[0]; o->name; o++)
                if (o->def)
                        handle_option(o, o->def, data);
@@ -673,6 +707,8 @@ void options_init(struct fio_option *options)
 {
        struct fio_option *o;
 
+       dprint(FD_PARSE, "init options\n");
+
        for (o = &options[0]; o->name; o++) {
                if (o->type == FIO_OPT_BOOL) {
                        o->minval = 0;