From 6597f9ac133fd4f47dea307d6260fd52eae77816 Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Wed, 13 Apr 2011 08:36:29 -0400
Subject: implement memrchr (nonstandard) and optimize strrchr in terms of it

---
 src/string/memrchr.c | 12 ++++++++++++
 src/string/strrchr.c |  7 +++----
 2 files changed, 15 insertions(+), 4 deletions(-)
 create mode 100644 src/string/memrchr.c

(limited to 'src/string')

diff --git a/src/string/memrchr.c b/src/string/memrchr.c
new file mode 100644
index 00000000..a78e9d6c
--- /dev/null
+++ b/src/string/memrchr.c
@@ -0,0 +1,12 @@
+#include <string.h>
+#include "libc.h"
+
+void *__memrchr(const void *m, int c, size_t n)
+{
+	const unsigned char *s = m;
+	c = (unsigned char)c;
+	while (n--) if (s[n]==c) return (void *)(s+n);
+	return 0;
+}
+
+weak_alias(__memrchr, memrchr);
diff --git a/src/string/strrchr.c b/src/string/strrchr.c
index 31c8e0b8..9c683087 100644
--- a/src/string/strrchr.c
+++ b/src/string/strrchr.c
@@ -1,9 +1,8 @@
 #include <string.h>
 
+void *__memrchr(const void *, int, size_t);
+
 char *strrchr(const char *s, int c)
 {
-	const char *p;
-	c = (char)c;
-	for (p=s+strlen(s); p>=s && *p!=c; p--);
-	return p>=s ? (char *)p : 0;
+	return __memrchr(s, c, strlen(s));
 }
-- 
cgit v1.2.3-70-g09d2