chiark / gitweb /
util: add (x)bsearch_r(), the missing counterpart of qsort_r()
authorKay Sievers <kay@vrfy.org>
Mon, 22 Oct 2012 12:31:46 +0000 (14:31 +0200)
committerKay Sievers <kay@vrfy.org>
Mon, 22 Oct 2012 12:31:46 +0000 (14:31 +0200)
src/shared/util.c
src/shared/util.h

index 42a2e27..2f0aba8 100644 (file)
@@ -6069,3 +6069,27 @@ finish:
 
         return 0;
 }
 
         return 0;
 }
+
+/* hey glibc, APIs with callbacks without a user pointer are so useless */
+void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
+                 int (*compar) (const void *, const void *, void *),
+                 void *arg) {
+        size_t l, u, idx;
+        const void *p;
+        int comparison;
+
+        l = 0;
+        u = nmemb;
+        while (l < u) {
+                idx = (l + u) / 2;
+                p = (void *)(((const char *) base) + (idx * size));
+                comparison = compar(key, p, arg);
+                if (comparison < 0)
+                        u = idx;
+                else if (comparison > 0)
+                        l = idx + 1;
+                else
+                        return (void *)p;
+        }
+        return NULL;
+}
index 77d2875..a9c39b8 100644 (file)
@@ -563,3 +563,7 @@ bool filename_is_safe(const char *p);
 bool string_is_safe(const char *p);
 
 int parse_timestamp(const char *t, usec_t *usec);
 bool string_is_safe(const char *p);
 
 int parse_timestamp(const char *t, usec_t *usec);
+
+void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
+                 int (*compar) (const void *, const void *, void *),
+                 void *arg);