]> granicus.if.org Git - php/commitdiff
Add zend_hash_merge_ex(), for selective merging
authorZeev Suraski <zeev@php.net>
Wed, 11 Oct 2000 16:22:40 +0000 (16:22 +0000)
committerZeev Suraski <zeev@php.net>
Wed, 11 Oct 2000 16:22:40 +0000 (16:22 +0000)
Zend/zend_hash.c
Zend/zend_hash.h

index baca3bc17ce380ff35e9e065ed4c47af48f48d35..f2ae8c46f8e3148f79a16a53670912c699d984e2 100644 (file)
@@ -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);
index 4b838463dc43b48b80a88a65e9733f8a6a36145f..37e20457a0994c96aec960f6f1b7579b616bc78f 100644 (file)
@@ -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);