Merge branch 'expression-parser'
[fio.git] / goptions.c
index b78accdaf3a141a7258680994cfe4f0b73f608a0..c01b6cc7d8f835bd3113a8601dc0404aaff50911 100644 (file)
@@ -874,7 +874,7 @@ static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
                struct gopt_str_val *g;
 
                if (o->off1)
-                       ullp = td_var(to, o->off1);
+                       ullp = td_var(to, o, o->off1);
 
                g = container_of(gopt, struct gopt_str_val, gopt);
                if (ullp)
@@ -886,32 +886,43 @@ static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
                struct gopt_int *i;
 
                if (o->off1)
-                       ullp = td_var(to, o->off1);
+                       ullp = td_var(to, o, o->off1);
 
                i = container_of(gopt, struct gopt_int, gopt);
                if (ullp)
                        gopt_int_set_val(i, *ullp);
                break;
                }
-       case FIO_OPT_INT: {
-               unsigned int *ip = NULL;
-               struct gopt_int *i;
+       case FIO_OPT_INT:
+               if (o->posval[0].ival) {
+                       unsigned int *ip = NULL;
+                       struct gopt_combo *c;
 
-               if (o->off1)
-                       ip = td_var(to, o->off1);
+                       if (o->off1)
+                               ip = td_var(to, o, o->off1);
 
-               i = container_of(gopt, struct gopt_int, gopt);
-               if (ip)
-                       gopt_int_set_val(i, *ip);
-               break;
+                       c = container_of(gopt, struct gopt_combo, gopt);
+                       if (ip)
+                               gopt_combo_int_set_val(c, *ip);
+               } else {
+                       unsigned int *ip = NULL;
+                       struct gopt_int *i;
+
+                       if (o->off1)
+                               ip = td_var(to, o, o->off1);
+
+                       i = container_of(gopt, struct gopt_int, gopt);
+                       if (ip)
+                               gopt_int_set_val(i, *ip);
                }
+               break;
        case FIO_OPT_STR_SET:
        case FIO_OPT_BOOL: {
                unsigned int *ip = NULL;
                struct gopt_bool *b;
 
                if (o->off1)
-                       ip = td_var(to, o->off1);
+                       ip = td_var(to, o, o->off1);
 
                b = container_of(gopt, struct gopt_bool, gopt);
                if (ip)
@@ -924,7 +935,7 @@ static void gopt_set_option(struct gopt_job_view *gjv, struct fio_option *o,
                        struct gopt_combo *c;
 
                        if (o->off1)
-                               ip = td_var(to, o->off1);
+                               ip = td_var(to, o, o->off1);
 
                        c = container_of(gopt, struct gopt_combo, gopt);
                        if (ip)
@@ -934,7 +945,7 @@ 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 = td_var(to, o, o->off1);
 
                                text = *p;
                        }
@@ -950,7 +961,7 @@ 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 = td_var(to, o, o->off1);
                        text = *p;
                }
 
@@ -972,10 +983,10 @@ 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] = { td_var(to, o, o->off1),
+                                       td_var(to, o, o->off2),
+                                       td_var(to, o, o->off3),
+                                       td_var(to, o, o->off4) };
 
                r = container_of(gopt, struct gopt_range, gopt);
                gopt_int_range_set_val(r, *ip);
