Use size types for counters, unsigned for bit manipulation. Trigger
position needs to remain a signed int (must be possible to go negative
for "not here", and strictly remains within the output text line length,
so should be good).
Rephrase the nested loop during bit extraction from logic packets, and
how a channel's value at a given sample number gets accessed. Eliminate
redundancy in that spot, to improve readability and simplify maintenance.
#define DEFAULT_ASCII_CHARS ".\"\\/"
struct context {
#define DEFAULT_ASCII_CHARS ".\"\\/"
struct context {
- unsigned int num_enabled_channels;
- int spl;
- int spl_cnt;
+ size_t num_enabled_channels;
+ size_t spl;
+ size_t spl_cnt;
int trigger;
uint64_t samplerate;
int *channel_index;
char **aligned_names;
int trigger;
uint64_t samplerate;
int *channel_index;
char **aligned_names;
char **line_values;
uint8_t *prev_sample;
gboolean header_done;
GString **lines;
char **line_values;
uint8_t *prev_sample;
gboolean header_done;
GString **lines;
const char *charset;
gboolean edges;
};
const char *charset;
gboolean edges;
};
struct context *ctx;
struct sr_channel *ch;
GSList *l;
struct context *ctx;
struct sr_channel *ch;
GSList *l;
- unsigned int j, max_namelen, alloc_line_len;
+ size_t j, max_namelen, alloc_line_len;
if (!o || !o->sdi)
return SR_ERR_ARG;
if (!o || !o->sdi)
return SR_ERR_ARG;
continue;
ctx->channel_index[j] = ch->index;
continue;
ctx->channel_index[j] = ch->index;
- ctx->aligned_names[j] = g_strdup_printf("%*s", max_namelen, ch->name);
+ ctx->aligned_names[j] = g_strdup_printf("%*s", (int)max_namelen, ch->name);
ctx->lines[j] = g_string_sized_new(alloc_line_len);
g_string_printf(ctx->lines[j], "%s:", ctx->aligned_names[j]);
ctx->lines[j] = g_string_sized_new(alloc_line_len);
g_string_printf(ctx->lines[j], "%s:", ctx->aligned_names[j]);
struct context *ctx;
GVariant *gvar;
GString *header;
struct context *ctx;
GVariant *gvar;
GString *header;
char *samplerate_s;
ctx = o->priv;
char *samplerate_s;
ctx = o->priv;
header = g_string_sized_new(512);
g_string_printf(header, "%s %s\n", PACKAGE_NAME, sr_package_version_string_get());
num_channels = g_slist_length(o->sdi->channels);
header = g_string_sized_new(512);
g_string_printf(header, "%s %s\n", PACKAGE_NAME, sr_package_version_string_get());
num_channels = g_slist_length(o->sdi->channels);
- g_string_append_printf(header, "Acquisition with %d/%d channels",
+ g_string_append_printf(header, "Acquisition with %zu/%zu channels",
ctx->num_enabled_channels, num_channels);
if (ctx->samplerate != 0) {
samplerate_s = sr_samplerate_string(ctx->samplerate);
ctx->num_enabled_channels, num_channels);
if (ctx->samplerate != 0) {
samplerate_s = sr_samplerate_string(ctx->samplerate);
- if (ctx->trigger <= -1)
return;
offset = ctx->trigger;
ctx->trigger = -1;
return;
offset = ctx->trigger;
ctx->trigger = -1;
* to this layout.
*/
g_string_append_printf(out, "%*s:%*s %d\n",
* to this layout.
*/
g_string_append_printf(out, "%*s:%*s %d\n",
+ (int)ctx->max_namelen, "T",
offset + 1, "^", offset);
}
offset + 1, "^", offset);
}
static int receive(const struct sr_output *o, const struct sr_datafeed_packet *packet,
GString **out)
{
static int receive(const struct sr_output *o, const struct sr_datafeed_packet *packet,
GString **out)
{
const struct sr_config *src;
GSList *l;
struct context *ctx;
const struct sr_config *src;
GSList *l;
struct context *ctx;
- int idx, curbit, prevbit;
- uint64_t i, j;
- gchar *p, c;
+ size_t idx, i, j;
+ size_t num_samples;
+ const uint8_t *curr_sample;
+ size_t bytepos;
+ uint8_t bitmask, curbit, prevbit;
+ char c;
size_t charidx;
*out = NULL;
size_t charidx;
*out = NULL;
}
logic = packet->payload;
}
logic = packet->payload;
- for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
+ num_samples = logic->length / logic->unitsize;
+ curr_sample = logic->data;
+ while (num_samples--) {
ctx->spl_cnt++;
for (j = 0; j < ctx->num_enabled_channels; j++) {
idx = ctx->channel_index[j];
ctx->spl_cnt++;
for (j = 0; j < ctx->num_enabled_channels; j++) {
idx = ctx->channel_index[j];
- p = logic->data + i + idx / 8;
- curbit = *p & (1 << (idx % 8));
- prevbit = (ctx->prev_sample[idx / 8] & ((uint8_t) 1 << (idx % 8)));
+ bytepos = idx / 8;
+ bitmask = 1U << (idx % 8);
+ curbit = curr_sample[bytepos] & bitmask;
+ prevbit = ctx->prev_sample[bytepos] & bitmask;
charidx = curbit ? 1 : 0;
if (ctx->edges && ctx->spl_cnt > 1) {
charidx = curbit ? 1 : 0;
if (ctx->edges && ctx->spl_cnt > 1) {
/* Flush line buffers. */
g_string_append_len(*out, ctx->lines[j]->str, ctx->lines[j]->len);
g_string_append_c(*out, '\n');
/* Flush line buffers. */
g_string_append_len(*out, ctx->lines[j]->str, ctx->lines[j]->len);
g_string_append_c(*out, '\n');
- if (j == ctx->num_enabled_channels - 1)
+ if (j + 1 == ctx->num_enabled_channels)
maybe_add_trigger(ctx, *out);
g_string_printf(ctx->lines[j], "%s:", ctx->aligned_names[j]);
}
maybe_add_trigger(ctx, *out);
g_string_printf(ctx->lines[j], "%s:", ctx->aligned_names[j]);
}
if (ctx->spl_cnt == ctx->spl)
/* Line buffers were already flushed. */
ctx->spl_cnt = 0;
if (ctx->spl_cnt == ctx->spl)
/* Line buffers were already flushed. */
ctx->spl_cnt = 0;
- memcpy(ctx->prev_sample, logic->data + i, logic->unitsize);
+ memcpy(ctx->prev_sample, curr_sample, logic->unitsize);
+ curr_sample += logic->unitsize;
static int cleanup(struct sr_output *o)
{
struct context *ctx;
static int cleanup(struct sr_output *o)
{
struct context *ctx;
if (!o)
return SR_ERR_ARG;
if (!o)
return SR_ERR_ARG;