decode: rephrase logic which looks up -A specs
authorGerhard Sittig <gerhard.sittig@gmx.net>
Fri, 19 Apr 2019 14:38:11 +0000 (16:38 +0200)
committerUwe Hermann <uwe@hermann-uwe.de>
Thu, 9 May 2019 12:57:50 +0000 (14:57 +0200)
The previous logic scanned for specific annotation classes listed in -A,
broke the loop when nothing was found, otherwise registered the matching
annotation for display later on.

Rephrase the logic such that classes get registered when found, and then
advance to the next spec. Only mismatch will "fall through" to the error
path and terminate the setup routine with a fatal error.

This prepares for an optional lookup of annotation rows when class
lookup fails, before a fatal error is returned.

decode.c

index b3d9bb2..c885824 100644 (file)
--- a/decode.c
+++ b/decode.c
@@ -336,6 +336,7 @@ int setup_pd_annotations(char *opt_pd_annotations)
                        annlist = g_strsplit(ann_txt, ":", 0);
                        for (ann = annlist; *ann && **ann; ann++) {
                                ann_id = *ann;
+                               /* Lookup annotation class. */
                                ann_class = 0;
                                for (l = dec->annotations; l; l = l->next, ann_class++) {
                                        ann_descr = l->data;
@@ -343,18 +344,20 @@ int setup_pd_annotations(char *opt_pd_annotations)
                                                /* Found it. */
                                                break;
                                }
-                               if (!l) {
-                                       g_critical("Annotation '%s' not found "
-                                                       "for protocol decoder '%s'.", ann_id, dec_id);
-                                       g_strfreev(keyval);
-                                       g_strfreev(pds);
-                                       return 1;
+                               if (l) {
+                                       l_ann = g_hash_table_lookup(pd_ann_visible, dec_id);
+                                       l_ann = g_slist_append(l_ann, GINT_TO_POINTER(ann_class));
+                                       g_hash_table_replace(pd_ann_visible, g_strdup(dec_id), l_ann);
+                                       g_debug("cli: Showing protocol decoder %s annotation "
+                                                       "class %d (%s).", dec_id, ann_class, ann_descr[0]);
+                                       continue;
                                }
-                               l_ann = g_hash_table_lookup(pd_ann_visible, dec_id);
-                               l_ann = g_slist_append(l_ann, GINT_TO_POINTER(ann_class));
-                               g_hash_table_replace(pd_ann_visible, g_strdup(dec_id), l_ann);
-                               g_debug("cli: Showing protocol decoder %s annotation "
-                                               "class %d (%s).", dec_id, ann_class, ann_descr[0]);
+                               /* No match found. */
+                               g_critical("Annotation '%s' not found "
+                                               "for protocol decoder '%s'.", ann_id, dec_id);
+                               g_strfreev(keyval);
+                               g_strfreev(pds);
+                               return 1;
                        }
                } else {
                        /* No class specified: show all of them. */