(__strcasestr): Optimize use of tolower function.
authordrepper <drepper>
Mon, 15 Mar 2004 08:54:41 +0000 (08:54 +0000)
committerdrepper <drepper>
Mon, 15 Mar 2004 08:54:41 +0000 (08:54 +0000)
sysdeps/generic/strcasestr.c

index 6ceb2d7..6327dfa 100644 (file)
@@ -1,5 +1,5 @@
 /* Return the offset of one string within another.
 /* Return the offset of one string within another.
-   Copyright (C) 1994,1996,1997,1998,1999,2000 Free Software Foundation, Inc.
+   Copyright (C) 1994, 1996-2000, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
 # include <string.h>
 #endif
 
 # include <string.h>
 #endif
 
+#ifdef _LIBC
+# include <locale/localeinfo.h>
+# define TOLOWER(c) __tolower_l (c, loc)
+#else
+# define TOLOWER(c) _tolower (c)
+#endif
+
 typedef unsigned chartype;
 
 #undef strcasestr
 typedef unsigned chartype;
 
 #undef strcasestr
@@ -48,11 +55,14 @@ __strcasestr (phaystack, pneedle)
 {
   register const unsigned char *haystack, *needle;
   register chartype b, c;
 {
   register const unsigned char *haystack, *needle;
   register chartype b, c;
+#ifdef _LIBC
+  __locale_t loc = _NL_CURRENT_LOCALE;
+#endif
 
   haystack = (const unsigned char *) phaystack;
   needle = (const unsigned char *) pneedle;
 
 
   haystack = (const unsigned char *) phaystack;
   needle = (const unsigned char *) pneedle;
 
-  b = _tolower (*needle);
+  b = TOLOWER (*needle);
   if (b != '\0')
     {
       haystack--;                              /* possible ANSI violation */
   if (b != '\0')
     {
       haystack--;                              /* possible ANSI violation */
@@ -62,9 +72,9 @@ __strcasestr (phaystack, pneedle)
          if (c == '\0')
            goto ret0;
        }
          if (c == '\0')
            goto ret0;
        }
-      while (_tolower (c) != (int) b);
+      while (TOLOWER (c) != (int) b);
 
 
-      c = _tolower (*++needle);
+      c = TOLOWER (*++needle);
       if (c == '\0')
        goto foundneedle;
       ++needle;
       if (c == '\0')
        goto foundneedle;
       ++needle;
@@ -80,7 +90,7 @@ __strcasestr (phaystack, pneedle)
              a = *++haystack;
              if (a == '\0')
                goto ret0;
              a = *++haystack;
              if (a == '\0')
                goto ret0;
-             if (_tolower (a) == (int) b)
+             if (TOLOWER (a) == (int) b)
                break;
              a = *++haystack;
              if (a == '\0')
                break;
              a = *++haystack;
              if (a == '\0')
@@ -88,34 +98,34 @@ __strcasestr (phaystack, pneedle)
 shloop:
              ;
            }
 shloop:
              ;
            }
-          while (_tolower (a) != (int) b);
+          while (TOLOWER (a) != (int) b);
 
 jin:     a = *++haystack;
          if (a == '\0')
            goto ret0;
 
 
 jin:     a = *++haystack;
          if (a == '\0')
            goto ret0;
 
-         if (_tolower (a) != (int) c)
+         if (TOLOWER (a) != (int) c)
            goto shloop;
 
          rhaystack = haystack-- + 1;
          rneedle = needle;
            goto shloop;
 
          rhaystack = haystack-- + 1;
          rneedle = needle;
-         a = _tolower (*rneedle);
+         a = TOLOWER (*rneedle);
 
 
-         if (_tolower (*rhaystack) == (int) a)
+         if (TOLOWER (*rhaystack) == (int) a)
            do
              {
                if (a == '\0')
                  goto foundneedle;
                ++rhaystack;
            do
              {
                if (a == '\0')
                  goto foundneedle;
                ++rhaystack;
-               a = _tolower (*++needle);
-               if (_tolower (*rhaystack) != (int) a)
+               a = TOLOWER (*++needle);
+               if (TOLOWER (*rhaystack) != (int) a)
                  break;
                if (a == '\0')
                  goto foundneedle;
                ++rhaystack;
                  break;
                if (a == '\0')
                  goto foundneedle;
                ++rhaystack;
-               a = _tolower (*++needle);
+               a = TOLOWER (*++needle);
              }
              }
-           while (_tolower (*rhaystack) == (int) a);
+           while (TOLOWER (*rhaystack) == (int) a);
 
          needle = rneedle;             /* took the register-poor approach */
 
 
          needle = rneedle;             /* took the register-poor approach */