diff --git a/src/header/wchar/mod.rs b/src/header/wchar/mod.rs index 19d8fbea62066369724494f4af6abf9a07961519..00fc9365a1030905b600849e3a1d9cd8441621d5 100644 --- a/src/header/wchar/mod.rs +++ b/src/header/wchar/mod.rs @@ -430,9 +430,19 @@ pub extern "C" fn wcspbrk(ws1: *const wchar_t, ws2: *const wchar_t) -> *mut wcha unimplemented!(); } -// #[no_mangle] -pub extern "C" fn wcsrchr(ws1: *const wchar_t, ws2: wchar_t) -> *mut wchar_t { - unimplemented!(); +#[no_mangle] +pub unsafe extern "C" fn wcsrchr(ws1: *const wchar_t, wc: wchar_t) -> *mut wchar_t { + let mut last_matching_wc = 0 as *const wchar_t; + let mut i = 0; + + while *ws1.add(i) != 0 { + if *ws1.add(i) == wc { + last_matching_wc = ws1.add(i); + } + i += 1; + } + + last_matching_wc as *mut wchar_t } // #[no_mangle] diff --git a/tests/Makefile b/tests/Makefile index 0ae8aa78680963d41af4aff816f3485a8d64c82d..b2e5396fdc01373def7ca24cbf6a14841563fb99 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -87,7 +87,8 @@ EXPECT_BINS=\ wchar/mbsrtowcs \ wchar/putwchar \ wchar/wcrtomb \ - wchar/wcscspn + wchar/wcscspn \ + wchar/wcsrchr # Binaries that may generate varied output BINS=\ diff --git a/tests/expected/wchar/wcsrchr.stderr b/tests/expected/wchar/wcsrchr.stderr new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/expected/wchar/wcsrchr.stdout b/tests/expected/wchar/wcsrchr.stdout new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/wchar/wcsrchr.c b/tests/wchar/wcsrchr.c new file mode 100644 index 0000000000000000000000000000000000000000..08b43ea0fc368bf47ade150ef218c5f5901594ba --- /dev/null +++ b/tests/wchar/wcsrchr.c @@ -0,0 +1,24 @@ +#include <assert.h> +#include <wchar.h> + +int main() { + wchar_t *s; + + assert(wcsrchr(L"", L'a') == NULL); + + s = L"a"; + assert(wcsrchr(s, L'a') == s); + + s = L"aa"; + assert(wcsrchr(s, L'a') == s + 1); + + s = L"aab"; + assert(wcsrchr(s, L'a') == s + 1); + + s = L"abcdef!\"£$%^e&*"; + assert(wcsrchr(s, L'g') == NULL); + assert(wcsrchr(s, L'\"') == s + 7); + assert(wcsrchr(s, L'e') == s + 12); + + return 0; +}