]> sigrok.org Git - libsigrok.git/commitdiff
input/csv: improve robustness of "use header for channel names"
authorGerhard Sittig <redacted>
Mon, 14 Oct 2019 17:33:29 +0000 (19:33 +0200)
committerGerhard Sittig <redacted>
Sat, 21 Dec 2019 17:20:04 +0000 (18:20 +0100)
Don't clobber the value of the user provided 'header' option. Use a
separate flag to track whether the header line was seen before, or
needs to get skipped when it passes by.

src/input/csv.c

index 8471462b4e512e9aee3a4df00446a18aaa0a4b85..546d0f3c0080f6bc65018420b92c28272f4fad25 100644 (file)
@@ -156,7 +156,8 @@ struct context {
         * Determines if the first line should be treated as header and used for
         * channel names in multi column mode.
         */
-       gboolean header;
+       gboolean use_header;
+       gboolean header_seen;
 
        /* Format sample data is stored in single column mode. */
        enum single_col_format format;
@@ -574,7 +575,7 @@ static int init(struct sr_input *in, GHashTable *options)
 
        inc->first_channel = g_variant_get_uint32(g_hash_table_lookup(options, "first-channel"));
 
-       inc->header = g_variant_get_boolean(g_hash_table_lookup(options, "header"));
+       inc->use_header = g_variant_get_boolean(g_hash_table_lookup(options, "header"));
 
        inc->start_line = g_variant_get_uint32(g_hash_table_lookup(options, "startline"));
        if (inc->start_line < 1) {
@@ -737,7 +738,7 @@ static int initial_parse(const struct sr_input *in, GString *buf)
        channel_name = g_string_sized_new(64);
        for (i = 0; i < inc->num_channels; i++) {
                column = columns[i];
-               if (inc->header && inc->multi_column_mode && column[0] != '\0')
+               if (inc->use_header && inc->multi_column_mode && column[0] != '\0')
                        g_string_assign(channel_name, column);
                else
                        g_string_printf(channel_name, "%zu", i);
@@ -892,9 +893,9 @@ static int process_buffer(struct sr_input *in, gboolean is_eof)
                }
 
                /* Skip the header line, its content was used as the channel names. */
-               if (inc->header) {
+               if (inc->use_header && !inc->header_seen) {
                        sr_spew("Header line %zu skipped.", inc->line_number);
-                       inc->header = FALSE;
+                       inc->header_seen = TRUE;
                        continue;
                }