From 82b77480f797603e3425228b83ed3c0cbc2a2977 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Thu, 30 Apr 2009 22:53:00 +0000 Subject: [PATCH] Allow gcc warning for toupper even with extended charsets. * libc/include/ctype.h (toupper, tolower) [_MB_EXTENDED_CHARSETS_ISO]: Allow gcc warning when called with 'char' even when we must call the function for correct behavior. [!_MB_EXTENDED_CHARSETS_ISO]: Fix regression in result type. --- newlib/ChangeLog | 8 ++++++++ newlib/libc/include/ctype.h | 23 +++++++++++++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 64a6a1eb5..251c90334 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,11 @@ +2009-04-30 Eric Blake + + Allow gcc warning for toupper even with extended charsets. + * libc/include/ctype.h (toupper, tolower) + [_MB_EXTENDED_CHARSETS_ISO]: Allow gcc warning when called with + 'char' even when we must call the function for correct behavior. + [!_MB_EXTENDED_CHARSETS_ISO]: Fix regression in result type. + 2009-04-24 Jeff johnston * libc/stdio/fgetc.c: Make sure sfp lock is acquired before the diff --git a/newlib/libc/include/ctype.h b/newlib/libc/include/ctype.h index acded28e8..e1d2d01c8 100644 --- a/newlib/libc/include/ctype.h +++ b/newlib/libc/include/ctype.h @@ -71,14 +71,25 @@ extern __IMPORT char *__ctype_ptr__; /* Non-gcc versions will get the library versions, and will be slightly slower. These macros are not NLS-aware so they are disabled if the system supports the extended character sets. */ -# if defined(__GNUC__) && !defined (_MB_EXTENDED_CHARSETS_ISO) && !defined (_MB_EXTENDED_CHARSETS_WINDOWS) -# define toupper(__c) \ +# if defined(__GNUC__) +# if !defined (_MB_EXTENDED_CHARSETS_ISO) && !defined (_MB_EXTENDED_CHARSETS_WINDOWS) +# define toupper(__c) \ __extension__ ({ __typeof__ (__c) __x = (__c); \ - islower(__x) ? (__x - 'a' + 'A') : __x;}) -# define tolower(__c) \ + islower (__x) ? (int) __x - 'a' + 'A' : (int) __x;}) +# define tolower(__c) \ __extension__ ({ __typeof__ (__c) __x = (__c); \ - isupper(__x) ? (__x - 'A' + 'a') : __x;}) -#endif + isupper (__x) ? (int) __x - 'A' + 'a' : (int) __x;}) +# else /* _MB_EXTENDED_CHARSETS* */ +/* Allow a gcc warning if the user passed 'char', but defer to the + function. */ +# define toupper(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + (void) __ctype_ptr__[__x]; (toupper) (__x);}) +# define tolower(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + (void) __ctype_ptr__[__x]; (tolower) (__x);}) +# endif /* _MB_EXTENDED_CHARSETS* */ +# endif /* __GNUC__ */ #endif /* !__cplusplus */ #ifndef __STRICT_ANSI__