Curl_ascii_equal() must not assume that the string is actually ASCII (so that a-z

are consecutive and with a 0x20 "distance" to the uppercase letter), since we do
support EBCDIC as well. Thus I replaced the macro with a (larger) switch case.

I better change the function name...
This commit is contained in:
Daniel Stenberg 2008-10-16 07:59:00 +00:00
parent fb66d51796
commit 545cafce9b

View File

@ -76,6 +76,67 @@ int curl_strnequal(const char *first, const char *second, size_t max)
#endif #endif
} }
/* Portable toupper (remember EBCDIC). Do not use tupper() because
its behavior is altered by the current locale. */
static bool my_toupper(unsigned char in)
{
switch (in) {
case 'a':
return 'A';
case 'b':
return 'B';
case 'c':
return 'C';
case 'd':
return 'D';
case 'e':
return 'E';
case 'f':
return 'F';
case 'g':
return 'G';
case 'h':
return 'H';
case 'i':
return 'I';
case 'j':
return 'J';
case 'k':
return 'K';
case 'l':
return 'L';
case 'm':
return 'M';
case 'n':
return 'N';
case 'o':
return 'O';
case 'p':
return 'P';
case 'q':
return 'Q';
case 'r':
return 'R';
case 's':
return 'S';
case 't':
return 'T';
case 'u':
return 'U';
case 'v':
return 'V';
case 'w':
return 'W';
case 'x':
return 'X';
case 'y':
return 'Y';
case 'z':
return 'Z';
}
return in;
}
/* /*
* Curl_ascii_equal() is for doing "ascii" case insensitive strings. This is * Curl_ascii_equal() is for doing "ascii" case insensitive strings. This is
* meant to be locale independent and only compare strings we know are safe * meant to be locale independent and only compare strings we know are safe
@ -83,12 +144,11 @@ int curl_strnequal(const char *first, const char *second, size_t max)
* See http://daniel.haxx.se/blog/2008/10/15/strcasecmp-in-turkish/ for some * See http://daniel.haxx.se/blog/2008/10/15/strcasecmp-in-turkish/ for some
* further explanation to why this function is necessary. * further explanation to why this function is necessary.
*/ */
#define TOASCIIUPPER(x) ((((x) >= 'a') && ((x) <= 'z'))?((x) - 0x20):(x))
int Curl_ascii_equal(const char *first, const char *second) int Curl_ascii_equal(const char *first, const char *second)
{ {
while(*first && *second) { while(*first && *second) {
if(! (TOASCIIUPPER(*first) == TOASCIIUPPER(*second))) if(! (my_toupper(*first) == my_toupper(*second)))
/* get out of the loop as soon as they don't match */ /* get out of the loop as soon as they don't match */
break; break;
first++; first++;
@ -97,7 +157,7 @@ int Curl_ascii_equal(const char *first, const char *second)
/* we do the comparison here (possibly again), just to make sure that if the /* we do the comparison here (possibly again), just to make sure that if the
loop above is skipped because one of the strings reached zero, we must not loop above is skipped because one of the strings reached zero, we must not
return this as a successful match */ return this as a successful match */
return (TOASCIIUPPER(*first) == TOASCIIUPPER(*second)); return (my_toupper(*first) == my_toupper(*second));
} }
#ifndef HAVE_STRLCAT #ifndef HAVE_STRLCAT