cli: more flexible generic arg parser
authorBert Vermeulen <bert@biot.com>
Sun, 15 Jul 2012 23:03:30 +0000 (01:03 +0200)
committerBert Vermeulen <bert@biot.com>
Fri, 3 Aug 2012 08:27:39 +0000 (10:27 +0200)
parsers.c
sigrok-cli.c
sigrok-cli.h

index 659bbad88dfca9bf8f4248309829126b4fbb1de3..65a265389f2d0dba79772b8e3cc3e19810bf12cf 100644 (file)
--- a/parsers.c
+++ b/parsers.c
@@ -96,7 +96,7 @@ char **parse_probestring(int max_probes, const char *probestring)
        return probelist;
 }
 
-GHashTable *parse_generic_arg(const char *arg)
+GHashTable *parse_generic_arg(const char *arg, gboolean sep_first)
 {
        GHashTable *hash;
        int i;
@@ -105,10 +105,14 @@ GHashTable *parse_generic_arg(const char *arg)
        if (!arg || !arg[0])
                return NULL;
 
-       hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+       i = 0;
+       hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+                       g_free, g_free);
        elements = g_strsplit(arg, ":", 0);
-       g_hash_table_insert(hash, g_strdup("sigrok_key"), g_strdup(elements[0]));
-       for (i = 1; elements[i]; i++) {
+       if (sep_first)
+               g_hash_table_insert(hash, g_strdup("sigrok_key"),
+                               g_strdup(elements[i++]));
+       for (; elements[i]; i++) {
                e = strchr(elements[i], '=');
                if (!e)
                        g_hash_table_insert(hash, g_strdup(elements[i]), NULL);
index a0e4f08aa1e99f219d7d4825a3d13a3756ac29fc..e31df93c0295a91624c673d39a39da330046e4f4 100644 (file)
@@ -700,7 +700,7 @@ static int register_pds(struct sr_dev *dev, const char *pdstring)
        pd_opthash = NULL;
        pdtokens = g_strsplit(pdstring, ",", 0);
        for (pdtok = pdtokens; *pdtok; pdtok++) {
-               if (!(pd_opthash = parse_generic_arg(*pdtok))) {
+               if (!(pd_opthash = parse_generic_arg(*pdtok, TRUE))) {
                        g_critical("Invalid protocol decoder option '%s'.", *pdtok);
                        goto err_out;
                }
@@ -868,7 +868,7 @@ int setup_output_format(void)
                default_output_format = TRUE;
        }
 
-       fmtargs = parse_generic_arg(opt_output_format);
+       fmtargs = parse_generic_arg(opt_output_format, TRUE);
        fmtspec = g_hash_table_lookup(fmtargs, "sigrok_key");
        if (!fmtspec) {
                g_critical("Invalid output format.");
index 75a29470accc49b9f86eb9675bab05016093490f..979b008b13472f977c010ee35c7667e1b1221be4 100644 (file)
@@ -26,7 +26,7 @@ int num_real_devs(void);
 /* parsers.c */
 char **parse_probestring(int max_probes, const char *probestring);
 char **sr_parse_triggerstring(struct sr_dev *dev, const char *triggerstring);
-GHashTable *parse_generic_arg(const char *arg);
+GHashTable *parse_generic_arg(const char *arg, gboolean sep_first);
 struct sr_dev *parse_devstring(const char *devstring);
 uint64_t sr_parse_timestring(const char *timestring);
 char *strcanon(const char *str);