|
@@ -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 );
|
|
|
+ }
|