Browse Source

implements wcsrchr from wchar.h

emturner 6 years ago
parent
commit
4ed6dca61d

+ 13 - 3
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]

+ 2 - 1
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=\

+ 0 - 0
tests/expected/wchar/wcsrchr.stderr


+ 0 - 0
tests/expected/wchar/wcsrchr.stdout


+ 24 - 0
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;
+}