[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