]> granicus.if.org Git - json-c/commitdiff
add bsearch for arrays
authorAlexander Dahl <post@lespocky.de>
Thu, 21 Aug 2014 13:42:50 +0000 (15:42 +0200)
committerAlexander Dahl <post@lespocky.de>
Thu, 21 Aug 2014 13:42:50 +0000 (15:42 +0200)
Arrays can already be sorted with json_object_array_sort() which uses
qsort() of the standard C library. This adds a counterpart using the
bsearch() from C.

arraylist.c
arraylist.h
json_object.c
json_object.h

index 1d899fa907e61579445d9b129398d35ce6aa384a..5ccbdd22934af7e3b76264cd0a071c1cca408540 100644 (file)
@@ -91,8 +91,14 @@ array_list_add(struct array_list *arr, void *data)
 void
 array_list_sort(struct array_list *arr, int(*sort_fn)(const void *, const void *))
 {
-  qsort(arr->array, arr->length, sizeof(arr->array[0]),
-       (int (*)(const void *, const void *))sort_fn);
+  qsort(arr->array, arr->length, sizeof(arr->array[0]), sort_fn);
+}
+
+void* array_list_bsearch( const void **key, struct array_list *arr,
+               int (*sort_fn)(const void *, const void *) )
+{
+       return bsearch( key, arr->array, arr->length, sizeof(arr->array[0]),
+                       sort_fn );
 }
 
 int
index 4f3113c0949de1560b70821ee209c88fc8641c9c..50fb32070ab4e7a5da00078f6aa9b921ec02679b 100644 (file)
@@ -49,6 +49,11 @@ array_list_length(struct array_list *al);
 extern void
 array_list_sort(struct array_list *arr, int(*compar)(const void *, const void *));
 
+extern void* array_list_bsearch( const void **key,
+               struct array_list *arr,
+               int (*sort_fn)(const void *, const void *) );
+
+
 #ifdef __cplusplus
 }
 #endif
index 8ed02398fb370ea834c6a27e56e2c8edc075df1d..c858a9efe5f34a21166f3389be3f56bb4819ac5c 100644 (file)
@@ -889,6 +889,23 @@ void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *,
        array_list_sort(jso->o.c_array, sort_fn);
 }
 
+struct json_object* json_object_array_bsearch(
+               const struct json_object *key,
+               const struct json_object *jso,
+               int (*sort_fn)(const void *, const void *) )
+{
+       struct json_object **result;
+
+       result = (struct json_object **) array_list_bsearch(
+                       (const void **) &key, jso->o.c_array, sort_fn );
+
+       if ( result == NULL ) {
+               return NULL;
+       } else {
+               return *result;
+       }
+}
+
 int json_object_array_length(struct json_object *jso)
 {
        return array_list_length(jso->o.c_array);
index 200ac4031d4707e802a92059bd21e13579983eeb..44e2b7bb4f92a2ef6ba5c22aba547be4d87317db 100644 (file)
@@ -402,6 +402,25 @@ extern int json_object_array_length(struct json_object *obj);
 */
 extern void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *));
 
+/** Binary search a sorted array for a specified key object.
+ *
+ * It depends on your compare function what's sufficient as a key.
+ * Usually you create some dummy object with the parameter compared in
+ * it, to identify the right item you're actually looking for.
+ *
+ * @see json_object_array_sort() for hints on the compare function.
+ *
+ * @param key a dummy json_object with the right key
+ * @param jso the array object we're searching
+ * @param sort_fn the sort/compare function
+ *
+ * @return the wanted json_object instance
+ */
+extern struct json_object* json_object_array_bsearch(
+               const struct json_object *key,
+               const struct json_object *jso,
+               int (*sort_fn)(const void *, const void *) );
+
 /** Add an element to the end of a json_object of type json_type_array
  *
  * The reference count will *not* be incremented. This is to make adding