c-scape 0.22.3

A libc bottom-half implementation in Rust
Documentation
use core::ptr::null_mut;
use libc::{c_int, c_void, size_t};

#[no_mangle]
unsafe extern "C" fn bsearch(
    key: *const c_void,
    base: *const c_void,
    nmemb: size_t,
    width: size_t,
    compar: Option<unsafe extern "C" fn(*const c_void, *const c_void) -> c_int>,
) -> *mut c_void {
    libc!(libc::bsearch(key, base, nmemb, width, compar));

    let compar = compar.unwrap();
    let mut base = base.cast::<u8>();
    let mut nmemb = nmemb;

    while nmemb > 0 {
        let half = nmemb / 2;
        let mid = base.add(width * half);
        let sign = compar(key, mid.cast::<c_void>());
        if sign < 0 {
            nmemb = half;
        } else if sign > 0 {
            base = mid.add(width);
            nmemb -= half + 1;
        } else {
            return mid.cast::<c_void>().cast_mut();
        }
    }

    null_mut()
}