]> sigrok.org Git - sigrok-cli.git/blobdiff - session.c
opt_to_gvar: notify the user in case of invalid values for --config
[sigrok-cli.git] / session.c
index 0011445df9ebd2dd2281cb2610b21b9cbeca79e3..2c2f478365469effabd1c3513c2ef76de606127c 100644 (file)
--- a/session.c
+++ b/session.c
@@ -326,7 +326,9 @@ int opt_to_gvar(char *key, char *value, struct sr_config *src)
        double tmp_double, dlow, dhigh;
        uint64_t tmp_u64, p, q, low, high;
        GVariant *rational[2], *range[2];
+       GVariantBuilder *vbl;
        gboolean tmp_bool;
+       gchar **keyval;
        int ret;
 
        if (!(srci = sr_config_info_name_get(key))) {
@@ -335,7 +337,7 @@ int opt_to_gvar(char *key, char *value, struct sr_config *src)
        }
        src->key = srci->key;
 
-       if ((value == NULL) &&
+       if ((value == NULL || strlen(value) == 0) &&
                (srci->datatype != SR_T_BOOL)) {
                g_critical("Option '%s' needs a value.", (char *)key);
                return -1;
@@ -403,10 +405,30 @@ int opt_to_gvar(char *key, char *value, struct sr_config *src)
                        src->data = g_variant_new_tuple(range, 2);
                }
                break;
+       case SR_T_KEYVALUE:
+               /* Expects the argument to be in the form of key=value. */
+               keyval = g_strsplit(value, "=", 2);
+               if (!keyval[0] || !keyval[1]) {
+                       g_strfreev(keyval);
+                       ret = -1;
+                       break;
+               } else {
+                       vbl = g_variant_builder_new(G_VARIANT_TYPE_DICTIONARY);
+                       g_variant_builder_add(vbl, "{ss}",
+                                             keyval[0], keyval[1]);
+                       src->data = g_variant_builder_end(vbl);
+                       g_strfreev(keyval);
+               }
+               break;
        default:
+               g_critical("Unknown data type specified for option '%s' "
+                          "(driver implementation bug?).", key);
                ret = -1;
        }
 
+       if (ret < 0)
+               g_critical("Invalid value: '%s' for option '%s'", value, key);
+
        return ret;
 }