summaryrefslogtreecommitdiff
path: root/src/common/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/array.c')
-rw-r--r--src/common/array.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/common/array.c b/src/common/array.c
index dcb9344..36c30a1 100644
--- a/src/common/array.c
+++ b/src/common/array.c
@@ -632,3 +632,69 @@ void *get_flat_array_item(flat_array_t *array, size_t index, size_t size)
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : array = tableau compressé à consulter. *
+* size = taille de ce nouvel élément. *
+* compar = méthode de comparaison entre éléments. *
+* key = élément de comparaison fourni. *
+* *
+* Description : Recherche un élément dans un tableau trié. *
+* *
+* Retour : Eventuel élément trouvé ou NULL. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void *find_item_in_flat_array(flat_array_t *array, size_t size, __compar_fn_t compar, const void *key)
+{
+ void *result; /* Trouvaille à retourner */
+ size_t count; /* Nombre d'éléments présents */
+ void *item; /* Elément isolé présent */
+ ext_flat_array_t *extended; /* Version de tableau étendue */
+ size_t index; /* Indice de l'élément trouvé */
+
+ assert(FLAT_ARRAY_IS_LOCKED(array));
+
+ count = count_flat_array_items(array);
+
+ switch (count)
+ {
+ case 0:
+ result = NULL;
+ break;
+
+ case 1:
+
+ assert(FLAT_ARRAY_HAS_NO_INDEX(array));
+
+ item = GET_LONELY_ITEM(array);
+
+ if (compar(key, item) == 0)
+ result = item;
+ else
+ result = NULL;
+
+ break;
+
+ default:
+
+ assert(!FLAT_ARRAY_HAS_NO_INDEX(array));
+
+ extended = EXTENDED_ARRAY(array);
+
+ if (bsearch_index(key, extended->items, extended->count, size, compar, &index))
+ result = (void *)(((char *)extended->items) + index * size);
+ else
+ result = NULL;
+
+ break;
+
+ }
+
+ return result;
+
+}