]> sigrok.org Git - libsigrok.git/commitdiff
input/csv: fixup input file line number handling
authorGerhard Sittig <redacted>
Tue, 15 Oct 2019 19:43:55 +0000 (21:43 +0200)
committerGerhard Sittig <redacted>
Sat, 21 Dec 2019 17:20:04 +0000 (18:20 +0100)
The previous implementation allowed CSV input files to use any line
termination in either CR only, LF only, or CR/LF format. The first EOL
was searched for and was recorded, but then was not used. Instead any of
CR or LF were considered a line termination. "Raw data processing" still
was correct, but line numbers in diagnostics were way off, and optional
features like skipping first N lines were not effective. Fix that.

Source code inspection suggests the "startline" feature did not work at
all. The user provided number was used in the initial optional search
for the header line (to get signal names) or auto-determination of the
number of columns. But then was not used when the file actually got
processed.

src/input/csv.c

index 4fc35adbc0997cc8e4ad7c30bf3c71c3a979158e..88c49c43f19456df83dac61a85e118fc18c2233c 100644 (file)
@@ -685,7 +685,10 @@ static int initial_parse(const struct sr_input *in, GString *buf)
        columns = NULL;
 
        line_number = 0;
-       lines = g_strsplit_set(buf->str, delim_set, 0);
+       if (inc->termination)
+               lines = g_strsplit(buf->str, inc->termination, 0);
+       else
+               lines = g_strsplit_set(buf->str, delim_set, 0);
        for (line_idx = 0; (line = lines[line_idx]); line_idx++) {
                line_number++;
                if (inc->start_line > line_number) {
@@ -914,9 +917,13 @@ static int process_buffer(struct sr_input *in, gboolean is_eof)
        g_strstrip(in->buf->str);
 
        ret = SR_OK;
-       lines = g_strsplit_set(in->buf->str, delim_set, 0);
+       lines = g_strsplit(in->buf->str, inc->termination, 0);
        for (line_idx = 0; (line = lines[line_idx]); line_idx++) {
                inc->line_number++;
+               if (inc->line_number < inc->start_line) {
+                       sr_spew("Line %zu skipped (before start).", inc->line_number);
+                       continue;
+               }
                if (line[0] == '\0') {
                        sr_spew("Blank line %zu skipped.", inc->line_number);
                        continue;