]> granicus.if.org Git - php/commitdiff
Support overwrite mode in zend_hash_merge()
authorZeev Suraski <zeev@php.net>
Sat, 29 May 1999 18:59:58 +0000 (18:59 +0000)
committerZeev Suraski <zeev@php.net>
Sat, 29 May 1999 18:59:58 +0000 (18:59 +0000)
Zend/zend_hash.c
Zend/zend_hash.h
Zend/zend_operators.c

index 710d2418dd1c94a14e6c8a23a03ce9ac10f1770e..6372aadb13cc19811df48d5a508c7a43c83337ca 100644 (file)
@@ -829,20 +829,21 @@ ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, void (*pCopyC
 }
 
 
-ZEND_API void zend_hash_merge(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)
 {
        Bucket *p;
        void *t;
+       int mode = (overwrite?HASH_UPDATE:HASH_ADD);
 
     p = source->pListHead;
        while (p) {
                memcpy(tmp, p->pData, size);
                if (p->nKeyLength>0) {
-                       if (zend_hash_add(target, p->arKey, p->nKeyLength, tmp, size, &t)==SUCCESS && pCopyConstructor) {
+                       if (zend_hash_add_or_update(target, p->arKey, p->nKeyLength, tmp, size, &t, mode)==SUCCESS && pCopyConstructor) {
                                pCopyConstructor(t);
                        }
                } else {
-                       if (!zend_hash_index_exists(target, p->h) && zend_hash_index_update(target, p->h, tmp, size, &t)==SUCCESS && pCopyConstructor) {
+                       if ((mode==HASH_UPDATE || !zend_hash_index_exists(target, p->h)) && zend_hash_index_update(target, p->h, tmp, size, &t)==SUCCESS && pCopyConstructor) {
                                pCopyConstructor(t);
                        }
                }
index 2699b53978fd19f153e6f355d0b14f0e7abd2073..0eb8436702220539261ed07f33e901cca4d6d803 100644 (file)
@@ -135,7 +135,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);
+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_minmax(HashTable *ht, int (*compar) (const void *, const void *), int flag, void **pData);
 
index 162a63416241906b97a65b2b26d3c5e5ee1d64b5..8b83162d4d469ffa75651a779eaf3f2c5d240af1 100644 (file)
@@ -431,7 +431,7 @@ ZEND_API int add_function(zval *result, zval *op1, zval *op2)
        if (op1->type == IS_ARRAY && op2->type == IS_ARRAY) {
                zval tmp;
                
-               zend_hash_merge(op1->value.ht,op2->value.ht,(void (*)(void *pData)) zval_copy_ctor, (void *) &tmp, sizeof(zval));
+               zend_hash_merge(op1->value.ht,op2->value.ht,(void (*)(void *pData)) zval_copy_ctor, (void *) &tmp, sizeof(zval), 0);
                *result = *op1;
                zval_dtor(op2);
                return SUCCESS;