From eac69c920d53b55880c7de3ad0bd6f1644585b1e Mon Sep 17 00:00:00 2001 From: oddcoder Date: Sun, 26 Apr 2020 12:39:18 +0200 Subject: [PATCH] Implement wcscasecmp and wcsncasecmp This patch implements wcscasecmp and wcsncasecmp. These two function are required for binutils to link against relibc. --- src/header/wchar/mod.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/header/wchar/mod.rs b/src/header/wchar/mod.rs index ad371d8c68..4c4a281bbd 100644 --- a/src/header/wchar/mod.rs +++ b/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; + } +}