xref: /plan9-contrib/sys/src/ape/lib/ap/gen/bsearch.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include <stdlib.h>
23e12c5d1SDavid du Colombier #include <stdio.h>
33e12c5d1SDavid du Colombier void*
bsearch(const void * key,const void * base,size_t nmemb,size_t size,int (* compar)(const void *,const void *))43e12c5d1SDavid du Colombier bsearch(const void* key, const void* base, size_t nmemb, size_t size,
53e12c5d1SDavid du Colombier 		int (*compar)(const void*, const void*))
63e12c5d1SDavid du Colombier {
7*219b2ee8SDavid du Colombier 	long i, bot, top, new;
8*219b2ee8SDavid du Colombier 	void *p;
93e12c5d1SDavid du Colombier 
10*219b2ee8SDavid du Colombier 	bot = 0;
11*219b2ee8SDavid du Colombier 	top = bot + nmemb - 1;
12*219b2ee8SDavid du Colombier 	while(bot <= top){
13*219b2ee8SDavid du Colombier 		new = (top + bot)/2;
14*219b2ee8SDavid du Colombier 		p = (char *)base+new*size;
15*219b2ee8SDavid du Colombier 		i = (*compar)(key, p);
16*219b2ee8SDavid du Colombier 		if(i == 0)
17*219b2ee8SDavid du Colombier 			return p;
18*219b2ee8SDavid du Colombier 		if(i > 0)
19*219b2ee8SDavid du Colombier 			bot = new + 1;
203e12c5d1SDavid du Colombier 		else
21*219b2ee8SDavid du Colombier 			top = new - 1;
223e12c5d1SDavid du Colombier 	}
233e12c5d1SDavid du Colombier 	return 0;
243e12c5d1SDavid du Colombier }
25