home *** CD-ROM | disk | FTP | other *** search
- /*
- * bsearch.c
- *
- * This is something I found on watmath. I've made some minor changes for use
- * in this package.
- *
- * 92/06/04 11:35:15
- */
-
- #if 0
- #ifndef lint
- static char *RCSid = "$OHeader: /usr/mfcf/src/accounts/libuw/RCS/bsearch.c,v 1.1 88/06/11 20:41:48 root Exp $";
- #endif
- #endif
-
- #include "defs.h"
-
- #ifdef USE_MYBSEARCH
-
- #ifdef USE_SCCS_IDS
- static char const SCCSid[] = "@(#) mytinfo bsearch.c 3.4 92/06/04 public domain, By Ross Ridge";
- #endif
-
- #ifdef USE_SHORT_BSEARCH
- #define fast_int short
- #else
- #define fast_int mysize_t
- #endif
-
- /*
- * bsearch - find an element of a sorted vector
- *
- * found = bsearch(key, array, dimension, width, compare)
- * returns a pointer to the specified element in the array,
- * or (char*)0 if the element can't be found.
- * key
- * pointer to the element to be searched for in the array
- * array
- * address of an array of elements
- * dimension
- * number of elements in the array
- * width
- * sizeof(type) of each element
- * compare
- * pointer to a function taking (char *) pointers to two elements
- * and returning <0, 0, or >0 as the first element comes before,
- * at, or after the second element. A compare function is provided
- * for comparing strings.
- */
- #if 0
- /*
- * $OLog: bsearch.c,v $
- * Revision 1.1 88/06/11 20:41:48 root
- * Initial revision
- *
- */
- #endif
-
- static anyptr
- bsearch(key, array, dimension, iwidth, compare)
- anyptr key;
- anyptr array;
- int dimension;
- mysize_t iwidth;
- compar_fn compare;
- {
- register fast_int start; /* offset to start of current interval */
- register fast_int end; /* offset to end+1 of current interval */
- register fast_int middle; /* offset to middle of current interval */
- auto int status;
- register fast_int width;
-
- width = iwidth / sizeof(char);
-
- start = 0;
- middle = 0;
- end = dimension;
-
- while (start < end) {
-
- middle = (start + end) / 2;
-
- status = (*compare)(key, ((char *)array + middle*width));
-
- if (status < 0)
- end = middle;
-
- else if (status > 0)
- start = middle + 1;
-
- else return (anyptr)(((char *)array) + middle*width);
- }
-
- return 0;
- }
-
- #endif /* USE_MYBSEARCH */
-