implement memrchr (nonstandard) and optimize strrchr in terms of it
authorRich Felker <dalias@aerifal.cx>
Wed, 13 Apr 2011 12:36:29 +0000 (08:36 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 13 Apr 2011 12:36:29 +0000 (08:36 -0400)
include/string.h
src/string/memrchr.c [new file with mode: 0644]
src/string/strrchr.c

index c755c60..4fc89e9 100644 (file)
@@ -74,6 +74,7 @@ int strncasecmp (const char *, const char *, size_t);
 char *strchrnul(const char *, int);
 char *strcasestr(const char *, const char *);
 char *strsep(char **, const char *);
+void *memrchr(const void *, int, size_t);
 #endif
 
 #ifdef __cplusplus
diff --git a/src/string/memrchr.c b/src/string/memrchr.c
new file mode 100644 (file)
index 0000000..a78e9d6
--- /dev/null
@@ -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);
index 31c8e0b..9c68308 100644 (file)
@@ -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));
 }