about summary refs log tree commit diff
path: root/sysdeps/generic
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-03-15 08:55:28 +0000
committerUlrich Drepper <drepper@redhat.com>2004-03-15 08:55:28 +0000
commit4f514b6bf2bdb23a144bf9c77ad34cde58f8c607 (patch)
tree70f106b455a03fa5b84d1fabe3428c4ebdc5e273 /sysdeps/generic
parent58101473df84b017e23c11ce0ccfb74a0766eb7a (diff)
downloadglibc-4f514b6bf2bdb23a144bf9c77ad34cde58f8c607.tar.gz
glibc-4f514b6bf2bdb23a144bf9c77ad34cde58f8c607.tar.xz
glibc-4f514b6bf2bdb23a144bf9c77ad34cde58f8c607.zip
Update.
2004-03-15  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/generic/strcasestr.c (__strcasestr): Optimize use of
	tolower function.
Diffstat (limited to 'sysdeps/generic')
-rw-r--r--sysdeps/generic/strcasestr.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/sysdeps/generic/strcasestr.c b/sysdeps/generic/strcasestr.c
index 6ceb2d7d83..6327dfab49 100644
--- a/sysdeps/generic/strcasestr.c
+++ b/sysdeps/generic/strcasestr.c
@@ -1,5 +1,5 @@
 /* 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
@@ -36,6 +36,13 @@
 # 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
@@ -48,11 +55,14 @@ __strcasestr (phaystack, pneedle)
 {
   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;
 
-  b = _tolower (*needle);
+  b = TOLOWER (*needle);
   if (b != '\0')
     {
       haystack--;				/* possible ANSI violation */
@@ -62,9 +72,9 @@ __strcasestr (phaystack, pneedle)
 	  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;
@@ -80,7 +90,7 @@ __strcasestr (phaystack, pneedle)
 	      a = *++haystack;
 	      if (a == '\0')
 		goto ret0;
-	      if (_tolower (a) == (int) b)
+	      if (TOLOWER (a) == (int) b)
 		break;
 	      a = *++haystack;
 	      if (a == '\0')
@@ -88,34 +98,34 @@ __strcasestr (phaystack, pneedle)
 shloop:
 	      ;
 	    }
-          while (_tolower (a) != (int) b);
+          while (TOLOWER (a) != (int) b);
 
 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;
-	  a = _tolower (*rneedle);
+	  a = TOLOWER (*rneedle);
 
-	  if (_tolower (*rhaystack) == (int) a)
+	  if (TOLOWER (*rhaystack) == (int) a)
 	    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;
-		a = _tolower (*++needle);
+		a = TOLOWER (*++needle);
 	      }
-	    while (_tolower (*rhaystack) == (int) a);
+	    while (TOLOWER (*rhaystack) == (int) a);
 
 	  needle = rneedle;		/* took the register-poor approach */