From: Gerhard Sittig Date: Fri, 19 Apr 2019 14:38:11 +0000 (+0200) Subject: decode: rephrase logic which looks up -A specs X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=4171a0a082c4c41263d9a08944e1c668bdd489e1;p=sigrok-cli.git decode: rephrase logic which looks up -A specs 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. --- diff --git a/decode.c b/decode.c index b3d9bb2..c885824 100644 --- 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. */