[PATCH/RFA] Fix ctype table and isblank

Jeff Johnston jjohnstn@redhat.com
Thu Apr 9 00:03:00 GMT 2009


Looks good.  Thanks.

-- Jeff J.

Corinna Vinschen wrote:
> On Apr  8 21:48, Corinna Vinschen wrote:
>   
>> Hi guys,
>>
>> On Apr  8 15:22, Jeff Johnston wrote:
>>     
>>> Wizards' Guild wrote:
>>>       
>>>> [...]
>>>> #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)
>>>> [...]
>>>> After studying the iswXX behavior some more, I am convinced that
>>>> Corinna's revised isblank (with the hardcoded tab test) proposal is
>>>> indeed correct. Of course it must go in a gcc-specific macro; other
>>>> compilers would presumably get the library version always.
>>>>         
>>> Thanks Mike.  I prefer this to my suggestion.  Corinna, if you're ok  
>>> with this and use an intermediate for the isblank macro with your tab  
>>> test, it can be checked in.
>>>       
>> Yes, I'm fine with that idea.  I'll implement that in the next couple
>> of days.  I have to revisit the ISO and Windows tables.  AFAICS, only
>> the Arabic and Hebrew tables should be affected by the upper/lowercase
>> problem but I'm not quite sure.
>>     
>
> First cut.  It doesn't change any of the extended tables, but the general
> idea is already implemented.  I'll change the tables in a second step.
>
> Ok to checkin?
>
>
> Corinna
>
>
> 	* libc/ctype/ctype_.c (_CTYPE_DATA_0_127): Remove _B flag from TAB.
> 	* libc/ctype/isblank.c (isblank): Special case TAB.
> 	* libc/ctype/islower.c (islower): Check explicitely for _L flag only
> 	in (_U|_L).
> 	* libc/ctype/isupper.c (isupper): Ditto, but check for _U flag.
> 	* libc/include/ctype.h (islower): Same in macro.
> 	(isupper): Ditto.
> 	(isblank): Special case TAB.  Redefine macro for GCC only.
>
>
> Index: libc/ctype/ctype_.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/ctype/ctype_.c,v
> retrieving revision 1.8
> diff -u -p -r1.8 ctype_.c
> --- libc/ctype/ctype_.c	2 Apr 2009 07:53:12 -0000	1.8
> +++ libc/ctype/ctype_.c	8 Apr 2009 20:01:22 -0000
> @@ -39,7 +39,7 @@ static char sccsid[] = "@(#)ctype_.c	5.6
>  
>  #define _CTYPE_DATA_0_127 \
>  	_C,	_C,	_C,	_C,	_C,	_C,	_C,	_C, \
> -	_C,	_B|_C|_S, _C|_S, _C|_S,	_C|_S,	_C|_S,	_C,	_C, \
> +	_C,	_C|_S, _C|_S, _C|_S,	_C|_S,	_C|_S,	_C,	_C, \
>  	_C,	_C,	_C,	_C,	_C,	_C,	_C,	_C, \
>  	_C,	_C,	_C,	_C,	_C,	_C,	_C,	_C, \
>  	_S|_B,	_P,	_P,	_P,	_P,	_P,	_P,	_P, \
> Index: libc/ctype/isblank.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/ctype/isblank.c,v
> retrieving revision 1.3
> diff -u -p -r1.3 isblank.c
> --- libc/ctype/isblank.c	26 Mar 2009 09:45:11 -0000	1.3
> +++ libc/ctype/isblank.c	8 Apr 2009 20:01:22 -0000
> @@ -37,5 +37,5 @@ No supporting OS subroutines are require
>  int
>  _DEFUN(isblank,(c),int c)
>  {
> -	return(__ctype_ptr__[c+1] & _B);
> +	return ((__ctype_ptr__[c+1] & _B) || (c == '\t'));
>  }
> Index: libc/ctype/islower.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/ctype/islower.c,v
> retrieving revision 1.3
> diff -u -p -r1.3 islower.c
> --- libc/ctype/islower.c	21 Jul 2008 21:28:34 -0000	1.3
> +++ libc/ctype/islower.c	8 Apr 2009 20:01:22 -0000
> @@ -38,6 +38,6 @@ No supporting OS subroutines are require
>  int
>  _DEFUN(islower,(c),int c)
>  {
> -	return(__ctype_ptr__[c+1] & _L);
> +	return ((__ctype_ptr__[c+1] & (_U|_L)) == _L);
>  }
>  
> Index: libc/ctype/isupper.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/ctype/isupper.c,v
> retrieving revision 1.3
> diff -u -p -r1.3 isupper.c
> --- libc/ctype/isupper.c	21 Jul 2008 21:28:34 -0000	1.3
> +++ libc/ctype/isupper.c	8 Apr 2009 20:01:22 -0000
> @@ -38,6 +38,6 @@ No supporting OS subroutines are require
>  int
>  _DEFUN(isupper,(c),int c)
>  {
> -	return(__ctype_ptr__[c+1] & _U);
> +	return ((__ctype_ptr__[c+1] & (_U|_L)) == _U);
>  }
>  
> Index: libc/include/ctype.h
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/include/ctype.h,v
> retrieving revision 1.16
> diff -u -p -r1.16 ctype.h
> --- libc/include/ctype.h	2 Apr 2009 07:53:12 -0000	1.16
> +++ libc/include/ctype.h	8 Apr 2009 20:01:22 -0000
> @@ -46,8 +46,8 @@ 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)
> -#define	islower(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&_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)
> @@ -57,8 +57,10 @@ extern	__IMPORT char	*__ctype_ptr__;
>  #define	isgraph(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&(_P|_U|_L|_N))
>  #define iscntrl(c)	((__ctype_ptr__)[(unsigned)((c)+1)]&_C)
>  
> -#if !defined(__STRICT_ANSI__) || __STDC_VERSION__ >= 199901L
> -#define isblank(c)      ((__ctype_ptr__)[(unsigned)((c)+1)]&_B)
> +#if defined(__GNUC__) && \
> +    (!defined(__STRICT_ANSI__) || __STDC_VERSION__ >= 199901L)
> +#define isblank(c) \
> +	__extension__ ({ int __c = (c); ((__ctype_ptr__)[(unsigned)((__c)+1)]&_B) || (__c) == '\t';})
>  #endif
>  
>  
>
>   



More information about the Newlib mailing list