From d62db7b1b9647bb8330841ec12975cf576eb422d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= <matti@marinelayer.io>
Date: Fri, 3 May 2019 18:16:48 +0200
Subject: [PATCH] Add memrchr()

---
 src/header/string/mod.rs         | 14 ++++++++++++++
 tests/expected/string/mem.stdout |  1 +
 tests/string/mem.c               |  5 +++++
 3 files changed, 20 insertions(+)

diff --git a/src/header/string/mod.rs b/src/header/string/mod.rs
index e58e5beb6..1bec129c0 100644
--- a/src/header/string/mod.rs
+++ b/src/header/string/mod.rs
@@ -107,6 +107,20 @@ pub unsafe extern "C" fn memmove(s1: *mut c_void, s2: *const c_void, n: size_t)
     s1
 }
 
+#[no_mangle]
+pub unsafe extern "C" fn memrchr(
+    haystack: *const c_void,
+    needle: c_int,
+    len: size_t,
+) -> *mut c_void {
+    let haystack = slice::from_raw_parts(haystack as *const u8, len as usize);
+
+    match memchr::memrchr(needle as u8, haystack) {
+        Some(index) => haystack[index..].as_ptr() as *mut c_void,
+        None => ptr::null_mut(),
+    }
+}
+
 #[no_mangle]
 pub unsafe extern "C" fn memset(s: *mut c_void, c: c_int, n: size_t) -> *mut c_void {
     for i in 0..n {
diff --git a/tests/expected/string/mem.stdout b/tests/expected/string/mem.stdout
index 1d74e9a77..a6c001081 100644
--- a/tests/expected/string/mem.stdout
+++ b/tests/expected/string/mem.stdout
@@ -1,4 +1,5 @@
 # mem #
 Correct memchr
+Correct memrchr
 Correct memccpy
 Correct memcmp
diff --git a/tests/string/mem.c b/tests/string/mem.c
index 5b1b497b4..7529a3bb1 100644
--- a/tests/string/mem.c
+++ b/tests/string/mem.c
@@ -14,6 +14,11 @@ int main(void) {
         exit(EXIT_FAILURE);
     }
     puts("Correct memchr");
+    if ((size_t)memrchr((void *)arr, 1, 100) - (size_t)arr != 50) {
+        puts("Incorrect memrchr");
+        exit(EXIT_FAILURE);
+    }
+    puts("Correct memrchr");
     char arr2[51];
     memset(arr2, 0, 51); // Compiler builtin, should work
     memccpy((void *)arr2, (void *)arr, 1, 100);
-- 
GitLab