This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH/RFA] Distinguish between EOF and character with value 0xff


I like this! Beware that the function forms won't have this warning. Also, for the same reason, your change to isblank doesn't have the desired effect. Instead, try this:

#define isblank(c) \
	__extension__ ({ __typeof__(c) __c = (c); ((__ctype_ptr__+1)[__c]&_B) || (__c) == '\t'; })

---
Mike Burgess
Avanex Corporation
607-562-7169

-----Original Message-----
>From: Eric Blake <ebb9@byu.net>
>Sent: Apr 22, 2009 5:26 PM
>To: newlib@sources.redhat.com
>Subject: Re: [PATCH/RFA] Distinguish between EOF and character with value 0xff
>
>Eric Blake <ebb9 <at> byu.net> writes:
>
>> > Should any attempt be made to make it cleaner for those who don't?
>> 
>> One way might be to write it in such a way that, for decent compilers, we 
>> trigger warnings.  Gcc is already smart enough to warn the user about the use 
>> of a char array index:
>> 
>> 
>> Maybe the trick is to rewrite the macros such that we force the original 
>input 
>> to be treated as an array index; it is too late after the addition (at which 
>> point things have been promoted to int if they weren't already).  Untested:
>> 
>> #define isalpha(c) ((*((&__ctype_ptr__[c])+1))&(_U|_L))
>
>I spent some time and actually tested my proposal.  I've verified that with the 
>patch below, the assembly produced by isalpha(i) is identical both before and 
>after the patch under gcc 4.3.2.  Meanwhile, 'gcc -Wall' is now able to 
>complain about isalpha((char)i) while staying silent for isalpha((unsigned char)
>i).
>
>OK to apply?  (And pardon the fact that gmane botched the long lines.)
>
>2009-04-22  Eric Blake  <ebb9@byu.net>
>
>	Trigger gcc warning if isFoo macros are called with plain char.
>	* libc/include/ctype.h (isalpha, isupper, islower, isdigit)
>	(isxdigit, isspace, ispunct, isalnum, isprint, isgraph)
>	(iscntrl, isblank): Rewrite to let 'gcc -Wall' warn when user
>	calls macro with a char argument.
>
>--- ctype.h.orig	2009-04-22 13:39:01.702341400 -0600
>+++ ctype.h	2009-04-22 15:19:08.381510200 -0600
>@@ -45,22 +45,22 @@
> extern	__IMPORT char	*__ctype_ptr__;
> 
> #ifndef __cplusplus
>-#define	isalpha(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&(_U|_L))
>-#define	isupper(c)	(((__ctype_ptr__)[(unsigned)((c)+1)]&(_U|_L))
>==_U)
>-#define	islower(c)	(((__ctype_ptr__)[(unsigned)((c)+1)]&(_U|_L))
>==_L)
>-#define	isdigit(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&_N)
>-#define	isxdigit(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&(_X|_N))
>-#define	isspace(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&_S)
>-#define ispunct(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&_P)
>-#define isalnum(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&(_U|_L|_N))
>-#define isprint(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&(_P|_U|_L|_N|_B))
>-#define	isgraph(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&
>(_P|_U|_L|_N))
>-#define iscntrl(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&_C)
>+#define	isalpha(c)	((__ctype_ptr__+1)[c]&(_U|_L))
>+#define	isupper(c)	(((__ctype_ptr__+1)[c]&(_U|_L))==_U)
>+#define	islower(c)	(((__ctype_ptr__+1)[c]&(_U|_L))==_L)
>+#define	isdigit(c)	((__ctype_ptr__+1)[c]&_N)
>+#define	isxdigit(c)	((__ctype_ptr__+1)[c]&(_X|_N))
>+#define	isspace(c)	((__ctype_ptr__+1)[c]&_S)
>+#define ispunct(c)	((__ctype_ptr__+1)[c]&_P)
>+#define isalnum(c)	((__ctype_ptr__+1)[c]&(_U|_L|_N))
>+#define isprint(c)	((__ctype_ptr__+1)[c]&(_P|_U|_L|_N|_B))
>+#define	isgraph(c)	((__ctype_ptr__+1)[c]&(_P|_U|_L|_N))
>+#define iscntrl(c)	((__ctype_ptr__+1)[c]&_C)
> 
> #if defined(__GNUC__) && \
>     (!defined(__STRICT_ANSI__) || __STDC_VERSION__ >= 199901L)
> #define isblank(c) \
>-	__extension__ ({ int __c = (c); ((__ctype_ptr__)[(unsigned)((__c)+1)]
>&_B) || (__c) == '\t';})
>+	__extension__ ({ int __c = (c); ((__ctype_ptr__+1)[__c]&_B) || (__c) 
>== '\t';})
> #endif
> 
> 
>
>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]