summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_hash.c6
-rw-r--r--Zend/zend_hash.h3
2 files changed, 6 insertions, 3 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 19e45a47ef..54c5855b72 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -1098,7 +1098,9 @@ ZEND_API int zend_hash_get_current_data(HashTable *ht, void **pData)
}
-ZEND_API int zend_hash_sort(HashTable *ht, int (*compar) (const void *, const void *), int renumber)
+ZEND_API int zend_hash_sort(HashTable *ht,
+ void (*sort_func)(void *, size_t, size_t, compare_func_t),
+ compare_func_t compar, int renumber)
{
Bucket **arTmp;
Bucket *p;
@@ -1119,7 +1121,7 @@ ZEND_API int zend_hash_sort(HashTable *ht, int (*compar) (const void *, const vo
i++;
}
- qsort((void *) arTmp, i, sizeof(Bucket *), compar);
+ (*sort_func)((void *) arTmp, i, sizeof(Bucket *), compar);
HANDLE_BLOCK_INTERRUPTIONS();
ht->pListHead = arTmp[0];
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index be643772f0..f5fc569f25 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -62,6 +62,7 @@ typedef struct hashtable {
unsigned char persistent;
} HashTable;
+typedef int (*compare_func_t) (const void *, const void *);
BEGIN_EXTERN_C()
@@ -154,7 +155,7 @@ ZEND_API void zend_hash_internal_pointer_end(HashTable *ht);
/* Copying, merging and sorting */
ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size);
ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size, int overwrite);
-ZEND_API int zend_hash_sort(HashTable *ht, int (*compar) (const void *, const void *), int renumber);
+ZEND_API int zend_hash_sort(HashTable *ht, void (*sort_func)(void *, size_t, size_t, compare_func_t), compare_func_t compar, int renumber);
ZEND_API int zend_hash_minmax(HashTable *ht, int (*compar) (const void *, const void *), int flag, void **pData);
ZEND_API int zend_hash_num_elements(HashTable *ht);