about summary refs log tree commit diff
path: root/posix/getopt.h
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2017-04-01 12:11:33 -0400
committerZack Weinberg <zackw@panix.com>2017-04-07 07:50:06 -0400
commit7a7be6c9a2a89ac5783d4f27d67b0fae3218228f (patch)
tree924a9917be84855368ad0e4722b4694e29ecbe30 /posix/getopt.h
parent544ce845def4540de11d9484df888df94876b14e (diff)
downloadglibc-7a7be6c9a2a89ac5783d4f27d67b0fae3218228f.tar.gz
glibc-7a7be6c9a2a89ac5783d4f27d67b0fae3218228f.tar.xz
glibc-7a7be6c9a2a89ac5783d4f27d67b0fae3218228f.zip
getopt: merge from gnulib: function prototype adjustments
For standards compliance, getopt, getopt_long, and getopt_long_only in
glibc have to take 'char *const *argv' even though they can mutate the
array.  gnulib has tried to clean this up as much as possible: all the
internal functions use 'char **argv', and when used standalone, so do
getopt_long and getopt_long_only.

Also brought over are __nonnull annotations, corrections to documentation,
and apparently it is no longer necessary to worry about conflicting
prototypes for getopt.  The macroification of the definitions of
getopt and __posix_getopt goes beyond what is currently in gnulib.

At this point getopt1.c and getopt_int.h are identical to their gnulib
versions.

	* posix/getopt.h: Add backup definition of __nonnull for
	consistency with gnulib.  Define __getopt_argv_const to const
	if not already defined.
	(getopt): Update doc comment from gnulib.  Prototype
	unconditionally.  Add __nonnull annotation.
	(__posix_getopt): Add __nonnull annotation.
	(getopt_long, getopt_long_only): Use __getopt_argv_const in
	prototypes for consistency with gnulib.  Add __nonnull
	annotations.
	* posix/getopt.c (_getopt_initialize, _getopt_internal_r)
	(getopt_internal): Change 'argv' argument to type 'char **'.
	Remove now-unnecessary casts.
	(getopt, __posix_getopt): Eliminate repetition with a macro.
	Cast 'argv' to 'char **' when calling _getopt_internal.
	* posix/getopt1.c (getopt_long, getopt_long_only):
	Use __getopt_argv_const for consistency with gnulib.
	Cast 'argv' to 'char **' when calling _getopt_internal.
	(_getopt_long_r, _getopt_long_only_r):
	Change 'argv' argument to type 'char **'.
	(main): Constify 'long_options'.
	* posix/getopt_int.h (getopt_internal, _getopt_internal_r)
	(_getopt_long_r, _getopt_long_only_r):
	Change 'argv' argument to type 'char **'.
Diffstat (limited to 'posix/getopt.h')
-rw-r--r--posix/getopt.h69
1 files changed, 44 insertions, 25 deletions
diff --git a/posix/getopt.h b/posix/getopt.h
index c83a186beb..fa6aa6be38 100644
--- a/posix/getopt.h
+++ b/posix/getopt.h
@@ -33,10 +33,11 @@
 # include <ctype.h>
 #endif
 
+#ifndef __GNUC_PREREQ
+# define __GNUC_PREREQ(maj, min) (0)
+#endif
+
 #ifndef __THROW
-# ifndef __GNUC_PREREQ
-#  define __GNUC_PREREQ(maj, min) (0)
-# endif
 # if defined __cplusplus && __GNUC_PREREQ (2,8)
 #  define __THROW	throw ()
 # else
@@ -44,6 +45,14 @@
 # endif
 #endif
 
+#ifndef __nonnull
+# if __GNUC_PREREQ (3, 3)
+#  define __nonnull(params) __attribute__ ((__nonnull__ params))
+# else
+#  define __nonnull(params)
+# endif
+#endif
+
 #ifdef	__cplusplus
 extern "C" {
 #endif
@@ -139,45 +148,55 @@ struct option
    scanning, explicitly telling 'getopt' that there are no more
    options.
 
-   If OPTS begins with '--', then non-option arguments are treated as
-   arguments to the option '\0'.  This behavior is specific to the GNU
-   'getopt'.  */
+   If OPTS begins with '-', then non-option arguments are treated as
+   arguments to the option '\1'.  This behavior is specific to the GNU
+   'getopt'.  If OPTS begins with '+', or POSIXLY_CORRECT is set in
+   the environment, then do not permute arguments.
+
+   For standards compliance, the 'argv' argument has the type
+   char *const *, but this is inaccurate; if argument permutation is
+   enabled, the argv array (not the strings it points to) must be
+   writable.  */
 
-#ifdef __GNU_LIBRARY__
-/* Many other libraries have conflicting prototypes for getopt, with
-   differences in the consts, in stdlib.h.  To avoid compilation
-   errors, only prototype getopt for the GNU C library.  */
 extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
-       __THROW;
+       __THROW __nonnull ((2, 3));
 
-# if defined __need_getopt && defined __USE_POSIX2 \
-  && !defined __USE_POSIX_IMPLICITLY && !defined __USE_GNU
+#if defined __need_getopt && defined __USE_POSIX2 \
+    && !defined __USE_POSIX_IMPLICITLY && !defined __USE_GNU
 /* The GNU getopt has more functionality than the standard version.  The
    additional functionality can be disable at runtime.  This redirection
    helps to also do this at runtime.  */
-#  ifdef __REDIRECT
+# ifdef __REDIRECT
   extern int __REDIRECT_NTH (getopt, (int ___argc, char *const *___argv,
 				      const char *__shortopts),
 			     __posix_getopt);
-#  else
+# else
 extern int __posix_getopt (int ___argc, char *const *___argv,
-			   const char *__shortopts) __THROW;
-#   define getopt __posix_getopt
-#  endif
+			   const char *__shortopts)
+  __THROW __nonnull ((2, 3));
+#  define getopt __posix_getopt
 # endif
-#else /* not __GNU_LIBRARY__ */
-extern int getopt ();
-#endif /* __GNU_LIBRARY__ */
+#endif
 
 #ifndef __need_getopt
-extern int getopt_long (int ___argc, char *const *___argv,
+
+/* The type of the 'argv' argument to getopt_long and getopt_long_only
+   is properly 'char **', since both functions may write to the array
+   (in order to move all the options to the beginning).  However, for
+   compatibility with old versions of LSB, glibc has to use 'char *const *'
+   instead.  */
+#ifndef __getopt_argv_const
+# define __getopt_argv_const const
+#endif
+
+extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
 			const char *__shortopts,
 		        const struct option *__longopts, int *__longind)
-       __THROW;
-extern int getopt_long_only (int ___argc, char *const *___argv,
+  __THROW __nonnull ((2, 3));
+extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
 			     const char *__shortopts,
 		             const struct option *__longopts, int *__longind)
-       __THROW;
+  __THROW __nonnull ((2, 3));
 
 #endif