Skip to main content

c_compat/
stdlib.rs

1//! stdlib.h Rust implementations
2
3use core::ffi::c_int;
4
5// Re-export straight from dependency
6pub use tinyrlibc::qsort;
7
8#[unsafe(no_mangle)]
9pub unsafe extern "C" fn abs(n: c_int) -> c_int {
10    n.abs()
11}
12
13// FIXME: Not thoroughly checked and tested
14#[unsafe(no_mangle)]
15pub unsafe extern "C" fn bsearch(
16    key: *const core::ffi::c_void,
17    base: *const core::ffi::c_void,
18    nmemb: usize,
19    size: usize,
20    compar: unsafe extern "C" fn(
21        *const core::ffi::c_void,
22        *const core::ffi::c_void,
23    ) -> core::ffi::c_int,
24) -> *mut core::ffi::c_void {
25    if base.is_null() || compar as usize == 0 || size == 0 {
26        return core::ptr::null_mut();
27    }
28
29    let base_ptr = base as *const u8;
30    let mut left = 0;
31    let mut right = nmemb;
32
33    while left < right {
34        let mid = left + (right - left) / 2;
35        let mid_ptr = unsafe { base_ptr.add(mid * size) as *const core::ffi::c_void };
36
37        let cmp = unsafe { compar(key, mid_ptr) };
38
39        if cmp == 0 {
40            return mid_ptr as *mut core::ffi::c_void; /* Found */
41        } else if cmp < 0 {
42            right = mid; /* Search left half */
43        } else {
44            left = mid + 1; /* Search right half */
45        }
46    }
47
48    core::ptr::null_mut() /* Not found */
49}