1*9ab590e3SVitaly Buka // Check interceptor.
2*9ab590e3SVitaly Buka // RUN: %clangxx -O0 %s -o %t && %run %t 2>&1 | FileCheck %s
3*9ab590e3SVitaly Buka
4*9ab590e3SVitaly Buka // Inlined bsearch works even without interceptors.
5*9ab590e3SVitaly Buka // RUN: %clangxx -O2 %s -o %t && %run %t 2>&1 | FileCheck %s
6*9ab590e3SVitaly Buka
7*9ab590e3SVitaly Buka #include <stdio.h>
8*9ab590e3SVitaly Buka #include <stdlib.h>
9*9ab590e3SVitaly Buka
10*9ab590e3SVitaly Buka static int arr1[] = {8, 7, 6, 5, 4, 3, 2, 1, 0};
11*9ab590e3SVitaly Buka static int arr2[] = {10, 1, 1, 3, 4, 6, 7, 7};
12*9ab590e3SVitaly Buka
13*9ab590e3SVitaly Buka #define array_size(x) (sizeof(x) / sizeof(x[0]))
14*9ab590e3SVitaly Buka
cmp_ints(const void * a,const void * b)15*9ab590e3SVitaly Buka static int cmp_ints(const void *a, const void *b) {
16*9ab590e3SVitaly Buka return *(const int *)b - *(const int *)a;
17*9ab590e3SVitaly Buka }
18*9ab590e3SVitaly Buka
cmp_pos(const void * a,const void * b)19*9ab590e3SVitaly Buka static int cmp_pos(const void *a, const void *b) {
20*9ab590e3SVitaly Buka const int *ap =
21*9ab590e3SVitaly Buka (const int *)bsearch(a, arr1, array_size(arr1), sizeof(int), &cmp_ints);
22*9ab590e3SVitaly Buka if (!ap)
23*9ab590e3SVitaly Buka ap = arr1 + array_size(arr1);
24*9ab590e3SVitaly Buka const int *bp =
25*9ab590e3SVitaly Buka (const int *)bsearch(b, arr1, array_size(arr1), sizeof(int), &cmp_ints);
26*9ab590e3SVitaly Buka if (!bp)
27*9ab590e3SVitaly Buka bp = arr1 + array_size(arr1);
28*9ab590e3SVitaly Buka return bp - ap;
29*9ab590e3SVitaly Buka }
30*9ab590e3SVitaly Buka
main()31*9ab590e3SVitaly Buka int main() {
32*9ab590e3SVitaly Buka // Simple bsearch.
33*9ab590e3SVitaly Buka for (int i = 0; i < 10; ++i) {
34*9ab590e3SVitaly Buka const void *r =
35*9ab590e3SVitaly Buka bsearch(&i, arr1, array_size(arr1), sizeof(arr1[0]), &cmp_ints);
36*9ab590e3SVitaly Buka if (!r)
37*9ab590e3SVitaly Buka printf(" null");
38*9ab590e3SVitaly Buka else
39*9ab590e3SVitaly Buka printf(" %d", *(const int *)r);
40*9ab590e3SVitaly Buka }
41*9ab590e3SVitaly Buka printf("\n");
42*9ab590e3SVitaly Buka // CHECK: 0 1 2 3 4 5 6 7 8 null
43*9ab590e3SVitaly Buka
44*9ab590e3SVitaly Buka // Nested bsearch.
45*9ab590e3SVitaly Buka for (int i = 0; i < 10; ++i) {
46*9ab590e3SVitaly Buka const void *r =
47*9ab590e3SVitaly Buka bsearch(&i, arr2, array_size(arr2), sizeof(arr2[0]), &cmp_pos);
48*9ab590e3SVitaly Buka if (!r)
49*9ab590e3SVitaly Buka printf(" null");
50*9ab590e3SVitaly Buka else
51*9ab590e3SVitaly Buka printf(" %d", *(const int *)r);
52*9ab590e3SVitaly Buka }
53*9ab590e3SVitaly Buka printf("\n");
54*9ab590e3SVitaly Buka // CHECK: null 1 null 3 4 null 6 7 null 10
55*9ab590e3SVitaly Buka }
56