Add option priorities
[fio.git] / parse.c
diff --git a/parse.c b/parse.c
index f9e0ebeedc3fd635ccbc8605122f37a795289678..b9466901eebeddbe7c7b2b634bf5d504a3abfff8 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -12,6 +12,8 @@
 #include "parse.h"
 #include "debug.h"
 
+static struct fio_option *fio_options;
+
 static int vp_cmp(const void *p1, const void *p2)
 {
        const struct value_pair *vp1 = p1;
@@ -70,37 +72,37 @@ static void show_option_values(struct fio_option *o)
 static unsigned long get_mult_time(char c)
 {
        switch (c) {
-               case 'm':
-               case 'M':
-                       return 60;
-               case 'h':
-               case 'H':
-                       return 60 * 60;
-               case 'd':
-               case 'D':
-                       return 24 * 60 * 60;
-               default:
-                       return 1;
+       case 'm':
+       case 'M':
+               return 60;
+       case 'h':
+       case 'H':
+               return 60 * 60;
+       case 'd':
+       case 'D':
+               return 24 * 60 * 60;
+       default:
+               return 1;
        }
 }
 
 static unsigned long get_mult_bytes(char c)
 {
        switch (c) {
-               case 'k':
-               case 'K':
-                       return 1024;
-               case 'm':
-               case 'M':
-                       return 1024 * 1024;
-               case 'g':
-               case 'G':
-                       return 1024 * 1024 * 1024;
-               case 'e':
-               case 'E':
-                       return 1024 * 1024 * 1024 * 1024UL;
-               default:
-                       return 1;
+       case 'k':
+       case 'K':
+               return 1024;
+       case 'm':
+       case 'M':
+               return 1024 * 1024;
+       case 'g':
+       case 'G':
+               return 1024 * 1024 * 1024;
+       case 'e':
+       case 'E':
+               return 1024 * 1024 * 1024 * 1024UL;
+       default:
+               return 1;
        }
 }
 
@@ -282,11 +284,13 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
                        break;
 
                if (o->maxval && ull > o->maxval) {
-                       fprintf(stderr, "max value out of range: %lld (%d max)\n", ull, o->maxval);
+                       fprintf(stderr, "max value out of range: %lld"
+                                       " (%d max)\n", ull, o->maxval);
                        return 1;
                }
                if (o->minval && ull < o->minval) {
-                       fprintf(stderr, "min value out of range: %lld (%d min)\n", ull, o->minval);
+                       fprintf(stderr, "min value out of range: %lld"
+                                       " (%d min)\n", ull, o->minval);
                        return 1;
                }
 
@@ -341,7 +345,8 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
                p1 = tmp;
 
                ret = 1;
-               if (!check_range_bytes(p1, &ul1) && !check_range_bytes(p2, &ul2)) {
+               if (!check_range_bytes(p1, &ul1) &&
+                   !check_range_bytes(p2, &ul2)) {
                        ret = 0;
                        if (ul1 > ul2) {
                                unsigned long foo = ul1;
@@ -371,11 +376,13 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
                        break;
 
                if (o->maxval && il > (int) o->maxval) {
-                       fprintf(stderr, "max value out of range: %d (%d max)\n", il, o->maxval);
+                       fprintf(stderr, "max value out of range: %d (%d max)\n",
+                                                               il, o->maxval);
                        return 1;
                }
                if (o->minval && il < o->minval) {
-                       fprintf(stderr, "min value out of range: %d (%d min)\n", il, o->minval);
+                       fprintf(stderr, "min value out of range: %d (%d min)\n",
+                                                               il, o->minval);
                        return 1;
                }
 
@@ -405,6 +412,9 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
                }
                break;
        }
+       case FIO_OPT_DEPRECATED:
+               fprintf(stdout, "Option %s is deprecated\n", o->name);
+               break;
        default:
                fprintf(stderr, "Bad option type %u\n", o->type);
                ret = 1;
@@ -451,6 +461,56 @@ static int handle_option(struct fio_option *o, const char *ptr, void *data)
        return r1 && r2;
 }
 
+static struct fio_option *get_option(const char *opt,
+                                    struct fio_option *options, char **post)
+{
+       struct fio_option *o;
+       char *ret;
+
+       ret = strchr(opt, '=');
+       if (ret) {
+               *post = ret;
+               *ret = '\0';
+               ret = (char *) opt;
+               (*post)++;
+               o = find_option(options, ret);
+       } else {
+               o = find_option(options, opt);
+               *post = NULL;
+       }
+
+       return o;
+}
+
+static int opt_cmp(const void *p1, const void *p2)
+{
+       struct fio_option *o1, *o2;
+       char *s1, *s2, *foo;
+       int ret;
+
+       s1 = strdup(*((char **) p1));
+       s2 = strdup(*((char **) p2));
+
+       o1 = get_option(s1, fio_options, &foo);
+       o2 = get_option(s2, fio_options, &foo);
+
+       if ((!o1 && o2) || (o1 && !o2))
+               ret = 0;
+       else
+               ret = o2->prio - o1->prio;
+
+       free(s1);
+       free(s2);
+       return ret;
+}
+
+void sort_options(char **opts, struct fio_option *options, int num_opts)
+{
+       fio_options = options;
+       qsort(opts, num_opts, sizeof(char *), opt_cmp);
+       fio_options = NULL;
+}
+
 int parse_cmd_option(const char *opt, const char *val,
                     struct fio_option *options, void *data)
 {
@@ -472,23 +532,11 @@ int parse_cmd_option(const char *opt, const char *val,
 int parse_option(const char *opt, struct fio_option *options, void *data)
 {
        struct fio_option *o;
-       char *pre, *post;
-       char *tmp;
+       char *post, *tmp;
 
        tmp = strdup(opt);
 
-       pre = strchr(tmp, '=');
-       if (pre) {
-               post = pre;
-               *pre = '\0';
-               pre = tmp;
-               post++;
-               o = find_option(options, pre);
-       } else {
-               o = find_option(options, tmp);
-               post = NULL;
-       }
-
+       o = get_option(tmp, options, &post);
        if (!o) {
                fprintf(stderr, "Bad option %s\n", tmp);
                free(tmp);
@@ -589,7 +637,7 @@ static void __print_option(struct fio_option *o, struct fio_option *org,
                return;
        if (!org)
                org = o;
-       
+
        p = name;
        depth = level;
        while (depth--)
@@ -639,6 +687,9 @@ int show_cmd_help(struct fio_option *options, const char *name)
        for (o = &options[0]; o->name; o++) {
                int match = 0;
 
+               if (o->type == FIO_OPT_DEPRECATED)
+                       continue;
+
                if (name) {
                        if (!strcmp(name, o->name) ||
                            (o->alias && !strcmp(name, o->alias)))
@@ -710,17 +761,26 @@ void options_init(struct fio_option *options)
        dprint(FD_PARSE, "init options\n");
 
        for (o = &options[0]; o->name; o++) {
+               if (o->type == FIO_OPT_DEPRECATED)
+                       continue;
                if (o->type == FIO_OPT_BOOL) {
                        o->minval = 0;
                        o->maxval = 1;
                }
-               if (o->type == FIO_OPT_STR_SET && o->def)
-                       fprintf(stderr, "Option %s: string set option with default will always be true\n", o->name);
-               if (!o->cb && !o->off1)
-                       fprintf(stderr, "Option %s: neither cb nor offset given\n", o->name);
+               if (o->type == FIO_OPT_STR_SET && o->def) {
+                       fprintf(stderr, "Option %s: string set option with"
+                                       " default will always be true\n",
+                                               o->name);
+               }
+               if (!o->cb && !o->off1) {
+                       fprintf(stderr, "Option %s: neither cb nor offset"
+                                       " given\n", o->name);
+               }
                if (o->type == FIO_OPT_STR || o->type == FIO_OPT_STR_STORE)
                        continue;
-               if (o->cb && (o->off1 || o->off2 || o->off3 || o->off4))
-                       fprintf(stderr, "Option %s: both cb and offset given\n", o->name);
+               if (o->cb && (o->off1 || o->off2 || o->off3 || o->off4)) {
+                       fprintf(stderr, "Option %s: both cb and offset given\n",
+                                                                o->name);
+               }
        }
 }