diff options
author | Zeev Suraski <zeev@php.net> | 2000-10-11 16:22:40 +0000 |
---|---|---|
committer | Zeev Suraski <zeev@php.net> | 2000-10-11 16:22:40 +0000 |
commit | 9aa38aad4585a55de941c68aa22b5163ba9cba8e (patch) | |
tree | b1d20b60932a74096154b918598340a8fc5d0ed3 | |
parent | 23a96536fa878b3afe0380b917c2dff9ad2825bb (diff) | |
download | php-git-9aa38aad4585a55de941c68aa22b5163ba9cba8e.tar.gz |
Add zend_hash_merge_ex(), for selective merging
-rw-r--r-- | Zend/zend_hash.c | 32 | ||||
-rw-r--r-- | Zend/zend_hash.h | 1 |
2 files changed, 33 insertions, 0 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index baca3bc17c..f2ae8c46f8 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -797,6 +797,38 @@ ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_fu } +ZEND_API void zend_hash_merge_ex(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, uint size, zend_bool (*pReplaceOrig)(void *orig, void *new)) +{ + Bucket *p; + void *t; + void *pOrig; + + IS_CONSISTENT(source); + IS_CONSISTENT(target); + + p = source->pListHead; + while (p) { + if (p->nKeyLength>0) { + if (zend_hash_find(target, p->arKey, p->nKeyLength, &pOrig)==FAILURE + || pReplaceOrig(pOrig, p->pData)) { + if (zend_hash_update(target, p->arKey, p->nKeyLength, p->pData, size, &t)==SUCCESS && pCopyConstructor) { + pCopyConstructor(t); + } + } + } else { + if (zend_hash_index_find(target, p->h, &pOrig)==FAILURE + || pReplaceOrig(pOrig, p->pData)) { + if (zend_hash_index_update(target, p->h, p->pData, size, &t)==SUCCESS && pCopyConstructor) { + pCopyConstructor(t); + } + } + } + p = p->pListNext; + } + target->pInternalPointer = target->pListHead; +} + + ZEND_API ulong zend_get_hash_value(HashTable *ht, char *arKey, uint nKeyLength) { IS_CONSISTENT(ht); diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 4b838463dc..37e20457a0 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -170,6 +170,7 @@ ZEND_API void zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos /* Copying, merging and sorting */ ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, void *tmp, uint size); ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, void *tmp, uint size, int overwrite); +ZEND_API void zend_hash_merge_ex(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, uint size, zend_bool (*pReplaceOrig)(void *orig, void *new)); ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func, compare_func_t compare_func, int renumber); ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered); ZEND_API int zend_hash_minmax(HashTable *ht, int (*compar)(const void *, const void *), int flag, void **pData); |