@@ -1003,7 +1014,7 @@ static void gopt_add_option(struct gopt_job_view *gjv, GtkWidget *hbox,
                unsigned long long *ullp = NULL;
 
                if (o->off1)
-                       ullp = td_var(to, o->off1);
+                       ullp = td_var(to, o, o->off1);
 
                go = gopt_new_str_val(gjv, o, ullp, opt_index);
                break;
@@ -1012,26 +1023,34 @@ static void gopt_add_option(struct gopt_job_view *gjv, GtkWidget *hbox,
                unsigned long long *ullp = NULL;
 
                if (o->off1)
-                       ullp = td_var(to, o->off1);
+                       ullp = td_var(to, o, o->off1);
 
                go = gopt_new_ullong(gjv, o, ullp, opt_index);
                break;
                }
-       case FIO_OPT_INT: {
-               unsigned int *ip = NULL;
+       case FIO_OPT_INT:
+               if (o->posval[0].ival) {
+                       unsigned int *ip = NULL;
 
-               if (o->off1)
-                       ip = td_var(to, o->off1);
+                       if (o->off1)
+                               ip = td_var(to, o, o->off1);
 
-               go = gopt_new_int(gjv, o, ip, opt_index);
-               break;
+                       go = gopt_new_combo_int(gjv, o, ip, opt_index);
+               } else {
+                       unsigned int *ip = NULL;
+
+                       if (o->off1)
+                               ip = td_var(to, o, o->off1);
+
+                       go = gopt_new_int(gjv, o, ip, opt_index);
                }
+               break;
        case FIO_OPT_STR_SET:
        case FIO_OPT_BOOL: {
                unsigned int *ip = NULL;
 
                if (o->off1)
-                       ip = td_var(to, o->off1);
+                       ip = td_var(to, o, o->off1);
 
                go = gopt_new_bool(gjv, o, ip, opt_index);
                break;
@@ -1041,7 +1060,7 @@ static void gopt_add_option(struct gopt_job_view *gjv, GtkWidget *hbox,
                        unsigned int *ip = NULL;
 
                        if (o->off1)
-                               ip = td_var(to, o->off1);
+                               ip = td_var(to, o, o->off1);
 
                        go = gopt_new_combo_int(gjv, o, ip, opt_index);
                } else {
@@ -1055,7 +1074,7 @@ 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 = td_var(to, o, o->off1);
                        text = *p;
                }
 
@@ -1071,10 +1090,10 @@ 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] = { td_var(to, o, o->off1),
+                                       td_var(to, o, o->off2),
+                                       td_var(to, o, o->off3),
+                                       td_var(to, o, o->off4) };
 
                go = gopt_new_int_range(gjv, o, ip, opt_index);
                break;
@@ -1184,7 +1203,7 @@ 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);
+       unsigned int *ip = td_var(gjv->o, o, o->off1);
        struct value_pair *vp;
        gboolean set;
        guint val = 0;
@@ -1197,7 +1216,7 @@ static void gopt_handle_str_multi_changed(struct gopt_job_view *gjv,
                        break;
                set = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m->checks[i]));
                if (set) {
-                       if (vp->or)
+                       if (vp->orval)
                                val |= vp->oval;
                        else
                                val = vp->oval;
@@ -1214,10 +1233,10 @@ 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] = { td_var(gjv->o, o, o->off1),
+                               td_var(gjv->o, o, o->off2),
+                               td_var(gjv->o, o, o->off3),
+                               td_var(gjv->o, o, o->off4) };
        gint val;
        int i;
 
@@ -1231,7 +1250,7 @@ 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 = td_var(gjv->o, o, o->off1);
        GtkAdjustment *adj;
        gint index;
 
@@ -1255,7 +1274,7 @@ 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 = td_var(gjv->o, o, o->off1);
 
        if (*p)
                free(*p);
@@ -1266,7 +1285,7 @@ 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 = td_var(gjv->o, o, o->off1);
        gboolean set;
 
        set = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b->check));
@@ -1276,7 +1295,7 @@ 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);
+       unsigned int *ip = td_var(gjv->o, o, o->off1);
        GtkAdjustment *adj;
        guint val;
 
@@ -1289,7 +1308,7 @@ 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 = td_var(gjv->o, o, o->off1);
 
        if (*p)
                free(*p);
@@ -1301,7 +1320,7 @@ 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 = td_var(gjv->o, o, o->off1);
        gint index;
 
        index = gtk_combo_box_get_active(GTK_COMBO_BOX(c->combo));
@@ -1371,8 +1390,8 @@ static void gopt_handle_changed(struct gopt *gopt)
                break;
                }
        default:
-               log_err("gfio: bad option type %s/%d\n", gopt->opt_type);
-               return;
+               log_err("gfio: bad option type%d\n", gopt->opt_type);
+               break;
        }
 }
 
@@ -1414,7 +1433,7 @@ static int gopt_handle_changed_options(struct gopt_job_view *gjv)
                goto done;
 
        while (!flist_empty(&gjv->changed_list)) {
-               gopt = flist_entry(gjv->changed_list.next, struct gopt, changed_list);
+               gopt = flist_first_entry(&gjv->changed_list, struct gopt, changed_list);
                flist_del_init(&gopt->changed_list);
        }
 
@@ -1558,7 +1577,7 @@ void gopt_get_options_window(GtkWidget *window, struct gfio_client *gc)
 
        gjv = calloc(1, sizeof(*gjv));
        INIT_FLIST_HEAD(&gjv->changed_list);
-       gco = flist_entry(gc->o_list.next, struct gfio_client_options, list);
+       gco = flist_first_entry(&gc->o_list, struct gfio_client_options, list);
        gjv->o = &gco->o;
        gjv->dialog = dialog;
        gjv->client = gc;