+ ctx = o->internal;
+ max_linelen = MAX_PROBENAME_LEN + 3 + ctx->samples_per_line
+ + ctx->samples_per_line / 8;
+ /*
+ * Calculate space needed for probes. Set aside 512 bytes for
+ * extra output, e.g. trigger.
+ */
+ outsize = 512 + (1 + (length_in / ctx->unitsize) / ctx->samples_per_line)
+ * (ctx->num_enabled_probes * max_linelen);
+
+ if (!(outbuf = calloc(1, outsize + 1)))
+ return SIGROK_ERR_MALLOC;
+
+ outbuf[0] = '\0';
+ if (ctx->header) {
+ /* The header is still here, this must be the first packet. */
+ strncpy(outbuf, ctx->header, outsize);
+ free(ctx->header);
+ ctx->header = NULL;
+ }
+
+ if (length_in >= ctx->unitsize) {
+ for (offset = 0; offset <= length_in - ctx->unitsize;
+ offset += ctx->unitsize) {
+ memcpy(&sample, data_in + offset, ctx->unitsize);
+
+ char tmpval[ctx->num_enabled_probes];
+
+ for (p = 0; p < ctx->num_enabled_probes; p++) {
+ uint64_t curbit = (sample & ((uint64_t) 1 << p));
+ uint64_t prevbit = (ctx->prevsample &
+ ((uint64_t) 1 << p));
+
+ if (curbit < prevbit && ctx->line_offset > 0) {
+ ctx->linebuf[p * ctx->linebuf_len +
+ ctx->line_offset-1] = '\\';
+ }
+
+ if (curbit > prevbit) {
+ tmpval[p] = '/';
+ } else {
+ if (curbit)
+ tmpval[p] = '"';
+ else
+ tmpval[p] = '.';
+ }
+ }
+
+ /* End of line. */
+ if (ctx->spl_cnt >= ctx->samples_per_line) {
+ flush_linebufs(ctx, outbuf);
+ ctx->line_offset = ctx->spl_cnt = 0;
+ ctx->mark_trigger = -1;
+ }
+
+ for (p = 0; p < ctx->num_enabled_probes; p++) {
+ ctx->linebuf[p * ctx->linebuf_len +
+ ctx->line_offset] = tmpval[p];
+ }
+
+ ctx->line_offset++;
+ ctx->spl_cnt++;