X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Finput%2Fcsv.c;h=f4f11f25d18bd21287745620c3c61b93fce1cb3b;hb=b65630f78da2930fb828f6c6388c8655036fe8a4;hp=180ff3df264c6aaac50f43c69d1f710748e78115;hpb=4ab01c3564ddec604d0b6a9daf76fcba277da287;p=libsigrok.git diff --git a/src/input/csv.c b/src/input/csv.c index 180ff3df..f4f11f25 100644 --- a/src/input/csv.c +++ b/src/input/csv.c @@ -351,7 +351,7 @@ static int parse_single_column(const char *column, struct context *inc) res = SR_ERR; - switch(inc->format) { + switch (inc->format) { case FORMAT_BIN: res = parse_binstr(column, inc); break; @@ -393,7 +393,7 @@ static int init(struct sr_input *in, GHashTable *options) struct context *inc; const char *s; - in->sdi = sr_dev_inst_new(SR_ST_ACTIVE, NULL, NULL, NULL); + in->sdi = g_malloc0(sizeof(struct sr_dev_inst)); in->priv = inc = g_malloc0(sizeof(struct context)); inc->single_column = g_variant_get_int32(g_hash_table_lookup(options, "single-column")); @@ -454,9 +454,9 @@ static int init(struct sr_input *in, GHashTable *options) return SR_OK; } -static char *get_line_termination(GString *buf) +static const char *get_line_termination(GString *buf) { - char *term; + const char *term; term = NULL; if (g_strstr_len(buf->str, buf->len, "\r\n")) @@ -472,7 +472,6 @@ static char *get_line_termination(GString *buf) static int initial_parse(const struct sr_input *in, GString *buf) { struct context *inc; - struct sr_channel *ch; GString *channel_name; gsize num_columns, l, i; unsigned int line_number; @@ -558,8 +557,7 @@ static int initial_parse(const struct sr_input *in, GString *buf) g_string_assign(channel_name, columns[i]); else g_string_printf(channel_name, "%zu", i); - ch = sr_channel_new(i, SR_CHANNEL_LOGIC, TRUE, channel_name->str); - in->sdi->channels = g_slist_append(in->sdi->channels, ch); + sr_channel_new(in->sdi, i, SR_CHANNEL_LOGIC, TRUE, channel_name->str); } g_string_free(channel_name, TRUE); @@ -583,7 +581,8 @@ static int initial_receive(const struct sr_input *in) struct context *inc; GString *new_buf; int len, ret; - char *termination, *p; + char *p; + const char *termination; inc = in->priv; @@ -667,6 +666,13 @@ static int process_buffer(struct sr_input *in) continue; } + /* Skip the header line, its content was used as the channel names. */ + if (inc->header) { + sr_spew("Header line %zu skipped.", inc->line_number); + inc->header = FALSE; + continue; + } + if (!(columns = parse_line(lines[l], inc, max_columns))) { sr_err("Error while parsing line %zu.", inc->line_number); return SR_ERR; @@ -771,11 +777,8 @@ static void cleanup(struct sr_input *in) if (inc->comment) g_string_free(inc->comment, TRUE); - if (inc->termination) - g_free(inc->termination); - - if (inc->sample_buffer) - g_free(inc->sample_buffer); + g_free(inc->termination); + g_free(inc->sample_buffer); } static struct sr_option options[] = { @@ -812,6 +815,7 @@ SR_PRIV struct sr_input_module input_csv = { .id = "csv", .name = "CSV", .desc = "Comma-separated values", + .exts = (const char*[]){"csv", NULL}, .metadata = { SR_INPUT_META_MIMETYPE }, .options = get_options, .format_match = format_match,