Files
Arquivotheca.SunOS-4.1.3/lib/libc/gen/common/bsearch.c
seta75D 2e8a93c394 Init
2021-10-11 18:20:23 -03:00

38 lines
920 B
C

#if !defined(lint) && defined(SCCSIDS)
static char sccsid[] = "@(#)bsearch.c 1.1 92/07/30 SMI"; /* from S5R2 1.5 */
#endif
/*LINTLIBRARY*/
/*
* Binary search algorithm, generalized from Knuth (6.2.1) Algorithm B.
*
*/
typedef char *POINTER;
POINTER
bsearch(key, base, nel, width, compar)
POINTER key; /* Key to be located */
POINTER base; /* Beginning of table */
unsigned nel; /* Number of elements in the table */
unsigned width; /* Width of an element (bytes) */
int (*compar)(); /* Comparison function */
{
int two_width = width + width;
POINTER last = base + width * (nel - 1); /* Last element in table */
while (last >= base) {
register POINTER p = base + width * ((last - base)/two_width);
register int res = (*compar)(key, p);
if (res == 0)
return (p); /* Key found */
if (res < 0)
last = p - width;
else
base = p + width;
}
return ((POINTER) 0); /* Key not found */
}