aboutsummaryrefslogtreecommitdiff
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.zip
glibc-4f514b6bf2bdb23a144bf9c77ad34cde58f8c607.tar.gz
glibc-4f514b6bf2bdb23a144bf9c77ad34cde58f8c607.tar.bz2
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 6ceb2d7..6327dfa 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 */