From: Timo Sirainen Date: Fri, 10 Jul 2009 17:59:16 +0000 (-0400) Subject: Added type safe array_bsearch(). X-Git-Tag: 2.0.alpha1~445 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=40252a7eb6030f51dc6436e5b844c8a65890a736;p=thirdparty%2Fdovecot%2Fcore.git Added type safe array_bsearch(). --HG-- branch : HEAD --- diff --git a/src/lib/array.c b/src/lib/array.c index a0c2ee6df1..fea32f592e 100644 --- a/src/lib/array.c +++ b/src/lib/array.c @@ -96,3 +96,13 @@ void array_sort_i(struct array *array, int (*cmp)(const void *, const void *)) qsort(buffer_get_modifiable_data(array->buffer, NULL), count, array->element_size, cmp); } + +void *array_bsearch_i(struct array *array, const void *key, + int (*cmp)(const void *, const void *)) +{ + unsigned int count; + + count = array->buffer->used / array->element_size; + return bsearch(key, array->buffer->data, + count, array->element_size, cmp); +} diff --git a/src/lib/array.h b/src/lib/array.h index 0f3452607b..b6e3d7d06d 100644 --- a/src/lib/array.h +++ b/src/lib/array.h @@ -246,4 +246,17 @@ void array_sort_i(struct array *array, int (*cmp)(const void *, const void *)); array_sort_i(&(array)->arr, (int (*)(const void *, const void *))cmp) #endif +void *array_bsearch_i(struct array *array, const void *key, + int (*cmp)(const void *, const void *)); +#ifdef CONTEXT_TYPE_SAFETY +#define array_bsearch(array, key, cmp) \ + ({(void)(1 ? 0 : cmp(key, ARRAY_TYPE_CAST_CONST(array)NULL)); \ + array_bsearch_i(&(array)->arr, (const void *)key, \ + (int (*)(const void *, const void *))cmp); }) +#else +#define array_bsearch(array, key, cmp) \ + array_bsearch_i(&(array)->arr, (const void *)key, \ + (int (*)(const void *, const void *))cmp) +#endif + #endif