decode: Prepare to rework text output for protocol decoder annotations
authorGerhard Sittig <gerhard.sittig@gmx.net>
Sun, 9 Jul 2017 11:10:31 +0000 (13:10 +0200)
committerGerhard Sittig <gerhard.sittig@gmx.net>
Mon, 31 Jul 2017 17:37:30 +0000 (19:37 +0200)
When the current implementation receives a protocol decoder annotation,
one out of several code paths prints one of several different variations
of text layout. The current implementation exclusively checks the active
log level to determine the layout variant.

Prepare to rework that text layout logic. Separate the determination of
which fields to display from the logic which does emit those fields in a
specific format.

This commit does not yet adjust the print statements. It is supposed to
verify that the "which fields to display?" logic results in identical
behaviour to the previous implementation.

decode.c

index 63817a08e63aa1e18027fa017b0fff48df311161..4888a7c506f00b85406a7e92ecf08e11f864afe8 100644 (file)
--- a/decode.c
+++ b/decode.c
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <glib.h>
+#include <assert.h>
 #include "sigrok-cli.h"
 
 #ifdef HAVE_SRD
@@ -416,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;
@@ -423,7 +430,8 @@ 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;
 
@@ -438,26 +446,71 @@ void show_pd_annotations(struct srd_proto_data *pdata, void *cb_data)
 
        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);