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