--- php-4.0RC1-orig/Zend/zend_hash.h Fri Mar 24 12:12:30 2000 +++ php-4.0RC1/Zend/zend_hash.h Mon Apr 3 17:41:17 2000 @@ -83,12 +83,21 @@ ZEND_API void zend_hash_clean(HashTable *ht); /* additions/updates/changes */ -ZEND_API int zend_hash_add_or_update(HashTable *ht, char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest,int flag); +ZEND_API int zend_hash_add_or_update_ret_key(ulong* ret_key, HashTable *ht, char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest,int flag); + +#define zend_hash_add_or_update(ht,arKey,nKeyLength,pData,nDataSize,pDest,flag) \ + zend_hash_add_or_update_ret_key(NULL,ht,arKey,nKeyLength,pData,nDataSize,pDest,flag) + #define zend_hash_update(ht,arKey,nKeyLength,pData,nDataSize,pDest) \ zend_hash_add_or_update(ht,arKey,nKeyLength,pData,nDataSize,pDest,HASH_UPDATE) #define zend_hash_add(ht,arKey,nKeyLength,pData,nDataSize,pDest) \ zend_hash_add_or_update(ht,arKey,nKeyLength,pData,nDataSize,pDest,HASH_ADD) +#define zend_hash_update_ret_key(ret_key,ht,arKey,nKeyLength,pData,nDataSize,pDest) \ + zend_hash_add_or_update_ret_key(ret_key,ht,arKey,nKeyLength,pData,nDataSize,pDest,HASH_UPDATE) +#define zend_hash_add_ret_key(ret_key,ht,arKey,nKeyLength,pData,nDataSize,pDest) \ + zend_hash_add_or_update_ret_key(ret_key,ht,arKey,nKeyLength,pData,nDataSize,pDest,HASH_ADD) + ZEND_API int zend_hash_quick_add_or_update(HashTable *ht, char *arKey, uint nKeyLength, ulong h, void *pData, uint nDataSize, void **pDest,int flag); #define zend_hash_quick_update(ht,arKey,nKeyLength,h,pData,nDataSize,pDest) \ zend_hash_quick_add_or_update(ht,arKey,nKeyLength,h,pData,nDataSize,pDest,HASH_UPDATE) @@ -129,7 +138,12 @@ ZEND_API ulong zend_get_hash_value(HashTable *ht, char *arKey, uint nKeyLength); /* Data retreival */ -ZEND_API int zend_hash_find(HashTable *ht, char *arKey, uint nKeyLength, void **pData); +ZEND_API int zend_hash_find_ret_key(ulong *ret_key, HashTable *ht, char *arKey, uint nKeyLength, void **pData); +#define zend_hash_find(ht,arKey,nKeyLength,pData) \ + zend_hash_find_ret_key(NULL,ht,arKey,nKeyLength,pData) + +ZEND_API int zend_hash_find_with_keylength(HashTable *ht, ulong h, uint nKeyLength, void **pData); + ZEND_API int zend_hash_quick_find(HashTable *ht, char *arKey, uint nKeyLength, ulong h, void **pData); ZEND_API int zend_hash_index_find(HashTable *ht, ulong h, void **pData); --- php-4.0RC1-orig/Zend/zend_hash.c Fri Mar 24 12:12:30 2000 +++ php-4.0RC1/Zend/zend_hash.c Mon Apr 3 18:03:28 2000 @@ -203,7 +203,7 @@ return SUCCESS; } -ZEND_API int zend_hash_add_or_update(HashTable *ht, char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag) +ZEND_API int zend_hash_add_or_update_ret_key(ulong* ret_key, HashTable *ht, char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag) { ulong h; uint nIndex; @@ -221,6 +221,12 @@ HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_update_or_next_insert(ht, idx, pData, nDataSize, pDest, flag)); h = ht->pHashFunction(arKey, nKeyLength); + + if( ret_key ) /* add the index key to the ret_key return value */ + { + *ret_key = h; + } + nIndex = h % ht->nTableSize; p = ht->arBuckets[nIndex]; @@ -260,6 +266,7 @@ p->nKeyLength = nKeyLength; INIT_DATA(ht, p, pData, nDataSize); p->h = h; + CONNECT_TO_BUCKET_DLLIST(p, ht->arBuckets[nIndex]); if (pDest) { *pDest = p->pData; @@ -275,6 +282,7 @@ return SUCCESS; } + ZEND_API int zend_hash_quick_add_or_update(HashTable *ht, char *arKey, uint nKeyLength, ulong h, void *pData, uint nDataSize, void **pDest, int flag) { uint nIndex; @@ -768,7 +776,7 @@ * data is returned in pData. The reason is that there's no reason * someone using the hash table might not want to have NULL data */ -ZEND_API int zend_hash_find(HashTable *ht, char *arKey, uint nKeyLength, void **pData) +ZEND_API int zend_hash_find_ret_key(ulong *ret_key, HashTable *ht, char *arKey, uint nKeyLength, void **pData) { ulong h; uint nIndex; @@ -786,8 +794,33 @@ if ((p->h == h) && (p->nKeyLength == nKeyLength)) { if (!memcmp(p->arKey, arKey, nKeyLength)) { *pData = p->pData; + if( ret_key ) + { + *ret_key = p->h; + } return SUCCESS; } + } + p = p->pNext; + } + return FAILURE; +} + + +ZEND_API int zend_hash_find_with_keylength(HashTable *ht, ulong h, uint nKeyLength, void **pData) +{ + uint nIndex; + Bucket *p; + + IS_CONSISTENT(ht); + + nIndex = h % ht->nTableSize; + + p = ht->arBuckets[nIndex]; + while (p != NULL) { + if ((p->h == h) && (p->nKeyLength == nKeyLength)) { + *pData = p->pData; + return SUCCESS; } p = p->pNext; }