diff options
author | Zeev Suraski <zeev@php.net> | 1999-05-29 18:59:58 +0000 |
---|---|---|
committer | Zeev Suraski <zeev@php.net> | 1999-05-29 18:59:58 +0000 |
commit | bcc1337d8c7f9500241b5dbcd2ad02367a474884 (patch) | |
tree | 78f4c9e077dfc48c27a56615410101d01235d634 | |
parent | 274f3aa727055eb5698f5131439af15451e806e5 (diff) | |
download | php-git-bcc1337d8c7f9500241b5dbcd2ad02367a474884.tar.gz |
Support overwrite mode in zend_hash_merge()
-rw-r--r-- | Zend/zend_hash.c | 7 | ||||
-rw-r--r-- | Zend/zend_hash.h | 2 | ||||
-rw-r--r-- | Zend/zend_operators.c | 2 |
3 files changed, 6 insertions, 5 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 710d2418dd..6372aadb13 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -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); } } diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 2699b53978..0eb8436702 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -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); diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 162a634162..8b83162d4d 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -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; |