diff options
Diffstat (limited to 'libc/stdlib/bsearch.c')
| -rw-r--r-- | libc/stdlib/bsearch.c | 46 | 
1 files changed, 46 insertions, 0 deletions
diff --git a/libc/stdlib/bsearch.c b/libc/stdlib/bsearch.c new file mode 100644 index 000000000..989866743 --- /dev/null +++ b/libc/stdlib/bsearch.c @@ -0,0 +1,46 @@ + +/* + * This file lifted in toto from 'Dlibs' on the atari ST  (RdeBath) + * + *  + *    Dale Schumacher                         399 Beacon Ave. + *    (alias: Dalnefre')                      St. Paul, MN  55104 + *    dal@syntel.UUCP                         United States of America + *  "It's not reality that's important, but how you perceive things." + */ +#include <stdio.h> + +static int _bsearch;		/* index of element found, or where to +				 * insert */ + +char * +bsearch(key, base, num, size, cmp) +register char *key;		/* item to search for */ +register char *base;		/* base address */ +int   num;			/* number of elements */ +register int size;		/* element size in bytes */ +register int (*cmp) ();		/* comparison function */ +{ +   register int a, b, c, dir; + +   a = 0; +   b = num - 1; +   while (a <= b) +   { +      c = (a + b) >> 1;		/* == ((a + b) / 2) */ +      if (dir = (*cmp) ((base + (c * size)), key)) +      { +	 if (dir > 0) +	    b = c - 1; +	 else			/* (dir < 0) */ +	    a = c + 1; +      } +      else +      { +	 _bsearch = c; +	 return (base + (c * size)); +      } +   } +   _bsearch = b; +   return (NULL); +}  | 
