X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=options.c;h=6a97595740bfc51e2fa44d176982df2da3a3ced4;hp=9f9d912fcd3f5c0c399017dab57750ebb951d2ce;hb=ee639fb40fa43aa3553ef0229def9bcdb8338c2b;hpb=0894b97269117fef77fb22d06d726a38e652cee4 diff --git a/options.c b/options.c index 9f9d912..6a97595 100644 --- a/options.c +++ b/options.c @@ -17,8 +17,8 @@ * along with this program. If not, see . */ -#include "sigrok-cli.h" #include +#include "sigrok-cli.h" gboolean opt_version = FALSE; gint opt_loglevel = SR_LOG_WARN; /* Show errors+warnings by default. */ @@ -40,15 +40,19 @@ gchar *opt_pd_binary = NULL; #endif gchar *opt_input_format = NULL; gchar *opt_output_format = NULL; +gchar *opt_transform_module = NULL; gchar *opt_show = NULL; gchar *opt_time = NULL; gchar *opt_samples = NULL; gchar *opt_frames = NULL; gchar *opt_continuous = NULL; +gchar *opt_get = NULL; gchar *opt_set = NULL; -/* defines a callback function that generates - an error if an option occurs twice */ +/* + * Defines a callback function that generates an error if an + * option occurs twice. + */ #define CHECK_ONCE(option) \ static gboolean check_ ## option \ (const gchar *option_name, const gchar *value, \ @@ -72,6 +76,7 @@ CHECK_ONCE(opt_drv) CHECK_ONCE(opt_config) CHECK_ONCE(opt_input_format) CHECK_ONCE(opt_output_format) +CHECK_ONCE(opt_transform_module) CHECK_ONCE(opt_channels) CHECK_ONCE(opt_channel_group) CHECK_ONCE(opt_triggers) @@ -85,9 +90,13 @@ CHECK_ONCE(opt_pd_binary) CHECK_ONCE(opt_time) CHECK_ONCE(opt_samples) CHECK_ONCE(opt_frames) +CHECK_ONCE(opt_get) #undef CHECK_STR_ONCE +static gchar **input_file_array = NULL; +static gchar **output_file_array = NULL; + static const GOptionEntry optargs[] = { {"version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, "Show version and support list", NULL}, @@ -97,14 +106,16 @@ static const GOptionEntry optargs[] = { "The driver to use", NULL}, {"config", 'c', 0, G_OPTION_ARG_CALLBACK, &check_opt_config, "Specify device configuration options", NULL}, - {"input-file", 'i', 0, G_OPTION_ARG_FILENAME, &opt_input_file, + {"input-file", 'i', 0, G_OPTION_ARG_FILENAME_ARRAY, &input_file_array, "Load input from file", NULL}, {"input-format", 'I', 0, G_OPTION_ARG_CALLBACK, &check_opt_input_format, "Input format", NULL}, - {"output-file", 'o', 0, G_OPTION_ARG_FILENAME, &opt_output_file, + {"output-file", 'o', 0, G_OPTION_ARG_FILENAME_ARRAY, &output_file_array, "Save output to file", NULL}, {"output-format", 'O', 0, G_OPTION_ARG_CALLBACK, &check_opt_output_format, "Output format", NULL}, + {"transform-module", 'T', 0, G_OPTION_ARG_CALLBACK, &check_opt_transform_module, + "Transform module", NULL}, {"channels", 'C', 0, G_OPTION_ARG_CALLBACK, &check_opt_channels, "Channels to use", NULL}, {"channel-group", 'g', 0, G_OPTION_ARG_CALLBACK, &check_opt_channel_group, @@ -137,12 +148,15 @@ static const GOptionEntry optargs[] = { "Number of frames to acquire", NULL}, {"continuous", 0, 0, G_OPTION_ARG_NONE, &opt_continuous, "Sample continuously", NULL}, + {"get", 0, 0, G_OPTION_ARG_CALLBACK, &check_opt_get, "Get device option only", 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. */ +/* + * 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; @@ -156,10 +170,41 @@ int parse_options(int argc, char **argv) goto done; } + /* + * Because of encoding issues with filenames (mentioned in the glib + * documentation), we don't check them with a callback function, but + * collect them into arrays and then check if the arrays contain at + * most one element. + */ + if (NULL != input_file_array) { + if (NULL != input_file_array[0] && NULL != input_file_array[1]) { + g_critical("option \"--input-file/-i\" only allowed once"); + goto done; + } + opt_input_file = g_strdup(input_file_array[0]); + } + + if (NULL != output_file_array) { + if (NULL != output_file_array[0] && NULL != output_file_array[1]) { + g_critical("option \"--output-file/-o\" only allowed once"); + goto done; + } + opt_output_file = g_strdup(output_file_array[0]); + } + + if (1 != argc) { + g_critical("superfluous command line argument \"%s\"", argv[1]); + goto done; + } + ret = 0; done: g_option_context_free(context); + g_strfreev(input_file_array); + g_strfreev(output_file_array); + input_file_array = NULL; + output_file_array = NULL; return ret; }