X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=decode.c;h=4888a7c506f00b85406a7e92ecf08e11f864afe8;hp=8a52edac4aea5610b3443f1bcd59869f1a9d5a6a;hb=241f9b13e8d5f7de38f1e4762661dc6fc76ead24;hpb=e9e4dc4d7ecc678cffaa9a93034319f7e02f33b9 diff --git a/decode.c b/decode.c index 8a52eda..4888a7c 100644 --- a/decode.c +++ b/decode.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "sigrok-cli.h" #ifdef HAVE_SRD @@ -179,7 +180,7 @@ static int register_pd(char *opt_pds, char *opt_pd_annotations) * in the stack. */ if (!opt_pd_annotations) { - g_hash_table_insert(pd_ann_visible, g_strdup(di->inst_id), + g_hash_table_insert(pd_ann_visible, g_strdup(di->decoder->id), g_slist_append(NULL, GINT_TO_POINTER(-1))); } if (di_prior) { @@ -194,6 +195,10 @@ static int register_pd(char *opt_pds, char *opt_pd_annotations) g_hash_table_remove(pd_ann_visible, di_prior->inst_id); } di_prior = di; + g_free(pd_name); + g_hash_table_destroy(pd_opthash); + g_hash_table_destroy(options); + pd_opthash = options = NULL; } if (pd_opthash) @@ -204,7 +209,6 @@ static int register_pd(char *opt_pds, char *opt_pd_annotations) g_hash_table_destroy(channels); g_strfreev(pdtokens); - g_free(pd_name); return ret; } @@ -272,6 +276,7 @@ static void map_pd_inst_channels(void *key, void *value, void *user_data) } srd_inst_channel_set_all(di, channel_indices); + g_hash_table_destroy(channel_indices); } void map_pd_channels(struct sr_dev_inst *sdi) @@ -412,6 +417,12 @@ int setup_pd_binary(char *opt_pd_binary) return 0; } +static inline void pd_ann_check(gboolean chk) +{ + + assert(chk); +} + void show_pd_annotations(struct srd_proto_data *pdata, void *cb_data) { struct srd_decoder *dec; @@ -419,40 +430,87 @@ void show_pd_annotations(struct srd_proto_data *pdata, void *cb_data) GSList *ann_list, *l; int i; char **ann_descr; - gboolean show; + gboolean show_ann, show_snum, show_class, show_quotes, show_abbrev; + gboolean show_id_colon; (void)cb_data; if (!pd_ann_visible) return; - if (!g_hash_table_lookup_extended(pd_ann_visible, pdata->pdo->di->inst_id, - NULL, (void **)&ann_list)) + if (!g_hash_table_lookup_extended(pd_ann_visible, pdata->pdo->di->decoder->id, + NULL, (void **)&ann_list)) { /* Not in the list of PDs whose annotations we're showing. */ return; + } dec = pdata->pdo->di->decoder; pda = pdata->data; - show = FALSE; + show_ann = FALSE; for (l = ann_list; l; l = l->next) { if (GPOINTER_TO_INT(l->data) == -1 || GPOINTER_TO_INT(l->data) == pda->ann_class) { - show = TRUE; + show_ann = TRUE; break; } } - if (!show) + if (!show_ann) return; + /* + * Determine the annotation's layout from the verbosity of the + * log level: + * - Optionally show the sample numbers for the annotation's span. + * - Always show the protocol decoder ID. + * - Optionally show the annotation's class description. + * - Always show the longest annotation text. + * - Optionally show alternative annotation text (abbreviations + * for different zoom levels). + * - Optionally put quote marks around annotation text, when + * recipients might have to deal with a set of text variants. + */ + show_snum = show_class = show_quotes = show_abbrev = FALSE; + if (opt_loglevel > SR_LOG_WARN) { + show_snum = TRUE; + } + if (opt_loglevel > SR_LOG_WARN) { + show_quotes = TRUE; + } + if (opt_loglevel > SR_LOG_INFO) { + show_class = TRUE; + show_abbrev = TRUE; + } + /* Backwards (bug?) compatibility. */ + show_id_colon = show_abbrev || !show_quotes; + + /* + * Display the annotation's fields after the layout was + * determined above. + */ + pd_ann_check(show_ann); if (opt_loglevel <= SR_LOG_WARN) { + pd_ann_check(!show_snum); + pd_ann_check(show_id_colon); + pd_ann_check(!show_class); + pd_ann_check(!show_quotes); + pd_ann_check(!show_abbrev); /* Show only the longest annotation. */ printf("%s: %s", pdata->pdo->proto_id, pda->ann_text[0]); } else if (opt_loglevel >= SR_LOG_INFO) { /* Sample numbers and quotes around the longest annotation. */ + pd_ann_check(show_snum); printf("%"PRIu64"-%"PRIu64"", pdata->start_sample, pdata->end_sample); if (opt_loglevel == SR_LOG_INFO) { + pd_ann_check(!show_id_colon); + pd_ann_check(!show_class); + pd_ann_check(show_quotes); + pd_ann_check(!show_abbrev); printf(" %s \"%s\"", pdata->pdo->proto_id, pda->ann_text[0]); } else { + pd_ann_check(show_id_colon); + pd_ann_check(show_class); + pd_ann_check(show_quotes); + pd_ann_check(show_abbrev); /* Protocol decoder id, annotation class, * all annotation strings. */ ann_descr = g_slist_nth_data(dec->annotations, pda->ann_class); @@ -486,7 +544,7 @@ void show_pd_binary(struct srd_proto_data *pdata, void *cb_data) { struct srd_proto_data_binary *pdb; gpointer classp; - int class; + int classi; (void)cb_data; @@ -495,9 +553,9 @@ void show_pd_binary(struct srd_proto_data *pdata, void *cb_data) /* Not in the list of PDs whose meta output we're showing. */ return; - class = GPOINTER_TO_INT(classp); + classi = GPOINTER_TO_INT(classp); pdb = pdata->data; - if (class != -1 && class != pdb->bin_class) + if (classi != -1 && classi != pdb->bin_class) /* Not showing this binary class. */ return;