Unobfuscate the implementation of the recent channel name alignment and
trigger position flush, address other style nits of earlier versions:
Don't need a GString for runtime constant channel names (which also
suffered from a mismatch of declaration and allocation). Don't need to
"construct space" when printf(3) can align the value. Pre-allocate text
buffers with more appropriate length when known in advance. Drop another
unused variable. Eliminate data type redundancy in malloc(3) calls. Make
sure to get zeroed memory, disabled channels can result in assignment
gaps. Use consistent brace style and separate variable declaration from
use (no RAII here).
Excess text line length remains, there has been a lot of it in the
previous implementation. It is left for another commit.
Tested with:
$ sigrok-cli -d demo:analog_channels=0:logic_channels=4 --samples 40 -O ascii -t D3=r -w
int trigger;
uint64_t samplerate;
int *channel_index;
int trigger;
uint64_t samplerate;
int *channel_index;
- GString **channel_names;
int max_namelen;
char **line_values;
uint8_t *prev_sample;
int max_namelen;
char **line_values;
uint8_t *prev_sample;
struct context *ctx;
struct sr_channel *ch;
GSList *l;
struct context *ctx;
struct sr_channel *ch;
GSList *l;
- unsigned int i, j, max_namelen;
+ unsigned int j, max_namelen, alloc_line_len;
if (!o || !o->sdi)
return SR_ERR_ARG;
if (!o || !o->sdi)
return SR_ERR_ARG;
continue;
ctx->num_enabled_channels++;
}
continue;
ctx->num_enabled_channels++;
}
- ctx->channel_index = g_malloc(sizeof(int) * ctx->num_enabled_channels);
- ctx->channel_names = g_malloc(sizeof(char *) * ctx->num_enabled_channels);
- ctx->lines = g_malloc(sizeof(GString *) * ctx->num_enabled_channels);
- ctx->prev_sample = g_malloc(g_slist_length(o->sdi->channels));
+ ctx->channel_index = g_malloc0(sizeof(ctx->channel_index[0]) * ctx->num_enabled_channels);
+ ctx->aligned_names = g_malloc0(sizeof(ctx->aligned_names[0]) * ctx->num_enabled_channels);
+ ctx->lines = g_malloc0(sizeof(ctx->lines[0]) * ctx->num_enabled_channels);
+ ctx->prev_sample = g_malloc0(g_slist_length(o->sdi->channels));
+ /* Get the maximum length across all active logic channels. */
- for (i = 0, l = o->sdi->channels; l; l = l->next, i++) {
+ for (l = o->sdi->channels; l; l = l->next) {
ch = l->data;
if (ch->type != SR_CHANNEL_LOGIC)
continue;
if (!ch->enabled)
continue;
ch = l->data;
if (ch->type != SR_CHANNEL_LOGIC)
continue;
if (!ch->enabled)
continue;
max_namelen = MAX(max_namelen, strlen(ch->name));
}
ctx->max_namelen = max_namelen;
max_namelen = MAX(max_namelen, strlen(ch->name));
}
ctx->max_namelen = max_namelen;
+ alloc_line_len = ctx->max_namelen + 8 + ctx->spl;
- for (i = 0, l = o->sdi->channels; l; l = l->next, i++) {
+ for (l = o->sdi->channels; l; l = l->next) {
ch = l->data;
if (ch->type != SR_CHANNEL_LOGIC)
continue;
ch = l->data;
if (ch->type != SR_CHANNEL_LOGIC)
continue;
continue;
ctx->channel_index[j] = ch->index;
continue;
ctx->channel_index[j] = ch->index;
- ctx->channel_names[j] = g_string_sized_new(16);
- g_string_printf(ctx->channel_names[j], "%*s%s", (int)(max_namelen - strlen(ch->name)), "", ch->name);
+ ctx->aligned_names[j] = g_strdup_printf("%*s", max_namelen, ch->name);
- ctx->lines[j] = g_string_sized_new(80);
- g_string_printf(ctx->lines[j], "%s:", ctx->channel_names[j]->str);
+ ctx->lines[j] = g_string_sized_new(alloc_line_len);
+ g_string_printf(ctx->lines[j], "%s:", ctx->aligned_names[j]);
-static void maybe_add_trigger(struct context *ctx, GString *out) {
+static void maybe_add_trigger(struct context *ctx, GString *out)
+{
+ int offset;
+
if (ctx->trigger <= -1)
return;
if (ctx->trigger <= -1)
return;
-
- int offset = ctx->trigger;
+ offset = ctx->trigger;
+ ctx->trigger = -1;
/*
* Sample data lines have one character per bit and
* no separator between bytes. Align trigger marker
* to this layout.
*/
/*
* Sample data lines have one character per bit and
* no separator between bytes. Align trigger marker
* to this layout.
*/
- g_string_append_printf(out, "%*sT:%*s^ %d\n", ctx->max_namelen - 1, "", offset, "", offset);
-
- ctx->trigger = -1;
+ g_string_append_printf(out, "%*s:%*s %d\n",
+ ctx->max_namelen, "T",
+ offset + 1, "^", offset);
if (!ctx->header_done) {
*out = gen_header(o);
ctx->header_done = TRUE;
if (!ctx->header_done) {
*out = gen_header(o);
ctx->header_done = TRUE;
*out = g_string_sized_new(512);
*out = g_string_sized_new(512);
logic = packet->payload;
for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
logic = packet->payload;
for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
g_string_append_c(*out, '\n');
if (j == ctx->num_enabled_channels - 1)
maybe_add_trigger(ctx, *out);
g_string_append_c(*out, '\n');
if (j == ctx->num_enabled_channels - 1)
maybe_add_trigger(ctx, *out);
- g_string_printf(ctx->lines[j], "%s:", ctx->channel_names[j]->str);
+ g_string_printf(ctx->lines[j], "%s:", ctx->aligned_names[j]);
}
}
if (ctx->spl_cnt == ctx->spl)
}
}
if (ctx->spl_cnt == ctx->spl)
g_free(ctx->channel_index);
g_free(ctx->prev_sample);
for (i = 0; i < ctx->num_enabled_channels; i++) {
g_free(ctx->channel_index);
g_free(ctx->prev_sample);
for (i = 0; i < ctx->num_enabled_channels; i++) {
- g_string_free(ctx->channel_names[i], TRUE);
+ g_free(ctx->aligned_names[i]);
g_string_free(ctx->lines[i], TRUE);
}
g_string_free(ctx->lines[i], TRUE);
}
- g_free(ctx->channel_names);
+ g_free(ctx->aligned_names);
g_free(ctx->lines);
g_free((gpointer)ctx->charset);
g_free(ctx);
g_free(ctx->lines);
g_free((gpointer)ctx->charset);
g_free(ctx);