Improve the code paths which determine logic channels' names from an
optional CSV file header line. Strip optional quotes from the column's
input text (re-use a SCPI helper routine for that). Also use the channel
name for multi-bit fields, append [0] etc suffixes in that case. Comment
on the manipulation of input data, which is acceptable since that very
data won't get processed another time in another code path.
#include <libsigrok/libsigrok.h>
#include "libsigrok-internal.h"
#include <libsigrok/libsigrok.h>
#include "libsigrok-internal.h"
+#include "scpi.h" /* String un-quote for channel name from header line. */
#define LOG_PREFIX "input/csv"
#define LOG_PREFIX "input/csv"
size_t line_number, line_idx;
int ret;
char **lines, *line, **columns, *column;
size_t line_number, line_idx;
int ret;
char **lines, *line, **columns, *column;
+ const char *col_caption;
+ gboolean got_caption;
const struct column_details *detail;
ret = SR_OK;
const struct column_details *detail;
ret = SR_OK;
* line (when requested by the user, and only works in multi
* column mode). In the absence of header text, or in single
* column mode, channels are assigned rather generic names.
* line (when requested by the user, and only works in multi
* column mode). In the absence of header text, or in single
* column mode, channels are assigned rather generic names.
+ *
+ * Manipulation of the column's caption is acceptable here, the
+ * header line will never get processed another time.
*/
channel_name = g_string_sized_new(64);
for (col_idx = 0; col_idx < inc->column_want_count; col_idx++) {
*/
channel_name = g_string_sized_new(64);
for (col_idx = 0; col_idx < inc->column_want_count; col_idx++) {
col_nr = col_idx + 1;
detail = lookup_column_details(inc, col_nr);
if (detail->text_format == FORMAT_NONE)
continue;
column = columns[col_idx];
col_nr = col_idx + 1;
detail = lookup_column_details(inc, col_nr);
if (detail->text_format == FORMAT_NONE)
continue;
column = columns[col_idx];
+ col_caption = sr_scpi_unquote_string(column);
+ got_caption = inc->use_header && *col_caption;
sr_dbg("DIAG col %zu, ch count %zu, text %s.",
sr_dbg("DIAG col %zu, ch count %zu, text %s.",
- col_nr, detail->channel_count, column);
+ col_nr, detail->channel_count, col_caption);
for (ch_idx = 0; ch_idx < detail->channel_count; ch_idx++) {
ch_name_idx = detail->channel_offset + ch_idx;
for (ch_idx = 0; ch_idx < detail->channel_count; ch_idx++) {
ch_name_idx = detail->channel_offset + ch_idx;
- if (inc->use_header && *column && inc->multi_column_mode)
- g_string_assign(channel_name, column);
+ if (got_caption && detail->channel_count == 1)
+ g_string_assign(channel_name, col_caption);
+ else if (got_caption)
+ g_string_printf(channel_name, "%s[%zu]",
+ col_caption, ch_idx);
else
g_string_printf(channel_name, "%zu", ch_name_idx);
sr_dbg("DIAG ch idx %zu, name %s.", ch_name_idx, channel_name->str);
else
g_string_printf(channel_name, "%zu", ch_name_idx);
sr_dbg("DIAG ch idx %zu, name %s.", ch_name_idx, channel_name->str);