X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=session.c;h=2c2f478365469effabd1c3513c2ef76de606127c;hp=0011445df9ebd2dd2281cb2610b21b9cbeca79e3;hb=27d310f019395f2e4d5615b3f88b7255655a8039;hpb=24bd9719166584e3b4e6e6423d6d6bcbc1a88251 diff --git a/session.c b/session.c index 0011445..2c2f478 100644 --- 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; }