X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Finput%2Fvcd.c;fp=src%2Finput%2Fvcd.c;h=47511c416ee90be723e6a20bcde6660ac37dd01b;hp=88e17f8b8ba4fb23c622edd81574d18fea64d8d5;hb=36dacf17bc5fe333c6557d073011e2033b6f544f;hpb=a66175c2b1e11c961329aa2634fa9de7f3a45d5a diff --git a/src/input/vcd.c b/src/input/vcd.c index 88e17f8b..47511c41 100644 --- a/src/input/vcd.c +++ b/src/input/vcd.c @@ -336,14 +336,36 @@ static void add_samples(const struct sr_input *in, size_t count) } } +/* Set the channel level depending on the identifier and parsed value. */ +static void process_bit(struct context *inc, char *identifier, unsigned int bit) +{ + GSList *l; + struct vcd_channel *vcd_ch; + unsigned int j; + + for (j = 0, l = inc->channels; j < inc->channelcount && l; j++, l = l->next) { + vcd_ch = l->data; + if (g_strcmp0(identifier, vcd_ch->identifier) == 0) { + /* Found our channel. */ + size_t byte_idx = (j / 8); + size_t bit_idx = j - 8 * byte_idx; + if (bit) + inc->current_levels[byte_idx] |= (uint8_t)1 << bit_idx; + else + inc->current_levels[byte_idx] &= ~((uint8_t)1 << bit_idx); + break; + } + } + if (j == inc->channelcount) + sr_dbg("Did not find channel for identifier '%s'.", identifier); +} + /* Parse a set of lines from the data section. */ static void parse_contents(const struct sr_input *in, char *data) { struct context *inc; - struct vcd_channel *vcd_ch; - GSList *l; uint64_t timestamp, prev_timestamp; - unsigned int bit, i, j; + unsigned int bit, i; char **tokens; inc = in->priv; @@ -433,22 +455,7 @@ static void parse_contents(const struct sr_input *in, char *data) } else { identifier = tokens[i] + 1; } - - for (j = 0, l = inc->channels; j < inc->channelcount && l; j++, l = l->next) { - vcd_ch = l->data; - if (g_strcmp0(identifier, vcd_ch->identifier) == 0) { - /* Found our channel */ - size_t byte_idx = (j / 8); - size_t bit_idx = j - 8 * byte_idx; - if (bit) - inc->current_levels[byte_idx] |= (uint8_t)1 << bit_idx; - else - inc->current_levels[byte_idx] &= ~((uint8_t)1 << bit_idx); - break; - } - } - if (j == inc->channelcount) - sr_dbg("Did not find channel for identifier '%s'.", identifier); + process_bit(inc, identifier, bit); } else { sr_warn("Skipping unknown token '%s'.", tokens[i]); }