]> granicus.if.org Git - curl/commitdiff
Curl_ascii_equal() must not assume that the string is actually ASCII (so that a-z
authorDaniel Stenberg <daniel@haxx.se>
Thu, 16 Oct 2008 07:59:00 +0000 (07:59 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 16 Oct 2008 07:59:00 +0000 (07:59 +0000)
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...

lib/strequal.c

index c1a82f789395d70baa87763b453cd2cdf9fe4541..53654c68a3fc50f0d3be3cdfb40cfe5c6f1d7277 100644 (file)
@@ -76,6 +76,67 @@ int curl_strnequal(const char *first, const char *second, size_t max)
 #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
  * 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
  * 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)
 {
   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 */
       break;
     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
      loop above is skipped because one of the strings reached zero, we must not
      return this as a successful match */
-  return (TOASCIIUPPER(*first) == TOASCIIUPPER(*second));
+  return (my_toupper(*first) == my_toupper(*second));
 }
 
 #ifndef HAVE_STRLCAT