This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] More effective generic strrchr.


A generic implementation of strrchr could be improved by following
patch. As it is likely that last occurrence of c will be near we 
could quickly find it. This is also much faster for degenerate inputs
like:

strrchr("xyxyxyxyxyxyxyxyxyxyxyxyx...",'x');

where a loop slows us down.

	* string/strrchr.c: Improve implementation.

---
 string/strrchr.c | 19 ++-----------------
 1 file changed, 2 insertions(+), 17 deletions(-)

diff --git a/string/strrchr.c b/string/strrchr.c
index bdec841..ad242b6 100644
--- a/string/strrchr.c
+++ b/string/strrchr.c
@@ -23,23 +23,8 @@
 char *
 strrchr (const char *s, int c)
 {
-  const char *found, *p;
-
-  c = (unsigned char) c;
-
-  /* Since strchr is fast, we use it rather than the obvious loop.  */
-
-  if (c == '\0')
-    return strchr (s, '\0');
-
-  found = NULL;
-  while ((p = strchr (s, c)) != NULL)
-    {
-      found = p;
-      s = p + 1;
-    }
-
-  return (char *) found;
+  /* We need to include terminating zero for case c == 0.  */
+  return __memrchr (s, c, strlen (s) + 1);
 }
 
 #ifdef weak_alias
-- 
1.8.4.rc3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]