diff options
author | Bernhard Voelker <mail@bernhard-voelker.de> | 2018-11-29 09:06:26 +0100 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2019-02-23 18:54:00 -0800 |
commit | e3970fb9891668bd9dbc94daca18dc0d42b7e466 (patch) | |
tree | ce1dae210e1859be059e7b9fa389aefa5a067445 /lib/long-options.c | |
parent | cc42b8c933642d1f4e596eda73435ac76b5a8f47 (diff) | |
download | gnulib-e3970fb9891668bd9dbc94daca18dc0d42b7e466.tar.gz |
long-options: add parse_gnu_standard_options_only
Discussed in https://bugs.gnu.org/33468 .
* lib/long-options.c (parse_long_options): Use EXIT_SUCCESS instead
of 0.
(parse_gnu_standard_options_only): Add function to
process the GNU default options --help and --version and fail for any other
unknown long or short option. See
https://gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html .
* lib/long-options.h (parse_gnu_standard_options_only): Declare it.
* modules/long-options (depends-on): Add stdbool, exitfail.
* top/maint.mk (sc_prohibit_long_options_without_use): Update
syntax-check rule, add new function name.
Diffstat (limited to 'lib/long-options.c')
-rw-r--r-- | lib/long-options.c | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/lib/long-options.c b/lib/long-options.c index 037f74b3a3..cbdc6a98bc 100644 --- a/lib/long-options.c +++ b/lib/long-options.c @@ -29,6 +29,7 @@ #include <getopt.h> #include "version-etc.h" +#include "exitfail.h" static struct option const long_options[] = { @@ -71,7 +72,7 @@ parse_long_options (int argc, va_list authors; va_start (authors, usage_func); version_etc_va (stdout, command_name, package, version, authors); - exit (0); + exit (EXIT_SUCCESS); } default: @@ -87,3 +88,52 @@ parse_long_options (int argc, the probably-new parameters when/if getopt is called later. */ optind = 0; } + +/* Process the GNU default long options --help and --version (see also + https://gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html), + and fail for any other unknown long or short option. + Use with SCAN_ALL=true to scan until "--", or with SCAN_ALL=false to stop + at the first non-option argument (or "--", whichever comes first). */ +void +parse_gnu_standard_options_only (int argc, + char **argv, + const char *command_name, + const char *package, + const char *version, + bool scan_all, + void (*usage_func) (int), + /* const char *author1, ...*/ ...) +{ + int c; + int saved_opterr = opterr; + + /* Print an error message for unrecognized options. */ + opterr = 1; + + const char *optstring = scan_all ? "" : "+"; + + if ((c = getopt_long (argc, argv, optstring, long_options, NULL)) != -1) + { + switch (c) + { + case 'h': + (*usage_func) (EXIT_SUCCESS); + break; + + case 'v': + { + va_list authors; + va_start (authors, usage_func); + version_etc_va (stdout, command_name, package, version, authors); + exit (EXIT_SUCCESS); + } + + default: + (*usage_func) (exit_failure); + break; + } + } + + /* Restore previous value. */ + opterr = saved_opterr; +} |