1
0
mirror of https://github.com/cc65/cc65.git synced 2024-11-03 10:07:02 +00:00
cc65/libsrc/common/bsearch.c
cuz 76bbc48b99 Make bsearch __fastcall__
git-svn-id: svn://svn.cc65.org/cc65/trunk@2584 b7a2c559-68d2-44c3-8de9-860c34a00d81
2003-10-29 21:51:59 +00:00

50 lines
999 B
C

/*
* bsearch.c
*
* Ullrich von Bassewitz, 17.06.1998
*/
#include <stdlib.h>
void* __fastcall__ bsearch (const void* key, const void* base, size_t n,
size_t size, int (*cmp) (const void*, const void*))
{
int current;
int result;
int found = 0;
int first = 0;
int last = n - 1;
/* Binary search */
while (first <= last) {
/* Set current to mid of range */
current = (last + first) / 2;
/* Do a compare */
result = cmp ((void*) (((int) base) + current*size), key);
if (result < 0) {
first = current + 1;
} else {
last = current - 1;
if (result == 0) {
/* Found one entry that matches the search key. However there may be
* more than one entry with the same key value and ANSI guarantees
* that we return the first of a row of items with the same key.
*/
found = 1;
}
}
}
/* Did we find the entry? */
return (void*) (found? ((int) base) + first*size : 0);
}