Pristine Ack-5.5
[Ack-5.5.git] / lang / cem / libcc.ansi / stdlib / bsearch.c
1 /*
2  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3  * See the copyright notice in the ACK home directory, in the file "Copyright".
4  */
5 /* $Id: bsearch.c,v 1.3 1994/06/24 11:53:26 ceriel Exp $ */
6
7 #include        <stdlib.h>
8
9 void *
10 bsearch(register const void *key, register const void *base,
11         register size_t nmemb, register size_t size,
12         int (*compar)(const void *, const void *))
13 {
14         register const void *mid_point;
15         register int  cmp;
16
17         while (nmemb > 0) {
18                 mid_point = (char *)base + size * (nmemb >> 1);
19                 if ((cmp = (*compar)(key, mid_point)) == 0)
20                         return (void *)mid_point;
21                 if (cmp >= 0) {
22                         base  = (char *)mid_point + size;
23                         nmemb = (nmemb - 1) >> 1;
24                 } else
25                         nmemb >>= 1;
26         }
27         return (void *)NULL;
28 }