]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added array_sort() for type-safe array sorting.
authorTimo Sirainen <tss@iki.fi>
Wed, 17 Jun 2009 18:52:30 +0000 (14:52 -0400)
committerTimo Sirainen <tss@iki.fi>
Wed, 17 Jun 2009 18:52:30 +0000 (14:52 -0400)
--HG--
branch : HEAD

src/lib/array.c
src/lib/array.h

index c324fada1d8a534a8b2dfd3008aa6a3c1cfd46a6..a0c2ee6df1a3ef20bde6294cb872b5cbcd3bfe9d 100644 (file)
@@ -3,6 +3,8 @@
 #include "lib.h"
 #include "array.h"
 
+#include <stdlib.h>
+
 void *array_idx_modifiable_i(struct array *array, unsigned int idx)
 {
        size_t pos;
@@ -85,3 +87,12 @@ void array_reverse_i(struct array *array)
                       element_size);
        }
 }
+
+void array_sort_i(struct array *array, int (*cmp)(const void *, const void *))
+{
+       unsigned int count;
+
+       count = array->buffer->used / array->element_size;
+       qsort(buffer_get_modifiable_data(array->buffer, NULL),
+             count, array->element_size, cmp);
+}
index 8adfd8249463ccf65ac5491adff44ae780fc8c6e..0f3452607ba35cce3d22ff93697add3bd8846c43 100644 (file)
@@ -234,4 +234,16 @@ void array_reverse_i(struct array *array);
 #define array_reverse(array) \
        array_reverse_i(&(array)->arr)
 
+void array_sort_i(struct array *array, int (*cmp)(const void *, const void *));
+#ifdef CONTEXT_TYPE_SAFETY
+#define array_sort(array, cmp) \
+       ({(void)(1 ? 0 : cmp(ARRAY_TYPE_CAST_CONST(array)NULL, \
+                            ARRAY_TYPE_CAST_CONST(array)NULL)); \
+       array_sort_i(&(array)->arr, \
+               (int (*)(const void *, const void *))cmp); })
+#else
+#define array_sort(array, cmp) \
+       array_sort_i(&(array)->arr, (int (*)(const void *, const void *))cmp)
+#endif
+
 #endif