Added bsearch
This commit is contained in:
parent
ddc46385f3
commit
d24592ee76
|
@ -33,6 +33,7 @@ monitor.c
|
||||||
perror.c
|
perror.c
|
||||||
procentry.c
|
procentry.c
|
||||||
qsort.c
|
qsort.c
|
||||||
|
bsearch.c
|
||||||
rand.c
|
rand.c
|
||||||
seekdir.c
|
seekdir.c
|
||||||
sleep.c
|
sleep.c
|
||||||
|
|
51
lang/cem/libcc/gen/bsearch.c
Normal file
51
lang/cem/libcc/gen/bsearch.c
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
/* bsearch(3)
|
||||||
|
*
|
||||||
|
* Author: Terrence Holm Aug. 1988
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Performs a binary search for a given <key> within a sorted
|
||||||
|
* table. The table contains <count> entries of size <width>
|
||||||
|
* and starts at <base>.
|
||||||
|
*
|
||||||
|
* Entries are compared using keycmp( key, entry ), each argument
|
||||||
|
* is a (char *), the function returns an int < 0, = 0 or > 0
|
||||||
|
* according to the order of the two arguments.
|
||||||
|
*
|
||||||
|
* Bsearch(3) returns a pointer to the matching entry, if found,
|
||||||
|
* otherwise NULL is returned.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define NULL (char *) 0
|
||||||
|
|
||||||
|
|
||||||
|
char *bsearch( key, base, count, width, keycmp )
|
||||||
|
char *key;
|
||||||
|
char *base;
|
||||||
|
unsigned int count;
|
||||||
|
unsigned int width;
|
||||||
|
int (*keycmp)();
|
||||||
|
|
||||||
|
{
|
||||||
|
char *mid_point;
|
||||||
|
int cmp;
|
||||||
|
|
||||||
|
while ( count > 0 )
|
||||||
|
{
|
||||||
|
mid_point = base + width * (count >> 1);
|
||||||
|
|
||||||
|
cmp = (*keycmp)( key, mid_point );
|
||||||
|
|
||||||
|
if ( cmp == 0 )
|
||||||
|
return( mid_point );
|
||||||
|
|
||||||
|
if ( cmp < 0 )
|
||||||
|
count >>= 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base = mid_point + width;
|
||||||
|
count = (count - 1) >> 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return( NULL );
|
||||||
|
}
|
Loading…
Reference in a new issue