parse: get rid of raw option offsets
[fio.git] / goptions.c
index 08b17ac931ae2395ecc38c00a070fd9701505cdd..33183682d97f7eb3f2ab0887ffe6cea575245e24 100644 (file)
@@ -885,8 +885,12 @@ static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
                unsigned long long *ullp = NULL;
                struct gopt_int *i;
 
-               if (o->off1)
-                       ullp = td_var(to, o->off1);
+               if (o->off1) {
+                       if (o->prof_opts)
+                               ullp = td_var(o->prof_opts, o->off1);
+                       else
+                               ullp = td_var(to, o->off1);
+               }
 
                i = container_of(gopt, struct gopt_int, gopt);
                if (ullp)
@@ -898,8 +902,12 @@ static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
                        unsigned int *ip = NULL;
                        struct gopt_combo *c;
 
-                       if (o->off1)
-                               ip = td_var(to, o->off1);
+                       if (o->off1) {
+                               if (o->prof_opts)
+                                       ip = td_var(o->prof_opts, o->off1);
+                               else
+                                       ip = td_var(to, o->off1);
+                       }
 
                        c = container_of(gopt, struct gopt_combo, gopt);
                        if (ip)
@@ -908,8 +916,12 @@ static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
                        unsigned int *ip = NULL;
                        struct gopt_int *i;
 
-                       if (o->off1)
-                               ip = td_var(to, o->off1);
+                       if (o->off1) {
+                               if (o->prof_opts)
+                                       ip = td_var(o->prof_opts, o->off1);
+                               else
+                                       ip = td_var(to, o->off1);
+                       }
 
                        i = container_of(gopt, struct gopt_int, gopt);
                        if (ip)
@@ -921,8 +933,12 @@ static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
                unsigned int *ip = NULL;
                struct gopt_bool *b;
 
-               if (o->off1)
-                       ip = td_var(to, o->off1);
+               if (o->off1) {
+                       if (o->prof_opts)
+                               ip = td_var(o->prof_opts, o->off1);
+                       else
+                               ip = td_var(to, o->off1);
+               }
 
                b = container_of(gopt, struct gopt_bool, gopt);
                if (ip)
@@ -934,8 +950,12 @@ static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
                        unsigned int *ip = NULL;
                        struct gopt_combo *c;
 
-                       if (o->off1)
-                               ip = td_var(to, o->off1);
+                       if (o->off1) {
+                               if (o->prof_opts)
+                                       ip = td_var(o->prof_opts, o->off1);
+                               else
+                                       ip = td_var(to, o->off1);
+                       }
 
                        c = container_of(gopt, struct gopt_combo, gopt);
                        if (ip)
@@ -945,7 +965,12 @@ static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
                        char *text = NULL;
 
                        if (o->off1) {
-                               char **p = td_var(to, o->off1);
+                               char **p;
+
+                               if (o->prof_opts)
+                                       p = td_var(o->prof_opts, o->off1);
+                               else
+                                       p = td_var(to, o->off1);
 
                                text = *p;
                        }
@@ -961,7 +986,13 @@ static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
                char *text = NULL;
 
                if (o->off1) {
-                       char **p = td_var(to, o->off1);
+                       char **p;
+
+                       if (o->prof_opts)
+                               p = td_var(o->prof_opts, o->off1);
+                       else
+                               p = td_var(to, o->off1);
+
                        text = *p;
                }
 
