bsearch.c.patch   [plain text]


--- bsearch.c.orig	2009-05-12 11:21:33.000000000 -0700
+++ bsearch.c	2009-05-20 13:11:05.000000000 -0700
@@ -81,3 +81,31 @@ bsearch(key, base0, nmemb, size, compar)
 	}
 	return (NULL);
 }
+
+#ifdef __BLOCKS__
+void *
+bsearch_b(key, base0, nmemb, size, compar)
+	const void *key;
+	const void *base0;
+	size_t nmemb;
+	size_t size;
+	int (^compar)(const void *, const void *);
+{
+	const char *base = base0;
+	size_t lim;
+	int cmp;
+	const void *p;
+
+	for (lim = nmemb; lim != 0; lim >>= 1) {
+		p = base + (lim >> 1) * size;
+		cmp = compar(key, p);
+		if (cmp == 0)
+			return ((void *)p);
+		if (cmp > 0) {	/* key > p: move right */
+			base = (char *)p + size;
+			lim--;
+		}		/* else move left */
+	}
+	return (NULL);
+}
+#endif /* __BLOCKS__ */