From 6597f9ac133fd4f47dea307d6260fd52eae77816 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Wed, 13 Apr 2011 08:36:29 -0400 Subject: implement memrchr (nonstandard) and optimize strrchr in terms of it --- include/string.h | 1 + src/string/memrchr.c | 12 ++++++++++++ src/string/strrchr.c | 7 +++---- 3 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 src/string/memrchr.c diff --git a/include/string.h b/include/string.h index c755c601..4fc89e94 100644 --- a/include/string.h +++ b/include/string.h @@ -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 index 00000000..a78e9d6c --- /dev/null +++ b/src/string/memrchr.c @@ -0,0 +1,12 @@ +#include +#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 +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.1