diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2009-04-23 18:11:22 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2009-04-23 18:11:22 +0000 |
commit | 5921804481c346f032a24c19fc294cc5690e0f3b (patch) | |
tree | 3e71f94ad0832136ea7da2bfd4d0ad3c1ec1398c /newlib/libc/string/strcasecmp.c | |
parent | bbb9d4fde31f44a70a6fb42181dc86cb91791d7e (diff) | |
download | newlib-5921804481c346f032a24c19fc294cc5690e0f3b.zip newlib-5921804481c346f032a24c19fc294cc5690e0f3b.tar.gz newlib-5921804481c346f032a24c19fc294cc5690e0f3b.tar.bz2 |
2009-04-23 Mike Burgess <wizardsguild@earthlink.net>
* libc/string/strcasecmp.c: Optimized rewrite.
* libc/string/strncasecmp.c: Fix description.
* libc/string/strlwr.c: Avoid passing signed char to tolower.
* libc/string/strupr.c: Avoid passing signed char to tolower.
Diffstat (limited to 'newlib/libc/string/strcasecmp.c')
-rw-r--r-- | newlib/libc/string/strcasecmp.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/newlib/libc/string/strcasecmp.c b/newlib/libc/string/strcasecmp.c index f96f7f5..73cf866 100644 --- a/newlib/libc/string/strcasecmp.c +++ b/newlib/libc/string/strcasecmp.c @@ -22,7 +22,7 @@ DESCRIPTION RETURNS If <<*<[a]>>> sorts lexicographically after <<*<[b]>>> (after - both are converted to uppercase), <<strcasecmp>> returns a + both are converted to lowercase), <<strcasecmp>> returns a number greater than zero. If the two strings match, <<strcasecmp>> returns zero. If <<*<[a]>>> sorts lexicographically before <<*<[b]>>>, <<strcasecmp>> returns a @@ -35,7 +35,7 @@ PORTABILITY tolower() from elsewhere in this library. QUICKREF - strcasecmp + strcasecmp */ #include <string.h> @@ -46,11 +46,15 @@ _DEFUN (strcasecmp, (s1, s2), _CONST char *s1 _AND _CONST char *s2) { - while (*s1 != '\0' && tolower(*s1) == tolower(*s2)) + _CONST unsigned char *ucs1 = (_CONST unsigned char *) s1; + _CONST unsigned char *ucs2 = (_CONST unsigned char *) s2; + int d = 0; + for ( ; ; ) { - s1++; - s2++; + _CONST int c1 = tolower(*ucs1++); + _CONST int c2 = tolower(*ucs2++); + if (((d = c1 - c2) != 0) || (c2 == '\0')) + break; } - - return tolower(*(unsigned char *) s1) - tolower(*(unsigned char *) s2); + return d; } |