# HG changeset patch # User Bernhard Voelker # Date 1543478786 -3600 # Node ID 5a34193cbc07ac3f3d3024abd8b03fb36eddefdd # Parent 91454190d7498485c0e50ec195113a0208d91683 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. diff -r 91454190d749 -r 5a34193cbc07 ChangeLog --- a/ChangeLog Sun Feb 24 01:52:19 2019 +0100 +++ b/ChangeLog Thu Nov 29 09:06:26 2018 +0100 @@ -1,3 +1,18 @@ +2019-02-23 Bernhard Voelker + + 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. + 2019-02-23 Bruno Haible relocatable-prog: Update documentation. diff -r 91454190d749 -r 5a34193cbc07 lib/long-options.c --- a/lib/long-options.c Sun Feb 24 01:52:19 2019 +0100 +++ b/lib/long-options.c Thu Nov 29 09:06:26 2018 +0100 @@ -29,6 +29,7 @@ #include #include "version-etc.h" +#include "exitfail.h" static struct option const long_options[] = { @@ -71,7 +72,7 @@ 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 @@ 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; +} diff -r 91454190d749 -r 5a34193cbc07 lib/long-options.h --- a/lib/long-options.h Sun Feb 24 01:52:19 2019 +0100 +++ b/lib/long-options.h Thu Nov 29 09:06:26 2018 +0100 @@ -17,6 +17,11 @@ /* Written by Jim Meyering. */ +#ifndef LONG_OPTIONS_H_ +# define LONG_OPTIONS_H_ 1 + +# include + void parse_long_options (int _argc, char **_argv, const char *_command_name, @@ -24,3 +29,14 @@ const char *_version, void (*_usage) (int), /* const char *author1, ...*/ ...); + +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, ...*/ ...); + +#endif /* LONG_OPTIONS_H_ */ diff -r 91454190d749 -r 5a34193cbc07 modules/long-options --- a/modules/long-options Sun Feb 24 01:52:19 2019 +0100 +++ b/modules/long-options Thu Nov 29 09:06:26 2018 +0100 @@ -6,7 +6,9 @@ lib/long-options.c Depends-on: +exitfail getopt-gnu +stdbool stdlib version-etc diff -r 91454190d749 -r 5a34193cbc07 top/maint.mk --- a/top/maint.mk Sun Feb 24 01:52:19 2019 +0100 +++ b/top/maint.mk Thu Nov 29 09:06:26 2018 +0100 @@ -537,7 +537,7 @@ # Don't include this header unless you use one of its functions. sc_prohibit_long_options_without_use: - @h='long-options.h' re='\