summaryrefslogtreecommitdiff
path: root/lib/long-options.c
diff options
context:
space:
mode:
authorBernhard Voelker <mail@bernhard-voelker.de>2018-11-29 09:06:26 +0100
committerPádraig Brady <P@draigBrady.com>2019-02-23 18:54:00 -0800
commite3970fb9891668bd9dbc94daca18dc0d42b7e466 (patch)
treece1dae210e1859be059e7b9fa389aefa5a067445 /lib/long-options.c
parentcc42b8c933642d1f4e596eda73435ac76b5a8f47 (diff)
downloadgnulib-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.c52
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;
+}