فهرست منبع

Implement wcscasecmp and wcsncasecmp

This patch implements wcscasecmp and wcsncasecmp. These two
function are required for binutils to link against relibc.
oddcoder 5 سال پیش
والد
کامیت
eac69c920d
1فایلهای تغییر یافته به همراه32 افزوده شده و 0 حذف شده
  1. 32 0
      src/header/wchar/mod.rs

+ 32 - 0
src/header/wchar/mod.rs

@@ -726,3 +726,35 @@ pub extern "C" fn wprintf(format: *const wchar_t, ap: va_list) -> c_int {
 pub extern "C" fn wscanf(format: *const wchar_t, ap: va_list) -> c_int {
     unimplemented!();
 }
+
+#[no_mangle]
+pub extern "C" fn wcscasecmp(mut s1: *const wchar_t, mut s2: *const wchar_t) -> c_int {
+    unsafe {
+        while *s1 != 0 && *s2 != 0 {
+            if towlower(*s1 as wint_t) != towlower(*s2 as wint_t) {
+                break;
+            }
+            s1 = s1.add(1);
+            s2 = s2.add(1);
+        }
+        let result = towlower(*s1 as wint_t).wrapping_sub(towlower(*s2 as wint_t));
+        return result as c_int;
+    }
+}
+
+#[no_mangle]
+pub extern "C" fn wcsncasecmp(mut s1: *const wchar_t, mut s2: *const wchar_t, n: size_t) -> c_int {
+    if n == 0 {
+        return 0;
+    }
+    unsafe {
+        for _ in 0..n {
+            if *s1 == 0 || *s2 == 0 || towlower(*s1 as wint_t) != towlower(*s2 as wint_t) {
+                return towlower(*s1 as wint_t).wrapping_sub(towlower(*s2 as wint_t)) as c_int;
+            }
+            s1 = s1.add(1);
+            s2 = s2.add(1);
+        }
+        return 0;
+    }
+}