X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Finput%2Fvcd.c;h=66f126b422ed8c0f1521b14d0dcf324813b34459;hb=refs%2Fheads%2Flibsigrok-0.4.x;hp=47511c416ee90be723e6a20bcde6660ac37dd01b;hpb=36dacf17bc5fe333c6557d073011e2033b6f544f;p=libsigrok.git diff --git a/src/input/vcd.c b/src/input/vcd.c index 47511c41..66f126b4 100644 --- a/src/input/vcd.c +++ b/src/input/vcd.c @@ -67,7 +67,6 @@ #define LOG_PREFIX "input/vcd" -#define DEFAULT_NUM_CHANNELS 8 #define CHUNKSIZE (1024 * 1024) struct context { @@ -219,7 +218,7 @@ static gboolean parse_header(const struct sr_input *in, GString *buf) 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) + else if (inc->maxchannels && inc->channelcount >= inc->maxchannels) sr_warn("Skipping '%s%s' because only %d channels requested.", parts[3], parts[4] ? : "", inc->maxchannels); else { @@ -233,8 +232,8 @@ static gboolean parse_header(const struct sr_input *in, GString *buf) sr_info("Channel %d is '%s' identified by '%s'.", inc->channelcount, vcd_ch->name, vcd_ch->identifier); + sr_channel_new(in->sdi, inc->channelcount++, SR_CHANNEL_LOGIC, TRUE, vcd_ch->name); inc->channels = g_slist_append(inc->channels, vcd_ch); - inc->channelcount++; } g_strfreev(parts); @@ -428,14 +427,28 @@ static void parse_contents(const struct sr_input *in, char *data) inc->skip_until_end = TRUE; break; } - } else if (strchr("bBrR", tokens[i][0]) != NULL) { - sr_dbg("Vector values not supported yet"); + } else if (strchr("rR", tokens[i][0]) != NULL) { + sr_dbg("Real type vector values not supported yet!"); if (!tokens[++i]) /* No tokens left, bail out */ break; else /* Process next token */ continue; + } else if (strchr("bB", tokens[i][0]) != NULL) { + bit = (tokens[i][1] == '1'); + + /* + * Bail out if a) char after 'b' is NUL, or b) there is + * a second character after 'b', or c) there is no + * identifier. + */ + if (!tokens[i][1] || tokens[i][2] || !tokens[++i]) { + sr_dbg("Unexpected vector format!"); + break; + } + + process_bit(inc, tokens[i], bit); } else if (strchr("01xXzZ", tokens[i][0]) != NULL) { char *identifier; @@ -465,18 +478,11 @@ static void parse_contents(const struct sr_input *in, char *data) static int init(struct sr_input *in, GHashTable *options) { - int num_channels, i; - char name[16]; struct context *inc; - num_channels = g_variant_get_int32(g_hash_table_lookup(options, "numchannels")); - if (num_channels < 1) { - sr_err("Invalid value for numchannels: must be at least 1."); - return SR_ERR_ARG; - } inc = in->priv = g_malloc0(sizeof(struct context)); - inc->maxchannels = num_channels; + inc->maxchannels = g_variant_get_int32(g_hash_table_lookup(options, "numchannels")); inc->downsample = g_variant_get_int32(g_hash_table_lookup(options, "downsample")); if (inc->downsample < 1) inc->downsample = 1; @@ -490,11 +496,6 @@ static int init(struct sr_input *in, GHashTable *options) inc->buffer = g_malloc(CHUNKSIZE); - for (i = 0; i < num_channels; i++) { - snprintf(name, 16, "%d", i); - sr_channel_new(in->sdi, i, SR_CHANNEL_LOGIC, TRUE, name); - } - return SR_OK; } @@ -622,7 +623,7 @@ static struct sr_option options[] = { static const struct sr_option *get_options(void) { if (!options[0].def) { - options[0].def = g_variant_ref_sink(g_variant_new_int32(DEFAULT_NUM_CHANNELS)); + options[0].def = g_variant_ref_sink(g_variant_new_int32(0)); options[1].def = g_variant_ref_sink(g_variant_new_int32(-1)); options[2].def = g_variant_ref_sink(g_variant_new_int32(1)); options[3].def = g_variant_ref_sink(g_variant_new_int32(0));