input/csv: add channel list checks for file re-read

Do for the CSV input module what commit 08f8421a9e did for VCD. Check
the channel list for consistency across re-imports of the same file.
This addresses the CSV part of bug #1241.
This commit is contained in:
Gerhard Sittig 2018-10-28 08:51:27 +01:00
parent 539188e524
commit affaf54012
1 changed files with 47 additions and 0 deletions

View File

@ -167,6 +167,9 @@ struct context {
/* Current line number. */
size_t line_number;
/* List of previously created sigrok channels. */
GSList *prev_sr_channels;
};
static void strip_comment(char *buf, const GString *prefix)
@ -504,6 +507,44 @@ static int init(struct sr_input *in, GHashTable *options)
return SR_OK;
}
/*
* Check the channel list for consistency across file re-import. See
* the VCD input module for more details and motivation.
*/
static void keep_header_for_reread(const struct sr_input *in)
{
struct context *inc;
inc = in->priv;
g_slist_free_full(inc->prev_sr_channels, sr_channel_free_cb);
inc->prev_sr_channels = in->sdi->channels;
in->sdi->channels = NULL;
}
static int check_header_in_reread(const struct sr_input *in)
{
struct context *inc;
if (!in)
return FALSE;
inc = in->priv;
if (!inc)
return FALSE;
if (!inc->prev_sr_channels)
return TRUE;
if (sr_channel_lists_differ(inc->prev_sr_channels, in->sdi->channels)) {
sr_err("Channel list change not supported for file re-read.");
return FALSE;
}
g_slist_free_full(in->sdi->channels, sr_channel_free_cb);
in->sdi->channels = inc->prev_sr_channels;
inc->prev_sr_channels = NULL;
return TRUE;
}
static const char *delim_set = "\r\n";
static const char *get_line_termination(GString *buf)
@ -615,6 +656,10 @@ static int initial_parse(const struct sr_input *in, GString *buf)
sr_channel_new(in->sdi, i, SR_CHANNEL_LOGIC, TRUE, channel_name->str);
}
g_string_free(channel_name, TRUE);
if (!check_header_in_reread(in)) {
ret = SR_ERR_DATA;
goto out;
}
/*
* Calculate the minimum buffer size to store the set of samples
@ -887,6 +932,8 @@ static void cleanup(struct sr_input *in)
{
struct context *inc;
keep_header_for_reread(in);
inc = in->priv;
g_free(inc->termination);