[PATCH 2/2] ctype: use less short names in public header
Richard Earnshaw
Richard.Earnshaw@foss.arm.com
Tue Nov 23 15:09:20 GMT 2021
This is wrong and breaks all old versions of C++.
The GNU sim code should not be using reserved names (those starting _)
in normal source code. Such names are reserved to the implementation.
R.
On 09/11/2021 01:24, Mike Frysinger wrote:
> We're seeing a build failure in GNU sim code which is using _P locally
> but the ctype.h define clashes with it. Rename these to use the same
> symbols that glibc does. They're a bit more verbose, but seems likely
> that we'll have fewer conflicts if glibc isn't seeing them.
>
> However, these shortnames are still used internally by ctype modules
> to produce pretty concise source code, so use _COMPILING_NEWLIB to
> keep them around when compiling newlib itself where we have better
> control over short name conflicts.
> ---
> newlib/libc/include/ctype.h | 77 ++++++++++++++++++++++---------------
> 1 file changed, 45 insertions(+), 32 deletions(-)
>
> diff --git a/newlib/libc/include/ctype.h b/newlib/libc/include/ctype.h
> index 932a567e25db..f2a4368da5d2 100644
> --- a/newlib/libc/include/ctype.h
> +++ b/newlib/libc/include/ctype.h
> @@ -57,14 +57,27 @@ extern int isascii_l (int __c, locale_t __l);
> extern int toascii_l (int __c, locale_t __l);
> #endif
>
> -#define _U 01
> -#define _L 02
> -#define _N 04
> -#define _S 010
> -#define _P 020
> -#define _C 040
> -#define _X 0100
> -#define _B 0200
> +enum
> +{
> + _ISupper = 01,
> + _ISlower = 02,
> + _ISdigit = 04,
> + _ISspace = 010,
> + _ISpunct = 020,
> + _IScntrl = 040,
> + _ISxdigit = 0100,
> + _ISblank = 0200,
> +};
> +#ifdef _COMPILING_NEWLIB
> +# define _U _ISupper
> +# define _L _ISlower
> +# define _N _ISdigit
> +# define _S _ISspace
> +# define _P _ISpunct
> +# define _C _IScntrl
> +# define _X _ISxdigit
> +# define _B _ISblank
> +#endif
>
> /* For C++ backward-compatibility only. */
> extern __IMPORT const char _ctype_[];
> @@ -89,22 +102,22 @@ const char *__locale_ctype_ptr (void);
> an out-of-bounds reference on a 64-bit machine. */
> #define __ctype_lookup(__c) ((__CTYPE_PTR+sizeof(""[__c]))[(int)(__c)])
>
> -#define isalpha(__c) (__ctype_lookup(__c)&(_U|_L))
> -#define isupper(__c) ((__ctype_lookup(__c)&(_U|_L))==_U)
> -#define islower(__c) ((__ctype_lookup(__c)&(_U|_L))==_L)
> -#define isdigit(__c) (__ctype_lookup(__c)&_N)
> -#define isxdigit(__c) (__ctype_lookup(__c)&(_X|_N))
> -#define isspace(__c) (__ctype_lookup(__c)&_S)
> -#define ispunct(__c) (__ctype_lookup(__c)&_P)
> -#define isalnum(__c) (__ctype_lookup(__c)&(_U|_L|_N))
> -#define isprint(__c) (__ctype_lookup(__c)&(_P|_U|_L|_N|_B))
> -#define isgraph(__c) (__ctype_lookup(__c)&(_P|_U|_L|_N))
> -#define iscntrl(__c) (__ctype_lookup(__c)&_C)
> +#define isalpha(__c) (__ctype_lookup(__c) & (_ISupper|_ISlower))
> +#define isupper(__c) ((__ctype_lookup(__c) & (_ISupper|_ISlower)) == _ISupper)
> +#define islower(__c) ((__ctype_lookup(__c) & (_ISupper|_ISlower)) == _ISlower)
> +#define isdigit(__c) (__ctype_lookup(__c) & _ISdigit)
> +#define isxdigit(__c) (__ctype_lookup(__c) & (_ISxdigit|_ISdigit))
> +#define isspace(__c) (__ctype_lookup(__c) & _ISspace)
> +#define ispunct(__c) (__ctype_lookup(__c) & _ISpunct)
> +#define isalnum(__c) (__ctype_lookup(__c) & (_ISupper|_ISlower|_ISdigit))
> +#define isprint(__c) (__ctype_lookup(__c) & (_ISpunct|_ISupper|_ISlower|_ISdigit|_ISblank))
> +#define isgraph(__c) (__ctype_lookup(__c) & (_ISpunct|_ISupper|_ISlower|_ISdigit))
> +#define iscntrl(__c) (__ctype_lookup(__c) & _IScntrl)
>
> #if defined(__GNUC__) && __ISO_C_VISIBLE >= 1999
> #define isblank(__c) \
> __extension__ ({ __typeof__ (__c) __x = (__c); \
> - (__ctype_lookup(__x)&_B) || (int) (__x) == '\t';})
> + (__ctype_lookup(__x)&_ISblank) || (int) (__x) == '\t';})
> #endif
>
> #if __POSIX_VISIBLE >= 200809
> @@ -120,22 +133,22 @@ __locale_ctype_ptr_l(locale_t _l)
> #endif
> #define __ctype_lookup_l(__c,__l) ((__locale_ctype_ptr_l(__l)+sizeof(""[__c]))[(int)(__c)])
>
> -#define isalpha_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_U|_L))
> -#define isupper_l(__c,__l) ((__ctype_lookup_l(__c,__l)&(_U|_L))==_U)
> -#define islower_l(__c,__l) ((__ctype_lookup_l(__c,__l)&(_U|_L))==_L)
> -#define isdigit_l(__c,__l) (__ctype_lookup_l(__c,__l)&_N)
> -#define isxdigit_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_X|_N))
> -#define isspace_l(__c,__l) (__ctype_lookup_l(__c,__l)&_S)
> -#define ispunct_l(__c,__l) (__ctype_lookup_l(__c,__l)&_P)
> -#define isalnum_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_U|_L|_N))
> -#define isprint_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_P|_U|_L|_N|_B))
> -#define isgraph_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_P|_U|_L|_N))
> -#define iscntrl_l(__c,__l) (__ctype_lookup_l(__c,__l)&_C)
> +#define isalpha_l(__c,__l) (__ctype_lookup_l(__c,__l) & (_ISupper|_ISlower))
> +#define isupper_l(__c,__l) ((__ctype_lookup_l(__c,__l) & (_ISupper|_ISlower)) == _ISupper)
> +#define islower_l(__c,__l) ((__ctype_lookup_l(__c,__l) & (_ISupper|_ISlower)) == _ISlower)
> +#define isdigit_l(__c,__l) (__ctype_lookup_l(__c,__l) & _ISdigit)
> +#define isxdigit_l(__c,__l) (__ctype_lookup_l(__c,__l) & (_ISxdigit|_ISdigit))
> +#define isspace_l(__c,__l) (__ctype_lookup_l(__c,__l) & _ISspace)
> +#define ispunct_l(__c,__l) (__ctype_lookup_l(__c,__l) & _ISpunct)
> +#define isalnum_l(__c,__l) (__ctype_lookup_l(__c,__l) & (_ISupper|_ISlower|_ISdigit))
> +#define isprint_l(__c,__l) (__ctype_lookup_l(__c,__l) & (_ISpunct|_ISupper|_ISlower|_ISdigit|_ISblank))
> +#define isgraph_l(__c,__l) (__ctype_lookup_l(__c,__l) & (_ISpunct|_ISupper|_ISlower|_ISdigit))
> +#define iscntrl_l(__c,__l) (__ctype_lookup_l(__c,__l) & _IScntrl)
>
> #if defined(__GNUC__)
> #define isblank_l(__c, __l) \
> __extension__ ({ __typeof__ (__c) __x = (__c); \
> - (__ctype_lookup_l(__x,__l)&_B) || (int) (__x) == '\t';})
> + (__ctype_lookup_l(__x,__l)&_ISblank) || (int) (__x) == '\t';})
> #endif
>
> #endif /* __POSIX_VISIBLE >= 200809 */
>
More information about the Newlib
mailing list