Implement wcscasecmp and wcsncasecmp

This patch implements wcscasecmp and wcsncasecmp. These two
function are required for binutils to link against relibc.
This commit is contained in:
oddcoder
2020-04-26 12:39:18 +02:00
parent 9725d3418a
commit eac69c920d
+32
View File
@@ -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;
}
}