From cd62e027c0a3a8d97a6689d042b92699d8b619f3 Mon Sep 17 00:00:00 2001 From: Jens Steinhauser Date: Tue, 15 Jul 2014 17:14:03 +0200 Subject: [PATCH] Put option parsing into a separate file. --- Makefile.am | 3 +- main.c | 109 ++--------------------------------------- options.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++ sigrok-cli.h | 30 ++++++++++++ 4 files changed, 173 insertions(+), 105 deletions(-) create mode 100644 options.c diff --git a/Makefile.am b/Makefile.am index 1384330..c4b2b01 100644 --- a/Makefile.am +++ b/Makefile.am @@ -30,7 +30,8 @@ sigrok_cli_SOURCES = \ decode.c \ sigrok-cli.h \ parsers.c \ - anykey.c + anykey.c \ + options.c dist_man_MANS = doc/sigrok-cli.1 diff --git a/main.c b/main.c index ff3225f..95b4258 100644 --- a/main.c +++ b/main.c @@ -26,87 +26,6 @@ struct sr_context *sr_ctx = NULL; struct srd_session *srd_sess = NULL; #endif -static gboolean opt_version = FALSE; -gint opt_loglevel = SR_LOG_WARN; /* Show errors+warnings by default. */ -static gboolean opt_scan_devs = FALSE; -gboolean opt_wait_trigger = FALSE; -gchar *opt_input_file = NULL; -gchar *opt_output_file = NULL; -gchar *opt_drv = NULL; -gchar *opt_config = NULL; -static gchar *opt_channels = NULL; -gchar *opt_channel_group = NULL; -gchar *opt_triggers = NULL; -gchar *opt_pds = NULL; -#ifdef HAVE_SRD -static gchar *opt_pd_stack = NULL; -static gchar *opt_pd_annotations = NULL; -static gchar *opt_pd_meta = NULL; -static gchar *opt_pd_binary = NULL; -#endif -gchar *opt_input_format = NULL; -gchar *opt_output_format = NULL; -static gchar *opt_show = NULL; -gchar *opt_time = NULL; -gchar *opt_samples = NULL; -gchar *opt_frames = NULL; -gchar *opt_continuous = NULL; -static gchar *opt_set = NULL; - -static GOptionEntry optargs[] = { - {"version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, - "Show version and support list", NULL}, - {"loglevel", 'l', 0, G_OPTION_ARG_INT, &opt_loglevel, - "Set loglevel (5 is most verbose)", NULL}, - {"driver", 'd', 0, G_OPTION_ARG_STRING, &opt_drv, - "The driver to use", NULL}, - {"config", 'c', 0, G_OPTION_ARG_STRING, &opt_config, - "Specify device configuration options", NULL}, - {"input-file", 'i', 0, G_OPTION_ARG_FILENAME, &opt_input_file, - "Load input from file", NULL}, - {"input-format", 'I', 0, G_OPTION_ARG_STRING, &opt_input_format, - "Input format", NULL}, - {"output-file", 'o', 0, G_OPTION_ARG_FILENAME, &opt_output_file, - "Save output to file", NULL}, - {"output-format", 'O', 0, G_OPTION_ARG_STRING, &opt_output_format, - "Output format", NULL}, - {"channels", 'C', 0, G_OPTION_ARG_STRING, &opt_channels, - "Channels to use", NULL}, - {"channel-group", 'g', 0, G_OPTION_ARG_STRING, &opt_channel_group, - "Channel groups", NULL}, - {"triggers", 't', 0, G_OPTION_ARG_STRING, &opt_triggers, - "Trigger configuration", NULL}, - {"wait-trigger", 'w', 0, G_OPTION_ARG_NONE, &opt_wait_trigger, - "Wait for trigger", NULL}, -#ifdef HAVE_SRD - {"protocol-decoders", 'P', 0, G_OPTION_ARG_STRING, &opt_pds, - "Protocol decoders to run", NULL}, - {"protocol-decoder-stack", 'S', 0, G_OPTION_ARG_STRING, &opt_pd_stack, - "Protocol decoder stack", NULL}, - {"protocol-decoder-annotations", 'A', 0, G_OPTION_ARG_STRING, &opt_pd_annotations, - "Protocol decoder annotation(s) to show", NULL}, - {"protocol-decoder-meta", 'M', 0, G_OPTION_ARG_STRING, &opt_pd_meta, - "Protocol decoder meta output to show", NULL}, - {"protocol-decoder-binary", 'B', 0, G_OPTION_ARG_STRING, &opt_pd_binary, - "Protocol decoder binary output to show", NULL}, -#endif - {"scan", 0, 0, G_OPTION_ARG_NONE, &opt_scan_devs, - "Scan for devices", NULL}, - {"show", 0, 0, G_OPTION_ARG_NONE, &opt_show, - "Show device detail", NULL}, - {"time", 0, 0, G_OPTION_ARG_STRING, &opt_time, - "How long to sample (ms)", NULL}, - {"samples", 0, 0, G_OPTION_ARG_STRING, &opt_samples, - "Number of samples to acquire", NULL}, - {"frames", 0, 0, G_OPTION_ARG_STRING, &opt_frames, - "Number of frames to acquire", NULL}, - {"continuous", 0, 0, G_OPTION_ARG_NONE, &opt_continuous, - "Sample continuously", NULL}, - {"set", 0, 0, G_OPTION_ARG_NONE, &opt_set, "Set device options only", NULL}, - {NULL, 0, 0, 0, NULL, NULL, NULL} -}; - - static void logger(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer cb_data) { @@ -187,21 +106,10 @@ static void set_options(void) int main(int argc, char **argv) { - GOptionContext *context; - GError *error; - int ret; - char *help; - g_log_set_default_handler(logger, NULL); - context = g_option_context_new(NULL); - g_option_context_add_main_entries(context, optargs, NULL); - - ret = 1; - error = NULL; - if (!g_option_context_parse(context, &argc, &argv, &error)) { - g_critical("%s", error->message); - goto done; + if (parse_options(argc, argv)) { + return 1; } /* Set the loglevel (amount of messages to output) for libsigrok. */ @@ -268,24 +176,17 @@ int main(int argc, char **argv) set_options(); else if (opt_samples || opt_time || opt_frames || opt_continuous) run_session(); - else { - help = g_option_context_get_help(context, TRUE, NULL); - printf("%s", help); - g_free(help); - } + else + show_help(); #ifdef HAVE_SRD if (opt_pds) srd_exit(); #endif - ret = 0; - done: if (sr_ctx) sr_exit(sr_ctx); - g_option_context_free(context); - - return ret; + return 0; } diff --git a/options.c b/options.c new file mode 100644 index 0000000..b26ca4b --- /dev/null +++ b/options.c @@ -0,0 +1,136 @@ +/* + * This file is part of the sigrok-cli project. + * + * Copyright (C) 2013 Bert Vermeulen + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "sigrok-cli.h" +#include + +gboolean opt_version = FALSE; +gint opt_loglevel = SR_LOG_WARN; /* Show errors+warnings by default. */ +gboolean opt_scan_devs = FALSE; +gboolean opt_wait_trigger = FALSE; +gchar *opt_input_file = NULL; +gchar *opt_output_file = NULL; +gchar *opt_drv = NULL; +gchar *opt_config = NULL; +gchar *opt_channels = NULL; +gchar *opt_channel_group = NULL; +gchar *opt_triggers = NULL; +gchar *opt_pds = NULL; +#ifdef HAVE_SRD +gchar *opt_pd_stack = NULL; +gchar *opt_pd_annotations = NULL; +gchar *opt_pd_meta = NULL; +gchar *opt_pd_binary = NULL; +#endif +gchar *opt_input_format = NULL; +gchar *opt_output_format = NULL; +gchar *opt_show = NULL; +gchar *opt_time = NULL; +gchar *opt_samples = NULL; +gchar *opt_frames = NULL; +gchar *opt_continuous = NULL; +gchar *opt_set = NULL; + +static const GOptionEntry optargs[] = { + {"version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, + "Show version and support list", NULL}, + {"loglevel", 'l', 0, G_OPTION_ARG_INT, &opt_loglevel, + "Set loglevel (5 is most verbose)", NULL}, + {"driver", 'd', 0, G_OPTION_ARG_STRING, &opt_drv, + "The driver to use", NULL}, + {"config", 'c', 0, G_OPTION_ARG_STRING, &opt_config, + "Specify device configuration options", NULL}, + {"input-file", 'i', 0, G_OPTION_ARG_FILENAME, &opt_input_file, + "Load input from file", NULL}, + {"input-format", 'I', 0, G_OPTION_ARG_STRING, &opt_input_format, + "Input format", NULL}, + {"output-file", 'o', 0, G_OPTION_ARG_FILENAME, &opt_output_file, + "Save output to file", NULL}, + {"output-format", 'O', 0, G_OPTION_ARG_STRING, &opt_output_format, + "Output format", NULL}, + {"channels", 'C', 0, G_OPTION_ARG_STRING, &opt_channels, + "Channels to use", NULL}, + {"channel-group", 'g', 0, G_OPTION_ARG_STRING, &opt_channel_group, + "Channel groups", NULL}, + {"triggers", 't', 0, G_OPTION_ARG_STRING, &opt_triggers, + "Trigger configuration", NULL}, + {"wait-trigger", 'w', 0, G_OPTION_ARG_NONE, &opt_wait_trigger, + "Wait for trigger", NULL}, +#ifdef HAVE_SRD + {"protocol-decoders", 'P', 0, G_OPTION_ARG_STRING, &opt_pds, + "Protocol decoders to run", NULL}, + {"protocol-decoder-stack", 'S', 0, G_OPTION_ARG_STRING, &opt_pd_stack, + "Protocol decoder stack", NULL}, + {"protocol-decoder-annotations", 'A', 0, G_OPTION_ARG_STRING, &opt_pd_annotations, + "Protocol decoder annotation(s) to show", NULL}, + {"protocol-decoder-meta", 'M', 0, G_OPTION_ARG_STRING, &opt_pd_meta, + "Protocol decoder meta output to show", NULL}, + {"protocol-decoder-binary", 'B', 0, G_OPTION_ARG_STRING, &opt_pd_binary, + "Protocol decoder binary output to show", NULL}, +#endif + {"scan", 0, 0, G_OPTION_ARG_NONE, &opt_scan_devs, + "Scan for devices", NULL}, + {"show", 0, 0, G_OPTION_ARG_NONE, &opt_show, + "Show device detail", NULL}, + {"time", 0, 0, G_OPTION_ARG_STRING, &opt_time, + "How long to sample (ms)", NULL}, + {"samples", 0, 0, G_OPTION_ARG_STRING, &opt_samples, + "Number of samples to acquire", NULL}, + {"frames", 0, 0, G_OPTION_ARG_STRING, &opt_frames, + "Number of frames to acquire", NULL}, + {"continuous", 0, 0, G_OPTION_ARG_NONE, &opt_continuous, + "Sample continuously", NULL}, + {"set", 0, 0, G_OPTION_ARG_NONE, &opt_set, "Set device options only", NULL}, + {NULL, 0, 0, 0, NULL, NULL, NULL} +}; + +/* Parses the command line and sets all the 'opt_...' variables. + Returns zero on success, non-zero otherwise. */ +int parse_options(int argc, char **argv) +{ + GError *error = NULL; + GOptionContext *context = g_option_context_new(NULL); + int ret = 1; + + g_option_context_add_main_entries(context, optargs, NULL); + + if (!g_option_context_parse(context, &argc, &argv, &error)) { + g_critical("%s", error->message); + goto done; + } + + ret = 0; + +done: + g_option_context_free(context); + + return ret; +} + +void show_help(void) +{ + GOptionContext *context = g_option_context_new(NULL); + g_option_context_add_main_entries(context, optargs, NULL); + + char *help = g_option_context_get_help(context, TRUE, NULL); + printf("%s", help); + g_free(help); + + g_option_context_free(context); +} diff --git a/sigrok-cli.h b/sigrok-cli.h index 2416b95..a3289c8 100644 --- a/sigrok-cli.h +++ b/sigrok-cli.h @@ -78,4 +78,34 @@ int canon_cmp(const char *str1, const char *str2); void add_anykey(void); void clear_anykey(void); +/* options.c */ +extern gboolean opt_version; +extern gint opt_loglevel; +extern gboolean opt_scan_devs; +extern gboolean opt_wait_trigger; +extern gchar *opt_input_file; +extern gchar *opt_output_file; +extern gchar *opt_drv; +extern gchar *opt_config; +extern gchar *opt_channels; +extern gchar *opt_channel_group; +extern gchar *opt_triggers; +extern gchar *opt_pds; +#ifdef HAVE_SRD +extern gchar *opt_pd_stack; +extern gchar *opt_pd_annotations; +extern gchar *opt_pd_meta; +extern gchar *opt_pd_binary; +#endif +extern gchar *opt_input_format; +extern gchar *opt_output_format; +extern gchar *opt_show; +extern gchar *opt_time; +extern gchar *opt_samples; +extern gchar *opt_frames; +extern gchar *opt_continuous; +extern gchar *opt_set; +int parse_options(int argc, char **argv); +void show_help(void); + #endif -- 2.30.2