output/ascii: style nits in name alignment and trigger flush
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
This commit is contained in:
parent
cc835205cd
commit
31907b76de
|
@ -43,7 +43,7 @@ struct context {
|
||||||
int trigger;
|
int trigger;
|
||||||
uint64_t samplerate;
|
uint64_t samplerate;
|
||||||
int *channel_index;
|
int *channel_index;
|
||||||
GString **channel_names;
|
char **aligned_names;
|
||||||
int max_namelen;
|
int max_namelen;
|
||||||
char **line_values;
|
char **line_values;
|
||||||
uint8_t *prev_sample;
|
uint8_t *prev_sample;
|
||||||
|
@ -59,7 +59,7 @@ static int init(struct sr_output *o, GHashTable *options)
|
||||||
struct context *ctx;
|
struct context *ctx;
|
||||||
struct sr_channel *ch;
|
struct sr_channel *ch;
|
||||||
GSList *l;
|
GSList *l;
|
||||||
unsigned int i, j, max_namelen;
|
unsigned int j, max_namelen, alloc_line_len;
|
||||||
|
|
||||||
if (!o || !o->sdi)
|
if (!o || !o->sdi)
|
||||||
return SR_ERR_ARG;
|
return SR_ERR_ARG;
|
||||||
|
@ -84,25 +84,26 @@ static int init(struct sr_output *o, GHashTable *options)
|
||||||
continue;
|
continue;
|
||||||
ctx->num_enabled_channels++;
|
ctx->num_enabled_channels++;
|
||||||
}
|
}
|
||||||
ctx->channel_index = g_malloc(sizeof(int) * ctx->num_enabled_channels);
|
ctx->channel_index = g_malloc0(sizeof(ctx->channel_index[0]) * ctx->num_enabled_channels);
|
||||||
ctx->channel_names = g_malloc(sizeof(char *) * ctx->num_enabled_channels);
|
ctx->aligned_names = g_malloc0(sizeof(ctx->aligned_names[0]) * ctx->num_enabled_channels);
|
||||||
ctx->lines = g_malloc(sizeof(GString *) * ctx->num_enabled_channels);
|
ctx->lines = g_malloc0(sizeof(ctx->lines[0]) * ctx->num_enabled_channels);
|
||||||
ctx->prev_sample = g_malloc(g_slist_length(o->sdi->channels));
|
ctx->prev_sample = g_malloc0(g_slist_length(o->sdi->channels));
|
||||||
|
|
||||||
|
/* Get the maximum length across all active logic channels. */
|
||||||
max_namelen = 0;
|
max_namelen = 0;
|
||||||
for (i = 0, l = o->sdi->channels; l; l = l->next, i++) {
|
for (l = o->sdi->channels; l; l = l->next) {
|
||||||
ch = l->data;
|
ch = l->data;
|
||||||
if (ch->type != SR_CHANNEL_LOGIC)
|
if (ch->type != SR_CHANNEL_LOGIC)
|
||||||
continue;
|
continue;
|
||||||
if (!ch->enabled)
|
if (!ch->enabled)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
max_namelen = MAX(max_namelen, strlen(ch->name));
|
max_namelen = MAX(max_namelen, strlen(ch->name));
|
||||||
}
|
}
|
||||||
ctx->max_namelen = max_namelen;
|
ctx->max_namelen = max_namelen;
|
||||||
|
|
||||||
|
alloc_line_len = ctx->max_namelen + 8 + ctx->spl;
|
||||||
j = 0;
|
j = 0;
|
||||||
for (i = 0, l = o->sdi->channels; l; l = l->next, i++) {
|
for (l = o->sdi->channels; l; l = l->next) {
|
||||||
ch = l->data;
|
ch = l->data;
|
||||||
if (ch->type != SR_CHANNEL_LOGIC)
|
if (ch->type != SR_CHANNEL_LOGIC)
|
||||||
continue;
|
continue;
|
||||||
|
@ -110,11 +111,10 @@ static int init(struct sr_output *o, GHashTable *options)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ctx->channel_index[j] = ch->index;
|
ctx->channel_index[j] = ch->index;
|
||||||
ctx->channel_names[j] = g_string_sized_new(16);
|
ctx->aligned_names[j] = g_strdup_printf("%*s", max_namelen, ch->name);
|
||||||
g_string_printf(ctx->channel_names[j], "%*s%s", (int)(max_namelen - strlen(ch->name)), "", ch->name);
|
|
||||||
|
|
||||||
ctx->lines[j] = g_string_sized_new(80);
|
ctx->lines[j] = g_string_sized_new(alloc_line_len);
|
||||||
g_string_printf(ctx->lines[j], "%s:", ctx->channel_names[j]->str);
|
g_string_printf(ctx->lines[j], "%s:", ctx->aligned_names[j]);
|
||||||
|
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
|
@ -154,20 +154,23 @@ static GString *gen_header(const struct sr_output *o)
|
||||||
return header;
|
return header;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
if (ctx->trigger <= -1)
|
||||||
return;
|
return;
|
||||||
|
offset = ctx->trigger;
|
||||||
int offset = ctx->trigger;
|
ctx->trigger = -1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sample data lines have one character per bit and
|
* Sample data lines have one character per bit and
|
||||||
* no separator between bytes. Align trigger marker
|
* no separator between bytes. Align trigger marker
|
||||||
* to this layout.
|
* to this layout.
|
||||||
*/
|
*/
|
||||||
g_string_append_printf(out, "%*sT:%*s^ %d\n", ctx->max_namelen - 1, "", offset, "", offset);
|
g_string_append_printf(out, "%*s:%*s %d\n",
|
||||||
|
ctx->max_namelen, "T",
|
||||||
ctx->trigger = -1;
|
offset + 1, "^", offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -207,8 +210,9 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
|
||||||
if (!ctx->header_done) {
|
if (!ctx->header_done) {
|
||||||
*out = gen_header(o);
|
*out = gen_header(o);
|
||||||
ctx->header_done = TRUE;
|
ctx->header_done = TRUE;
|
||||||
} else
|
} else {
|
||||||
*out = g_string_sized_new(512);
|
*out = g_string_sized_new(512);
|
||||||
|
}
|
||||||
|
|
||||||
logic = packet->payload;
|
logic = packet->payload;
|
||||||
for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
|
for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
|
||||||
|
@ -233,7 +237,7 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
|
||||||
g_string_append_c(*out, '\n');
|
g_string_append_c(*out, '\n');
|
||||||
if (j == ctx->num_enabled_channels - 1)
|
if (j == ctx->num_enabled_channels - 1)
|
||||||
maybe_add_trigger(ctx, *out);
|
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)
|
||||||
|
@ -272,10 +276,10 @@ static int cleanup(struct sr_output *o)
|
||||||
g_free(ctx->channel_index);
|
g_free(ctx->channel_index);
|
||||||
g_free(ctx->prev_sample);
|
g_free(ctx->prev_sample);
|
||||||
for (i = 0; i < ctx->num_enabled_channels; i++) {
|
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(ctx->lines);
|
||||||
g_free((gpointer)ctx->charset);
|
g_free((gpointer)ctx->charset);
|
||||||
g_free(ctx);
|
g_free(ctx);
|
||||||
|
|
Loading…
Reference in New Issue