Explorar o código

feat(gblibc): bsearch()

greatbridf %!s(int64=2) %!d(string=hai) anos
pai
achega
1f9648b753
Modificáronse 2 ficheiros con 25 adicións e 0 borrados
  1. 6 0
      gblibc/include/stdlib.h
  2. 19 0
      gblibc/src/stdlib.c

+ 6 - 0
gblibc/include/stdlib.h

@@ -16,6 +16,12 @@ void free(void* ptr);
 
 typedef int (*comparator_t)(const void* a, const void* b);
 void qsort(void* base, size_t num, size_t size, comparator_t comparator);
+void* bsearch(
+    const void* key,
+    const void* base,
+    size_t num,
+    size_t size,
+    comparator_t comparator);
 
 int rand(void);
 int rand_r(unsigned int* seedp);

+ 19 - 0
gblibc/src/stdlib.c

@@ -189,3 +189,22 @@ void srand(unsigned int seed)
     __next_rand = seed;
     rand();
 }
+
+void* bsearch(const void* key, const void* base, size_t num, size_t size, comparator_t cmp)
+{
+    if (num == 0)
+        return NULL;
+
+    size_t mid = num / 2;
+    int result = cmp(key, base + size * mid);
+
+    if (result == 0)
+        return (void*)base + size * mid;
+    
+    if (result > 0) {
+        ++mid;
+        return bsearch(key, base + size * mid, num - mid, size, cmp);
+    }
+    
+    return bsearch(key, base, mid, size, cmp);
+}