diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs index b639cf2e53..962c8f761d 100644 --- a/src/string/src/lib.rs +++ b/src/string/src/lib.rs @@ -255,8 +255,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 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/.gitignore b/tests/.gitignore index 929fcc62d7..c5a743e74f 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -32,6 +32,7 @@ /string/strncmp /string/strcspn /string/strchr +/string/strrchr /string/strspn /unlink /write diff --git a/tests/Makefile b/tests/Makefile index 49c313a55d..ea41ffa7a2 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -27,6 +27,7 @@ BINS=\ string/strncmp \ string/strcspn \ string/strchr \ + string/strrchr \ string/strspn \ unlink \ write diff --git a/tests/string/strrchr.c b/tests/string/strrchr.c new file mode 100644 index 0000000000..7edc98040b --- /dev/null +++ b/tests/string/strrchr.c @@ -0,0 +1,22 @@ +#include +#include + + +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; +}