Martin Schlemmer
2005-Mar-07 13:28 UTC
[klibc] Question about islower() in ctype.h (ANSI compat headers test)
Hi,
So far with the latest changes the projects I am trying to port works
fine, except for a mismatch on what is considered the ansi behaviour of
islower() in ctype.h:
-----
i = 220
islower (i) = 0, ISLOWER (i) = 0
toupper (i) = 220, TOUPPER (i) = 220
i = 221
islower (i) = 0, ISLOWER (i) = 0
toupper (i) = 221, TOUPPER (i) = 221
i = 222
islower (i) = 0, ISLOWER (i) = 0
toupper (i) = 222, TOUPPER (i) = 222
i = 223
islower (i) = 2, ISLOWER (i) = 0
toupper (i) = 223, TOUPPER (i) = 223
No Match!
nosferatu 1.0.0.rc6.klibc4 # cat foo.c
/* confdefs.h. */
#define PACKAGE_NAME ""
#define PACKAGE_TARNAME ""
#define PACKAGE_VERSION ""
#define PACKAGE_STRING ""
#define PACKAGE_BUGREPORT ""
#define HAVE_DIRENT_H 1
/* end confdefs.h. */
#include <ctype.h>
#if ((' ' & 0x0FF) == 0x020)
# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
# define ISLOWER(c) (('a' <= (c) && (c) <=
'i') || ('j' <= (c) && (c) <=
'r') || ('s' <= (c) && (c) <= 'z'))
# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif
#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
main ()
{
int i;
for (i = 0; i < 256; i++) {
printf("i = %i\n", i);
printf("islower (i) = %i, ISLOWER (i) = %i\n", islower (i),
ISLOWER (i));
printf("toupper (i) = %i, TOUPPER (i) = %i\n", toupper (i),
TOUPPER (i));
if (XOR (islower (i), ISLOWER (i))
|| toupper (i) != TOUPPER (i)) {
printf("No Match!\n");
exit(2);
}
}
exit (0);
}
nosferatu 1.0.0.rc6.klibc4 #
-----
Above is some output, and the test program (without the printf's) they
use. I have looked at ctype.h, and admitting that I have not really
tried to figure out the voodoo being used, want to know if cases like
this is seen as issues that should be fixed ... I understand that this
being a minimal library, size might be a factor in not making everything
100% ansi/whatever compliant ...
Thanks,
--
Martin Schlemmer
--
---------------------[ Ciphire Signature ]----------------------
From: azarah@nosferatu.za.org signed email body (1537 characters)
Date: on 07 March 2005 at 21:28:14 UTC
To: klibc@zytor.com
----------------------------------------------------------------
: Ciphire has secured this email against identity theft.
: Free download at www.ciphire.com. The garbled lines
: below are the sender's verifiable digital signature.
----------------------------------------------------------------
00fAAAAAEAAABuxyxCAQYAACcCAAIAAgACACAjYe/qeWoHRrdDE3mOifT0WPgp92
kbkclxgX1lQsV9VwEAJOQiG+Djg3e7Ai63e8AMF0Hl/gle8q4Ud88Lecx5fcVdfO
34ORi44kniJJSNDrTkjsUywGVN/QzXC0bqYwyV/Q=------------------[ End Ciphire Signed
Message ]----------------
H. Peter Anvin
2005-Mar-07 13:36 UTC
[klibc] Question about islower() in ctype.h (ANSI compat headers test)
Martin Schlemmer wrote:> Hi, > > So far with the latest changes the projects I am trying to port works > fine, except for a mismatch on what is considered the ansi behaviour of > islower() in ctype.h: > > ----- > i = 220 > islower (i) = 0, ISLOWER (i) = 0 > toupper (i) = 220, TOUPPER (i) = 220 > i = 221 > islower (i) = 0, ISLOWER (i) = 0 > toupper (i) = 221, TOUPPER (i) = 221 > i = 222 > islower (i) = 0, ISLOWER (i) = 0 > toupper (i) = 222, TOUPPER (i) = 222 > i = 223 > islower (i) = 2, ISLOWER (i) = 0 > toupper (i) = 223, TOUPPER (i) = 223 > No Match! > nosferatu 1.0.0.rc6.klibc4 # cat foo.c > /* confdefs.h. */ >man iso-8859-1 337 223 DF ?? LATIN SMALL LETTER SHARP S UnicodeData.txt 00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;German;;; (meaning: lower case, no upper case equivalent) Your ISLOWER() is broken and only applies to ASCII, so using it in the range > 127 is just crap. I chose to implement iso-8859-1 as a reasonable default for > 127, although one could argue that since the only thing one can rely upon is ASCII, I should just have stuck to it. -hpa