@@ -983,10 +1014,19 @@ static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
                break;
        case FIO_OPT_RANGE: {
                struct gopt_range *r;
-               unsigned int *ip[4] = { td_var(to, o->off1),
-                                       td_var(to, o->off2),
-                                       td_var(to, o->off3),
-                                       td_var(to, o->off4) };
+               unsigned int *ip[4];
+
+               if (o->prof_opts) {
+                       ip[0] = td_var(o->prof_opts, o->off1);
+                       ip[1] = td_var(o->prof_opts, o->off2);
+                       ip[2] = td_var(o->prof_opts, o->off3);
+                       ip[3] = td_var(o->prof_opts, o->off4);
+               } else {
+                       ip[0] = td_var(to, o->off1);
+                       ip[1] = td_var(to, o->off2);
+                       ip[2] = td_var(to, o->off3);
+                       ip[3] = td_var(to, o->off4);
+               }
 
                r = container_of(gopt, struct gopt_range, gopt);
                gopt_int_range_set_val(r, *ip);
@@ -1013,8 +1053,12 @@ static void gopt_add_option(struct gopt_job_view *gjv, GtkWidget *hbox,
        case FIO_OPT_STR_VAL: {
                unsigned long long *ullp = NULL;
 
-               if (o->off1)
-                       ullp = td_var(to, o->off1);
+               if (o->off1) {
+                       if (o->prof_opts)
+                               ullp = td_var(o->prof_opts, o->off1);
+                       else
+                               ullp = td_var(to, o->off1);
+               }
 
                go = gopt_new_str_val(gjv, o, ullp, opt_index);
                break;
@@ -1022,8 +1066,12 @@ static void gopt_add_option(struct gopt_job_view *gjv, GtkWidget *hbox,
        case FIO_OPT_STR_VAL_TIME: {
                unsigned long long *ullp = NULL;
 
-               if (o->off1)
-                       ullp = td_var(to, o->off1);
+               if (o->off1) {
+                       if (o->prof_opts)
+                               ullp = td_var(o->prof_opts, o->off1);
+                       else
+                               ullp = td_var(to, o->off1);
+               }
 
                go = gopt_new_ullong(gjv, o, ullp, opt_index);
                break;
@@ -1032,15 +1080,23 @@ static void gopt_add_option(struct gopt_job_view *gjv, GtkWidget *hbox,
                if (o->posval[0].ival) {
                        unsigned int *ip = NULL;
 
-                       if (o->off1)
-                               ip = td_var(to, o->off1);
+                       if (o->off1) {
+                               if (o->prof_opts)
+                                       ip = td_var(o->prof_opts, o->off1);
+                               else
+                                       ip = td_var(to, o->off1);
+                       }
 
                        go = gopt_new_combo_int(gjv, o, ip, opt_index);
                } else {
                        unsigned int *ip = NULL;
 
-                       if (o->off1)
-                               ip = td_var(to, o->off1);
+                       if (o->off1) {
+                               if (o->prof_opts)
+                                       ip = td_var(o->prof_opts, o->off1);
+                               else
+                                       ip = td_var(to, o->off1);
+                       }
 
                        go = gopt_new_int(gjv, o, ip, opt_index);
                }
@@ -1049,8 +1105,12 @@ static void gopt_add_option(struct gopt_job_view *gjv, GtkWidget *hbox,
        case FIO_OPT_BOOL: {
                unsigned int *ip = NULL;
 
-               if (o->off1)
-                       ip = td_var(to, o->off1);
+               if (o->off1) {
+                       if (o->prof_opts)
+                               ip = td_var(o->prof_opts, o->off1);
+                       else
+                               ip = td_var(to, o->off1);
+               }
 
                go = gopt_new_bool(gjv, o, ip, opt_index);
                break;
@@ -1059,8 +1119,12 @@ static void gopt_add_option(struct gopt_job_view *gjv, GtkWidget *hbox,
                if (o->posval[0].ival) {
                        unsigned int *ip = NULL;
 
-                       if (o->off1)
-                               ip = td_var(to, o->off1);
+                       if (o->off1) {
+                               if (o->prof_opts)
+                                       ip = td_var(o->prof_opts, o->off1);
+                               else
+                                       ip = td_var(to, o->off1);
+                       }
 
                        go = gopt_new_combo_int(gjv, o, ip, opt_index);
                } else {
@@ -1074,7 +1138,13 @@ static void gopt_add_option(struct gopt_job_view *gjv, GtkWidget *hbox,
                char *text = NULL;
 
                if (o->off1) {
-                       char **p = td_var(to, o->off1);
+                       char **p;
+
+                       if (o->prof_opts)
+                               p = td_var(o->prof_opts, o->off1);
+                       else
+                               p = td_var(to, o->off1);
+
                        text = *p;
                }
 
@@ -1090,10 +1160,19 @@ static void gopt_add_option(struct gopt_job_view *gjv, GtkWidget *hbox,
                go = gopt_new_str_multi(gjv, o, opt_index);
                break;
        case FIO_OPT_RANGE: {
-               unsigned int *ip[4] = { td_var(to, o->off1),
-                                       td_var(to, o->off2),
-                                       td_var(to, o->off3),
-                                       td_var(to, o->off4) };
+               unsigned int *ip[4];
+
+               if (o->prof_opts) {
+                       ip[0] = td_var(o->prof_opts, o->off1);
+                       ip[1] = td_var(o->prof_opts, o->off2);
+                       ip[2] = td_var(o->prof_opts, o->off3);
+                       ip[3] = td_var(o->prof_opts, o->off4);
+               } else {
+                       ip[0] = td_var(to, o->off1);
+                       ip[1] = td_var(to, o->off2);
+                       ip[2] = td_var(to, o->off3);
+                       ip[3] = td_var(to, o->off4);
+               }
 
                go = gopt_new_int_range(gjv, o, ip, opt_index);
                break;
@@ -1203,12 +1282,17 @@ static void gopt_handle_str_multi_changed(struct gopt_job_view *gjv,
                                          struct gopt_str_multi *m,
                                          struct fio_option *o)
 {
-       unsigned int *ip = td_var(gjv->o, o->off1);
        struct value_pair *vp;
+       unsigned int *ip;
        gboolean set;
        guint val = 0;
        int i;
 
+       if (o->prof_opts)
+               ip = td_var(o->prof_opts, o->off1);
+       else
+               ip = td_var(gjv->o, o->off1);
+
        i = 0;
        vp = &o->posval[0];
        while (vp->ival) {
@@ -1233,13 +1317,22 @@ static void gopt_handle_range_changed(struct gopt_job_view *gjv,
                                      struct gopt_range *r,
                                      struct fio_option *o)
 {
-       unsigned int *ip[4] = { td_var(gjv->o, o->off1),
-                               td_var(gjv->o, o->off2),
-                               td_var(gjv->o, o->off3),
-                               td_var(gjv->o, o->off4) };
+       unsigned int *ip[4];
        gint val;
        int i;
 
+       if (o->prof_opts) {
+               ip[0] = td_var(o->prof_opts, o->off1);
+               ip[1] = td_var(o->prof_opts, o->off2);
+               ip[2] = td_var(o->prof_opts, o->off3);
+               ip[3] = td_var(o->prof_opts, o->off4);
+       } else {
+               ip[0] = td_var(gjv->o, o->off1);
+               ip[1] = td_var(gjv->o, o->off2);
+               ip[2] = td_var(gjv->o, o->off3);
+               ip[3] = td_var(gjv->o, o->off4);
+       }
+
        for (i = 0; i < GOPT_RANGE_SPIN; i++) {
                val = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(r->spins[i]));
                *ip[i] = val;
@@ -1250,10 +1343,15 @@ static void gopt_handle_str_val_changed(struct gopt_job_view *gjv,
                                        struct gopt_str_val *s,
                                        struct fio_option *o)
 {
-       unsigned long long *ullp = td_var(gjv->o, o->off1);
+       unsigned long long *ullp;
        GtkAdjustment *adj;
        gint index;
 
+       if (o->prof_opts)
+               ullp = td_var(o->prof_opts, o->off1);
+       else
+               ullp = td_var(gjv->o, o->off1);
+
        if (!ullp)
                return;
 
@@ -1274,7 +1372,12 @@ static void gopt_handle_str_val_changed(struct gopt_job_view *gjv,
 static void gopt_handle_str_changed(struct gopt_job_view *gjv,
                                    struct gopt_str *s, struct fio_option *o)
 {
-       char **p = td_var(gjv->o, o->off1);
+       char **p;
+
+       if (o->prof_opts)
+               p = td_var(o->prof_opts, o->off1);
+       else
+               p = td_var(gjv->o, o->off1);
 
        if (*p)
                free(*p);
@@ -1285,9 +1388,14 @@ static void gopt_handle_str_changed(struct gopt_job_view *gjv,
 static void gopt_handle_bool_changed(struct gopt_job_view *gjv,
                                     struct gopt_bool *b, struct fio_option *o)
 {
-       unsigned int *ip = td_var(gjv->o, o->off1);
+       unsigned int *ip;
        gboolean set;
 
+       if (o->prof_opts)
+               ip = td_var(o->prof_opts, o->off1);
+       else
+               ip = td_var(gjv->o, o->off1);
+
        set = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b->check));
        *ip = set;
 }
@@ -1295,10 +1403,15 @@ static void gopt_handle_bool_changed(struct gopt_job_view *gjv,
 static void gopt_handle_int_changed(struct gopt_job_view *gjv,
                                    struct gopt_int *i, struct fio_option *o)
 {
-       unsigned int *ip = td_var(gjv->o, o->off1);
        GtkAdjustment *adj;
+       unsigned int *ip;
        guint val;
 
+       if (o->prof_opts)
+               ip = td_var(o->prof_opts, o->off1);
+       else
+               ip = td_var(gjv->o, o->off1);
+
        adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(i->spin));
        val = gtk_adjustment_get_value(adj);
        *ip = val;
@@ -1308,7 +1421,12 @@ static void gopt_handle_combo_str_changed(struct gopt_job_view *gjv,
                                          struct gopt_combo *c,
                                          struct fio_option *o)
 {
-       char **p = td_var(gjv->o, o->off1);
+       char **p;
+
+       if (o->prof_opts)
+               p = td_var(o->prof_opts, o->off1);
+       else
+               p = td_var(gjv->o, o->off1);
 
        if (*p)
                free(*p);
@@ -1320,9 +1438,14 @@ static void gopt_handle_combo_int_changed(struct gopt_job_view *gjv,
                                          struct gopt_combo *c,
                                          struct fio_option *o)
 {
-       unsigned int *ip = td_var(gjv->o, o->off1);
+       unsigned int *ip;
        gint index;
 
+       if (o->prof_opts)
+               ip = td_var(o->prof_opts, o->off1);
+       else
+               ip = td_var(gjv->o, o->off1);
+
        index = gtk_combo_box_get_active(GTK_COMBO_BOX(c->combo));
        *ip = o->posval[index].oval;
 }