diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs index a3d454fe7efd5765d9e90e6c93496cd9c5c2477c..bbb1a53c694a33b8063f0e4b7c2c7f55d49c2772 100644 --- a/src/string/src/lib.rs +++ b/src/string/src/lib.rs @@ -223,8 +223,17 @@ pub extern "C" fn strpbrk(s1: *const c_char, s2: *const c_char) -> *mut c_char { } #[no_mangle] -pub extern "C" fn strrchr(s: *const c_char, c: c_int) -> *mut c_char { - unimplemented!(); +pub unsafe extern "C" fn strrchr(s: *const c_char, c: c_int) -> *mut c_char { + let len = strlen(s) as isize; + let c = c as i8; + let mut i = len - 1; + while *s.offset(i) != 0 && i >= 0 { + if *s.offset(i) == c { + return s.offset(i) as *mut c_char; + } + i -= 1; + } + ptr::null_mut() } #[no_mangle] diff --git a/tests/Makefile b/tests/Makefile index 0726ba101ba745a2b509f969758060414efb1483..8ca12a9a8d59cc50bd5070260e3afd5d4a26e19d 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -25,6 +25,7 @@ BINS=\ sprintf \ stdlib/strtol \ string/strncmp \ + string/strrchr \ unlink \ write diff --git a/tests/string/strrchr.c b/tests/string/strrchr.c new file mode 100644 index 0000000000000000000000000000000000000000..7edc98040b36fb4cdafd327384c9d840a74c0ee3 --- /dev/null +++ b/tests/string/strrchr.c @@ -0,0 +1,22 @@ +#include <string.h> +#include <stdio.h> + + +int main(int argc, char* argv[]) { + char s0[] = "hello, world"; + char* ptr = strrchr(s0, 'l'); + if (ptr != &s0[10]) { + printf("%p != %p\n", ptr, &s0[10]); + printf("strrchr FAIL , exit with status code %d\n", 1); + return 1; + } + char s1[] = ""; + ptr = strrchr(s1, 'a'); + if (ptr != NULL) { + printf("%p != 0\n", ptr); + printf("strrchr FAIL, exit with status code %d\n", 1); + return 1; + } + printf("strrch PASS, exiting with status code %d\n", 0); + return 0; +}