summary refs log tree commit diff
path: root/src/system.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2005-10-29 15:17:47 +1000
committerHerbert Xu <herbert@gondor.apana.org.au>2005-10-29 15:17:47 +1000
commit95325feb5a9ef900e1f6ea5233bc3dfa40354ce0 (patch)
tree22d60ffffbdb5d4ba2d5fbc864c574303de9a0e2 /src/system.c
parentUse stat if stat64 does not exist (diff)
downloaddash-95325feb5a9ef900e1f6ea5233bc3dfa40354ce0.tar.gz
dash-95325feb5a9ef900e1f6ea5233bc3dfa40354ce0.zip
[SYSTEM] Added default implementation of bsearch
Added impelmentation of bsearch since klibc doesn't have it yet.
Diffstat (limited to 'src/system.c')
-rw-r--r--src/system.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/system.c b/src/system.c
index 7804b29..d375de0 100644
--- a/src/system.c
+++ b/src/system.c
@@ -52,3 +52,26 @@ char *strchrnul(const char *s, int c)
 	return p;
 }
 #endif
+
+#ifndef HAVE_BSEARCH
+void *bsearch(const void *key, const void *base, size_t nmemb,
+	      size_t size, int (*cmp)(const void *, const void *))
+{
+	while (nmemb) {
+		size_t mididx = nmemb / 2;
+		const void *midobj = base + mididx * size;
+		int diff = cmp(key, midobj);
+
+		if (diff == 0)
+			return (void *)midobj;
+
+		if (diff > 0) {
+			base = midobj + size;
+			nmemb -= mididx + 1;
+		} else
+			nmemb = mididx;
+	}
+
+	return 0;
+}
+#endif