]> git.lizzy.rs Git - dragonblocks_alpha.git/blobdiff - src/array.c
Append .zip to ZIP files generated by release script
[dragonblocks_alpha.git] / src / array.c
index a6678e6eb1be940f1549d82afbb87a940cf1bea1..1d648f23878f51aa3b14bc2c7d72bb939a08b148 100644 (file)
@@ -1,7 +1,20 @@
+#include <assert.h>
 #include <string.h>
 #include <stdlib.h>
 #include "array.h"
 
+Array array_create(size_t membsiz)
+{
+       return (Array) {
+               .membsiz = membsiz,
+               .siz = 0,
+               .cap = 0,
+               .ptr = NULL,
+               .cmp = NULL,
+       };
+}
+
+
 static void array_realloc(Array *array)
 {
        if (array->siz > array->cap) {
@@ -34,12 +47,27 @@ void array_append(Array *array, void *elem)
        memcpy((char *) array->ptr + oldsiz * array->membsiz, elem, array->membsiz);
 }
 
-Array array_create(size_t membsiz)
+ArraySearchResult array_search(Array *array, void *search)
 {
-       return (Array) {
-               .membsiz = membsiz,
-               .siz = 0,
-               .cap = 0,
-               .ptr = NULL,
-       };
+       assert(array->cmp);
+       size_t low, high, index;
+
+       low = index = 0;
+       high = array->siz;
+
+       while (low < high) {
+               index = low;
+
+               size_t mid = (low + high) / 2;
+               s8 state = array->cmp(search, (char *) array->ptr + mid * array->membsiz);
+
+               if (state == 0)
+                       return (ArraySearchResult) {true, mid};
+               else if (state > 0)
+                       high = mid;
+               else
+                       low = mid + 1;
+       }
+
+       return (ArraySearchResult) {false, index};
 }