summaryrefslogtreecommitdiff
path: root/Zend/zend_hash.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2003-02-04 12:12:34 +0000
committerZeev Suraski <zeev@php.net>2003-02-04 12:12:34 +0000
commit471947b1885b82f82ba9c338731979c5cc952aec (patch)
tree1711df79a216628d53d65348f9067bb07f372ce9 /Zend/zend_hash.c
parentbe3908cc8e6e3616b3f2dd5cf11479390cad917b (diff)
downloadphp-git-471947b1885b82f82ba9c338731979c5cc952aec.tar.gz
Reimplement PPP properties
Diffstat (limited to 'Zend/zend_hash.c')
-rw-r--r--Zend/zend_hash.c45
1 files changed, 22 insertions, 23 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 59a2e9d4f3..d9a7272426 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -288,11 +288,8 @@ ZEND_API int zend_hash_quick_add_or_update(HashTable *ht, char *arKey, uint nKey
IS_CONSISTENT(ht);
- if (nKeyLength <= 0) {
-#if ZEND_DEBUG
- ZEND_PUTS("zend_hash_update: Can't put in empty key\n");
-#endif
- return FAILURE;
+ if (nKeyLength == 0) {
+ return zend_hash_index_update(ht, h, pData, nDataSize, pDest);
}
nIndex = h & ht->nTableMask;
@@ -819,30 +816,30 @@ 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 *p_new))
+static int zend_hash_replace_checker_wrapper(HashTable *target, void *source_data, Bucket *p, void *pParam, merge_checker_func_t merge_checker_func)
+{
+ zend_hash_key hash_key;
+
+ hash_key.arKey = p->arKey;
+ hash_key.nKeyLength = p->nKeyLength;
+ hash_key.h = p->h;
+ return merge_checker_func(target, source_data, &hash_key, pParam);
+}
+
+
+ZEND_API void zend_hash_merge_ex(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, uint size, merge_checker_func_t pMergeSource, void *pParam)
{
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);
- }
+ if (zend_hash_replace_checker_wrapper(target, p->pData, p, pParam, pMergeSource)) {
+ if (zend_hash_quick_update(target, p->arKey, p->nKeyLength, p->h, p->pData, size, &t)==SUCCESS && pCopyConstructor) {
+ pCopyConstructor(t);
}
}
p = p->pListNext;
@@ -851,10 +848,8 @@ ZEND_API void zend_hash_merge_ex(HashTable *target, HashTable *source, copy_ctor
}
-ZEND_API ulong zend_get_hash_value(HashTable *ht, char *arKey, uint nKeyLength)
+ZEND_API ulong zend_get_hash_value(char *arKey, uint nKeyLength)
{
- IS_CONSISTENT(ht);
-
return zend_inline_hash_func(arKey, nKeyLength);
}
@@ -895,6 +890,10 @@ ZEND_API int zend_hash_quick_find(HashTable *ht, char *arKey, uint nKeyLength, u
uint nIndex;
Bucket *p;
+ if (nKeyLength==0) {
+ return zend_hash_index_find(ht, h, pData);
+ }
+
IS_CONSISTENT(ht);
nIndex = h & ht->nTableMask;