Skip to content

Commit a4a2b27

Browse files
committed
Add bsearch and qsort tests
1 parent e47eaa9 commit a4a2b27

2 files changed

Lines changed: 90 additions & 0 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
extern crate libc;
2+
use libc::*;
3+
extern crate libcc2rs;
4+
use libcc2rs::*;
5+
use std::collections::BTreeMap;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::{AsFd, FromRawFd, IntoRawFd};
8+
use std::rc::Rc;
9+
pub unsafe fn cmp_int_0(mut a: *const ::libc::c_void, mut b: *const ::libc::c_void) -> i32 {
10+
let mut x: i32 = (*(a as *const i32));
11+
let mut y: i32 = (*(b as *const i32));
12+
return ((((x) > (y)) as i32) - (((x) < (y)) as i32));
13+
}
14+
pub fn main() {
15+
unsafe {
16+
std::process::exit(main_0() as i32);
17+
}
18+
}
19+
unsafe fn main_0() -> i32 {
20+
let mut arr: [i32; 8] = [5, 2, 9, 1, 7, 3, 8, 4];
21+
libc::qsort(
22+
(arr.as_mut_ptr() as *mut i32 as *mut ::libc::c_void),
23+
8_u64 as ::libc::size_t,
24+
::std::mem::size_of::<i32>() as u64 as ::libc::size_t,
25+
Some(std::mem::transmute::<
26+
*const (),
27+
unsafe extern "C" fn(*const ::libc::c_void, *const ::libc::c_void) -> i32,
28+
>(cmp_int_0 as *const ())),
29+
);
30+
let mut i: i32 = 0;
31+
'loop_: while ((((i) < (7)) as i32) != 0) {
32+
assert!(((((arr[(i) as usize]) <= (arr[((i) + (1)) as usize])) as i32) != 0));
33+
i.prefix_inc();
34+
}
35+
let mut key: i32 = 7;
36+
let mut hit: *mut i32 = (libc::bsearch(
37+
((&mut key as *mut i32) as *const i32 as *const ::libc::c_void),
38+
(arr.as_mut_ptr() as *const i32 as *const ::libc::c_void),
39+
8_u64 as ::libc::size_t,
40+
::std::mem::size_of::<i32>() as u64 as ::libc::size_t,
41+
Some(std::mem::transmute::<
42+
*const (),
43+
unsafe extern "C" fn(*const ::libc::c_void, *const ::libc::c_void) -> i32,
44+
>(cmp_int_0 as *const ())),
45+
) as *mut i32);
46+
assert!((((!((hit).is_null())) as i32) != 0));
47+
assert!(((((*hit) == (7)) as i32) != 0));
48+
let mut miss_key: i32 = 42;
49+
let mut miss: *mut i32 = (libc::bsearch(
50+
((&mut miss_key as *mut i32) as *const i32 as *const ::libc::c_void),
51+
(arr.as_mut_ptr() as *const i32 as *const ::libc::c_void),
52+
8_u64 as ::libc::size_t,
53+
::std::mem::size_of::<i32>() as u64 as ::libc::size_t,
54+
Some(std::mem::transmute::<
55+
*const (),
56+
unsafe extern "C" fn(*const ::libc::c_void, *const ::libc::c_void) -> i32,
57+
>(cmp_int_0 as *const ())),
58+
) as *mut i32);
59+
assert!(((((miss).is_null()) as i32) != 0));
60+
return 0;
61+
}

tests/unit/qsort_bsearch.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// no-compile: refcount
2+
#include <assert.h>
3+
#include <stdlib.h>
4+
#include <string.h>
5+
6+
static int cmp_int(const void *a, const void *b) {
7+
int x = *(const int *)a;
8+
int y = *(const int *)b;
9+
return (x > y) - (x < y);
10+
}
11+
12+
int main(void) {
13+
int arr[8] = {5, 2, 9, 1, 7, 3, 8, 4};
14+
qsort(arr, 8, sizeof(int), cmp_int);
15+
for (int i = 0; i < 7; ++i) {
16+
assert(arr[i] <= arr[i + 1]);
17+
}
18+
19+
int key = 7;
20+
int *hit = (int *)bsearch(&key, arr, 8, sizeof(int), cmp_int);
21+
assert(hit != NULL);
22+
assert(*hit == 7);
23+
24+
int miss_key = 42;
25+
int *miss = (int *)bsearch(&miss_key, arr, 8, sizeof(int), cmp_int);
26+
assert(miss == NULL);
27+
28+
return 0;
29+
}

0 commit comments

Comments
 (0)