summaryrefslogtreecommitdiffstats
path: root/private/crt32/misc/bsearch.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/misc/bsearch.c')
-rw-r--r--private/crt32/misc/bsearch.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/private/crt32/misc/bsearch.c b/private/crt32/misc/bsearch.c
new file mode 100644
index 000000000..5769de6b5
--- /dev/null
+++ b/private/crt32/misc/bsearch.c
@@ -0,0 +1,99 @@
+/***
+*bsearch.c - do a binary search
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* defines bsearch() - do a binary search an an array
+*
+*Revision History:
+* 07-05-84 RN initial version
+* 06-19-85 TC put in ifdefs to handle case of multiplication
+* in large/huge model.
+* 04-13-87 JCR added const to declaration
+* 08-04-87 JCR Added "long" cast to mid= assignment for large/huge
+* model.
+* 11-10-87 SKS Removed IBMC20 switch
+* 12-11-87 JCR Added "_LOAD_DS" to declaration
+* 01-21-88 JCR Backed out _LOAD_DS...
+* 02-22-88 JCR Added cast to get rid of cl const warning
+* 10-20-89 JCR Added _cdecl to prototype, changed 'char' to 'void'
+* 03-14-90 GJF Replaced _cdecl with _CALLTYPE1, added #include
+* <cruntime.h>, removed #include <register.h> and fixed
+* the copyright. Also, cleaned up the formatting a bit.
+* 04-05-90 GJF Added #include <stdlib.h> and #include <search.h>.
+* Fixed some resulting compiler warnings (at -W3).
+* Also, removed #include <sizeptr.h>.
+* 07-25-90 SBM Removed redundant include (stdio.h), made args match
+* prototype
+* 10-04-90 GJF New-style function declarator.
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <stdlib.h>
+#include <search.h>
+
+/***
+*char *bsearch() - do a binary search on an array
+*
+*Purpose:
+* Does a binary search of a sorted array for a key.
+*
+*Entry:
+* const char *key - key to search for
+* const char *base - base of sorted array to search
+* unsigned int num - number of elements in array
+* unsigned int width - number of bytes per element
+* int (*compare)() - pointer to function that compares two array
+* elements, returning neg when #1 < #2, pos when #1 > #2, and
+* 0 when they are equal. Function is passed pointers to two
+* array elements.
+*
+*Exit:
+* if key is found:
+* returns pointer to occurrence of key in array
+* if key is not found:
+* returns NULL
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+void * _CALLTYPE1 bsearch (
+ REG4 const void *key,
+ const void *base,
+ size_t num,
+ size_t width,
+ int (_CALLTYPE1 *compare)(const void *, const void *)
+ )
+{
+ REG1 char *lo = (char *)base;
+ REG2 char *hi = (char *)base + (num - 1) * width;
+ REG3 char *mid;
+ unsigned int half;
+ int result;
+
+ while (lo <= hi)
+ if (half = num / 2)
+ {
+ mid = lo + (num & 1 ? half : (half - 1)) * width;
+ if (!(result = (*compare)(key,mid)))
+ return(mid);
+ else if (result < 0)
+ {
+ hi = mid - width;
+ num = num & 1 ? half : half-1;
+ }
+ else {
+ lo = mid + width;
+ num = half;
+ }
+ }
+ else if (num)
+ return((*compare)(key,lo) ? NULL : lo);
+ else
+ break;
+
+ return(NULL);
+}