1use core::ffi::c_int;
4
5pub 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#[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; } else if cmp < 0 {
42 right = mid; } else {
44 left = mid + 1; }
46 }
47
48 core::ptr::null_mut() }