[PATCH 2/2] ctype: use less short names in public header

Mike Frysinger vapier@gentoo.org
Tue Nov 9 01:24:59 GMT 2021


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 */
-- 
2.33.0



More information about the Newlib mailing list