]> sigrok.org Git - libsigrok.git/blobdiff - src/input/vcd.c
input: vcd: try to continue when a vector was found
[libsigrok.git] / src / input / vcd.c
index 0cf495e181116abb99e7a0581ceaa4ff4a6f414e..6f84f659c05b32ef3252871413859ccfb1cc7d92 100644 (file)
@@ -206,25 +206,33 @@ static gboolean parse_header(const struct sr_input *in, GString *buf)
                                sr_err("Parsing timescale failed.");
                        }
                } else if (g_strcmp0(name, "var") == 0) {
-                       /* Format: $var type size identifier reference $end */
+                       /* Format: $var type size identifier reference [opt. index] $end */
+                       unsigned int length;
+
                        parts = g_strsplit_set(contents, " \r\n\t", 0);
                        remove_empty_parts(parts);
+                       length = g_strv_length(parts);
 
-                       if (g_strv_length(parts) != 4)
-                               sr_warn("$var section should have 4 items");
+                       if (length != 4 && length != 5)
+                               sr_warn("$var section should have 4 or 5 items");
                        else if (g_strcmp0(parts[0], "reg") != 0 && g_strcmp0(parts[0], "wire") != 0)
                                sr_info("Unsupported signal type: '%s'", parts[0]);
                        else if (strtol(parts[1], NULL, 10) != 1)
                                sr_info("Unsupported signal size: '%s'", parts[1]);
                        else if (inc->channelcount >= inc->maxchannels)
-                               sr_warn("Skipping '%s' because only %d channels requested.",
-                                               parts[3], inc->maxchannels);
+                               sr_warn("Skipping '%s%s' because only %d channels requested.",
+                                       parts[3], parts[4] ? : "", inc->maxchannels);
                        else {
-                               sr_info("Channel %d is '%s' identified by '%s'.",
-                                               inc->channelcount, parts[3], parts[2]);
                                vcd_ch = g_malloc(sizeof(struct vcd_channel));
                                vcd_ch->identifier = g_strdup(parts[2]);
-                               vcd_ch->name = g_strdup(parts[3]);
+                               if (length == 4)
+                                       vcd_ch->name = g_strdup(parts[3]);
+                               else
+                                       vcd_ch->name = g_strconcat(parts[3], parts[4], NULL);
+
+                               sr_info("Channel %d is '%s' identified by '%s'.",
+                                               inc->channelcount, vcd_ch->name, vcd_ch->identifier);
+
                                inc->channels = g_slist_append(inc->channels, vcd_ch);
                                inc->channelcount++;
                        }
@@ -399,8 +407,13 @@ static void parse_contents(const struct sr_input *in, char *data)
                                break;
                        }
                } else if (strchr("bBrR", tokens[i][0]) != NULL) {
-                       /* A vector value, not supported yet. */
-                       break;
+                       sr_dbg("Vector values not supported yet");
+                       if (!tokens[++i])
+                               /* No tokens left, bail out */
+                               break;
+                       else
+                               /* Process next token */
+                               continue;
                } else if (strchr("01xXzZ", tokens[i][0]) != NULL) {
                        /* A new 1-bit sample value */
                        bit = (tokens[i][0] == '1');
@@ -410,9 +423,10 @@ static void parse_contents(const struct sr_input *in, char *data)
                         * there was whitespace after the bit, the next token.
                         */
                        if (tokens[i][1] == '\0') {
-                               if (!tokens[++i])
-                                       /* Missing identifier */
-                                       continue;
+                               if (!tokens[++i]) {
+                                       sr_dbg("Identifier missing!");
+                                       break;
+                               }
                        } else {
                                for (j = 1; tokens[i][j]; j++)
                                        tokens[i][j - 1] = tokens[i][j];
@@ -511,6 +525,7 @@ static int process_buffer(struct sr_input *in)
                src = sr_config_new(SR_CONF_SAMPLERATE, g_variant_new_uint64(samplerate));
                meta.config = g_slist_append(NULL, src);
                sr_session_send(in->sdi, &packet);
+               g_slist_free(meta.config);
                sr_config_free(src);
 
                inc->started = TRUE;