X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Finput%2Fvcd.c;h=253e76f67d25a78a5b381a08e2cd841ca8bdc723;hb=3be42bc22f8b36599a448273c12a76d3e0f7a940;hp=214eb83235a43d38e150829f37073dc0c110a1f1;hpb=ab464eb3dc7fc9646592d882ca79aa0a8fa5101b;p=libsigrok.git diff --git a/src/input/vcd.c b/src/input/vcd.c index 214eb832..253e76f6 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 { @@ -106,6 +105,10 @@ static gboolean parse_section(GString *buf, gchar **name, gchar **contents) status = FALSE; pos = 0; + /* Skip UTF8 BOM */ + if (buf->len >= 3 && !strncmp(buf->str, "\xef\xbb\xbf", 3)) + pos = 3; + /* Skip any initial white-space. */ while (pos < buf->len && g_ascii_isspace(buf->str[pos])) pos++; @@ -219,7 +222,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 { @@ -480,16 +483,10 @@ static void parse_contents(const struct sr_input *in, char *data) static int init(struct sr_input *in, GHashTable *options) { struct context *inc; - int num_channels; - 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; @@ -585,7 +582,6 @@ static int receive(struct sr_input *in, GString *buf) static int end(struct sr_input *in) { - struct sr_datafeed_packet packet; struct context *inc; int ret; @@ -599,10 +595,8 @@ static int end(struct sr_input *in) /* Send any samples that haven't been sent yet. */ send_buffer(in); - if (inc->started) { - packet.type = SR_DF_END; - sr_session_send(in->sdi, &packet); - } + if (inc->started) + std_session_send_df_end(in->sdi, LOG_PREFIX); return ret; } @@ -630,7 +624,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));