Add --list-supported-wiki option.
authorUwe Hermann <uwe@hermann-uwe.de>
Fri, 29 Mar 2019 15:01:06 +0000 (16:01 +0100)
committerUwe Hermann <uwe@hermann-uwe.de>
Fri, 29 Mar 2019 15:02:31 +0000 (16:02 +0100)
This is meant for developers only, to easily update the list of
supported protocol decoders in the sigrok wiki.

doc/sigrok-cli.1
main.c
options.c
show.c
sigrok-cli.h

index b8940cb..de0093f 100644 (file)
@@ -1,4 +1,4 @@
-.TH SIGROK\-CLI 1 "October 22, 2018"
+.TH SIGROK\-CLI 1 "March 28, 2019"
 .SH "NAME"
 sigrok\-cli \- Command-line client for the sigrok software
 .SH "SYNOPSIS"
@@ -28,9 +28,14 @@ version and the versions of libraries used.
 Show information about supported hardware drivers, input file
 formats, output file formats, and protocol decoders.
 .TP
+.B "\-\-list\-supported\-wiki"
+Show information about supported protocol decoders in MediaWiki syntax.
+This is generally only used by developers to easily update the list of
+supported protocol decoders in the sigrok wiki.
+.TP
 \fB\-d, \-\-driver\fP <drivername>
 A driver must always be selected (unless doing a global scan). Use the
-.BR "\-L " ( "\-\-list-supported" ")"
+.BR "\-L " ( "\-\-list\-supported" ")"
 option to get a list of available drivers.
 .sp
 Drivers can take options, in the form \fBkey=value\fP
diff --git a/main.c b/main.c
index c038b6f..701da8e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -266,6 +266,8 @@ int main(int argc, char **argv)
                show_version();
        else if (opt_list_supported)
                show_supported();
+       else if (opt_list_supported_wiki)
+               show_supported_wiki();
        else if (opt_input_format && opt_show)
                show_input();
        else if (opt_output_format && opt_show)
index b9e1494..af6a7fe 100644 (file)
--- a/options.c
+++ b/options.c
@@ -23,6 +23,7 @@
 
 gboolean opt_version = FALSE;
 gboolean opt_list_supported = FALSE;
+gboolean opt_list_supported_wiki = FALSE;
 gint opt_loglevel = SR_LOG_WARN; /* Show errors+warnings by default. */
 gboolean opt_scan_devs = FALSE;
 gboolean opt_wait_trigger = FALSE;
@@ -102,6 +103,8 @@ static const GOptionEntry optargs[] = {
                        "Show version", NULL},
        {"list-supported", 'L', 0, G_OPTION_ARG_NONE, &opt_list_supported,
                        "List supported devices/modules/decoders", NULL},
+       {"list-supported-wiki", 0, 0, G_OPTION_ARG_NONE, &opt_list_supported_wiki,
+                       "List supported decoders (MediaWiki)", NULL},
        {"loglevel", 'l', 0, G_OPTION_ARG_INT, &opt_loglevel,
                        "Set loglevel (5 is most verbose)", NULL},
        {"driver", 'd', 0, G_OPTION_ARG_CALLBACK, &check_opt_drv,
diff --git a/show.c b/show.c
index dbbc632..090be4a 100644 (file)
--- a/show.c
+++ b/show.c
@@ -204,6 +204,74 @@ void show_supported(void)
 #endif
 }
 
+void show_supported_wiki(void)
+{
+#ifndef HAVE_SRD
+       printf("Error, libsigrokdecode support not compiled in.");
+#else
+       const GSList *l;
+       GSList *sl;
+       struct srd_decoder *dec;
+
+       if (srd_init(NULL) != SRD_OK)
+               return;
+
+       srd_decoder_load_all();
+       sl = g_slist_copy((GSList *)srd_decoder_list());
+       sl = g_slist_sort(sl, sort_pds);
+
+       printf("== Supported protocol decoders ==\n\n");
+
+       printf("<!-- Generated via sigrok-cli --list-supported-wiki. -->\n\n");
+
+       printf("Number of currently supported protocol decoders: "
+               "'''%d'''.\n\n", g_slist_length(sl));
+
+       printf("{| border=\"0\" style=\"font-size: smaller\" "
+               "class=\"alternategrey sortable sigroktable\"\n"
+               "|-\n!Protocol\n!Tags\n!Input IDs\n!Output IDs\n!Status\n"
+               "!Full name\n!Description\n\n");
+
+       for (l = sl; l; l = l->next) {
+               dec = l->data;
+
+               GString *tags = g_string_new(NULL);
+               for (GSList *t = dec->tags; t; t = t->next)
+                       g_string_append_printf(tags, "%s, ", (char *)t->data);
+               if (tags->len != 0)
+                       g_string_truncate(tags, tags->len - 2);
+
+               GString *in = g_string_new(NULL);
+               for (GSList *t = dec->inputs; t; t = t->next)
+                       g_string_append_printf(in, "%s, ", (char *)t->data);
+               if (in->len == 0)
+                       g_string_append_printf(in, "&mdash;");
+               else
+                       g_string_truncate(in, in->len - 2);
+
+               GString *out = g_string_new(NULL);
+               for (GSList *t = dec->outputs; t; t = t->next)
+                       g_string_append_printf(out, "%s, ", (char *)t->data);
+               if (out->len == 0)
+                       g_string_append_printf(out, "&mdash;");
+               else
+                       g_string_truncate(out, out->len - 2);
+
+               printf("{{pd|%s|%s|%s|%s|%s|%s|%s|supported}}\n",
+                       dec->id, dec->name, dec->longname, dec->desc,
+                       tags->str, in->str, out->str);
+
+               g_string_free(tags, TRUE);
+               g_string_free(in, TRUE);
+               g_string_free(out, TRUE);
+       }
+       g_slist_free(sl);
+       srd_exit();
+
+       printf("\n|}\n");
+#endif
+}
+
 static gint sort_channels(gconstpointer a, gconstpointer b)
 {
        const struct sr_channel *pa = a, *pb = b;
index f564448..c71586a 100644 (file)
@@ -45,6 +45,7 @@ int maybe_config_list(struct sr_dev_driver *driver,
 /* show.c */
 void show_version(void);
 void show_supported(void);
+void show_supported_wiki(void);
 void show_dev_list(void);
 void show_dev_detail(void);
 void show_pd_detail(void);
@@ -95,6 +96,7 @@ void clear_anykey(void);
 /* options.c */
 extern gboolean opt_version;
 extern gboolean opt_list_supported;
+extern gboolean opt_list_supported_wiki;
 extern gint opt_loglevel;
 extern gboolean opt_scan_devs;
 extern gboolean opt_wait_trigger;