changeset 40198:5a34193cbc07

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.
author Bernhard Voelker <mail@bernhard-voelker.de>
date Thu, 29 Nov 2018 09:06:26 +0100
parents 91454190d749
children dd30d6eb93bd
files ChangeLog lib/long-options.c lib/long-options.h modules/long-options top/maint.mk
diffstat 5 files changed, 85 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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  <mail@bernhard-voelker.de>
+
+	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  <bruno@clisp.org>
 
 	relocatable-prog: Update documentation.
--- 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 <getopt.h>
 
 #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;
+}
--- 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 <stdbool.h>
+
 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_ */
--- 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
 
--- 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='\<parse_long_options *\(' \
+	@h='long-options.h' re='\<parse_(long_options|gnu_standard_options_only) *\(' \
 	  $(_sc_header_without_use)
 
 # Don't include this header unless you use one of its functions.