]> sigrok.org Git - sigrok-cli.git/blobdiff - parsers.c
doc: update sigrok-cli(1) for channel assignment to decoder inputs
[sigrok-cli.git] / parsers.c
index d92218f8664ed5a8858e32a6b631b8d4c68633aa..2aacefb089f184eeb18dfb8d5be8855dc5623811 100644 (file)
--- a/parsers.c
+++ b/parsers.c
@@ -25,7 +25,8 @@
 #include <glib.h>
 #include "sigrok-cli.h"
 
-struct sr_channel *find_channel(GSList *channellist, const char *channelname)
+struct sr_channel *find_channel(GSList *channellist, const char *channelname,
+       gboolean exact_case)
 {
        struct sr_channel *ch;
        GSList *l;
@@ -33,8 +34,13 @@ struct sr_channel *find_channel(GSList *channellist, const char *channelname)
        ch = NULL;
        for (l = channellist; l; l = l->next) {
                ch = l->data;
-               if (!strcmp(ch->name, channelname))
-                       break;
+               if (exact_case) {
+                       if (strcmp(ch->name, channelname) == 0)
+                               break;
+               } else {
+                       if (g_ascii_strcasecmp(ch->name, channelname) == 0)
+                               break;
+               }
        }
        ch = l ? l->data : NULL;
 
@@ -105,7 +111,7 @@ GSList *parse_channelstring(struct sr_dev_inst *sdi, const char *channelstring)
                                        ret = SR_ERR;
                                        break;
                                }
-                               ch = find_channel(channels, str);
+                               ch = find_channel(channels, str, TRUE);
                                if (!ch) {
                                        g_critical("unknown channel '%d'.", b);
                                        ret = SR_ERR;
@@ -130,7 +136,7 @@ range_fail:
                                break;
                        }
 
-                       ch = find_channel(channels, names[0]);
+                       ch = find_channel(channels, names[0], TRUE);
                        if (!ch) {
                                g_critical("unknown channel '%s'.", names[0]);
                                g_strfreev(names);
@@ -139,8 +145,7 @@ range_fail:
                        }
                        if (names[1]) {
                                /* Rename channel. */
-                               g_free(ch->name);
-                               ch->name = g_strdup(names[1]);
+                               sr_dev_channel_name_set(ch, names[1]);
                        }
                        channellist = g_slist_append(channellist, ch);
 
@@ -365,6 +370,8 @@ GHashTable *parse_generic_arg(const char *arg,
                i++;
        }
        for (; elements[i]; i++) {
+               if (!elements[i][0])
+                       continue;
                split_key_value(elements[i], &k, &v);
                k = g_strdup(k);
                v = v ? g_strdup(v) : NULL;
@@ -444,11 +451,11 @@ GHashTable *generic_arg_to_opt(const struct sr_option **opts, GHashTable *genarg
                        g_hash_table_insert(hash, g_strdup(opts[i]->id),
                                        g_variant_ref_sink(gvar));
                } else if (g_variant_is_of_type(opts[i]->def, G_VARIANT_TYPE_INT32)) {
-                       gvar = g_variant_new_int32(strtoul(s, NULL, 10));
+                       gvar = g_variant_new_int32(strtol(s, NULL, 10));
                        g_hash_table_insert(hash, g_strdup(opts[i]->id),
                                        g_variant_ref_sink(gvar));
                } else if (g_variant_is_of_type(opts[i]->def, G_VARIANT_TYPE_UINT64)) {
-                       gvar = g_variant_new_uint64(strtoul(s, NULL, 10));
+                       gvar = g_variant_new_uint64(strtoull(s, NULL, 10));
                        g_hash_table_insert(hash, g_strdup(opts[i]->id),
                                        g_variant_ref_sink(gvar));
                } else if (g_variant_is_of_type(opts[i]->def, G_VARIANT_TYPE_DOUBLE)) {