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