summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>1999-05-29 18:59:58 +0000
committerZeev Suraski <zeev@php.net>1999-05-29 18:59:58 +0000
commitbcc1337d8c7f9500241b5dbcd2ad02367a474884 (patch)
tree78f4c9e077dfc48c27a56615410101d01235d634
parent274f3aa727055eb5698f5131439af15451e806e5 (diff)
downloadphp-git-bcc1337d8c7f9500241b5dbcd2ad02367a474884.tar.gz
Support overwrite mode in zend_hash_merge()
-rw-r--r--Zend/zend_hash.c7
-rw-r--r--Zend/zend_hash.h2
-rw-r--r--Zend/zend_operators.c2
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;