diff options
author | Zack Weinberg <zackw@panix.com> | 2017-04-01 12:11:33 -0400 |
---|---|---|
committer | Zack Weinberg <zackw@panix.com> | 2017-04-07 07:50:06 -0400 |
commit | 7a7be6c9a2a89ac5783d4f27d67b0fae3218228f (patch) | |
tree | 924a9917be84855368ad0e4722b4694e29ecbe30 /posix/getopt.h | |
parent | 544ce845def4540de11d9484df888df94876b14e (diff) | |
download | glibc-7a7be6c9a2a89ac5783d4f27d67b0fae3218228f.tar glibc-7a7be6c9a2a89ac5783d4f27d67b0fae3218228f.tar.gz glibc-7a7be6c9a2a89ac5783d4f27d67b0fae3218228f.tar.bz2 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.h | 69 |
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 |