From 4ed6dca61d4996cb626207c3f5d21c303a61737d Mon Sep 17 00:00:00 2001 From: emturner <em.turner@tutanota.com> Date: Mon, 25 Feb 2019 22:53:11 +0000 Subject: [PATCH] implements wcsrchr from wchar.h --- src/header/wchar/mod.rs | 16 +++++++++++++--- tests/Makefile | 3 ++- tests/expected/wchar/wcsrchr.stderr | 0 tests/expected/wchar/wcsrchr.stdout | 0 tests/wchar/wcsrchr.c | 24 ++++++++++++++++++++++++ 5 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 tests/expected/wchar/wcsrchr.stderr create mode 100644 tests/expected/wchar/wcsrchr.stdout create mode 100644 tests/wchar/wcsrchr.c diff --git a/src/header/wchar/mod.rs b/src/header/wchar/mod.rs index 19d8fbea6..00fc9365a 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 0ae8aa786..b2e5396fd 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 000000000..e69de29bb diff --git a/tests/expected/wchar/wcsrchr.stdout b/tests/expected/wchar/wcsrchr.stdout new file mode 100644 index 000000000..e69de29bb diff --git a/tests/wchar/wcsrchr.c b/tests/wchar/wcsrchr.c new file mode 100644 index 000000000..08b43ea0f --- /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; +} -- GitLab