summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2000-10-11 16:22:40 +0000
committerZeev Suraski <zeev@php.net>2000-10-11 16:22:40 +0000
commit9aa38aad4585a55de941c68aa22b5163ba9cba8e (patch)
treeb1d20b60932a74096154b918598340a8fc5d0ed3
parent23a96536fa878b3afe0380b917c2dff9ad2825bb (diff)
downloadphp-git-9aa38aad4585a55de941c68aa22b5163ba9cba8e.tar.gz
Add zend_hash_merge_ex(), for selective merging
-rw-r--r--Zend/zend_hash.c32
-rw-r--r--Zend/zend_hash.h1
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);