}
+#define UPDATE_DATA(ht, p, pData, nDataSize) \
+ if (flag & HASH_ADD_PTR) { \
+ if (!(p)->pDataPtr) { \
+ pefree(p, (ht)->persistent); \
+ } \
+ (p)->pDataPtr = pData; \
+ (p)->pData = &(p)->pDataPtr; \
+ } else { \
+ if ((p)->pDataPtr) { \
+ (p)->pData = (void *) pemalloc(nDataSize, (ht)->persistent); \
+ (p)->pDataPtr=NULL; \
+ } \
+ memcpy((p)->pData, pData, nDataSize); \
+ }
+
+#define INIT_DATA(ht, p, pData, nDataSize); \
+ if (flag & HASH_ADD_PTR) { \
+ (p)->pDataPtr = pData; \
+ (p)->pData = &(p)->pDataPtr; \
+ } else { \
+ (p)->pData = (void *) pemalloc(nDataSize, (ht)->persistent); \
+ if (!(p)->pData) { \
+ pefree(p, (ht)->persistent); \
+ return FAILURE; \
+ } \
+ memcpy((p)->pData, pData, nDataSize); \
+ (p)->pDataPtr=NULL; \
+ }
+
+
ZEND_API int zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, int persistent)
{
uint i;
if (ht->pDestructor) {
ht->pDestructor(p->pData);
}
- if (flag & HASH_ADD_PTR) {
- if (!p->pDataPtr) {
- efree(p->pData);
- }
- p->pDataPtr = pData;
- p->pData = &p->pDataPtr;
- } else {
- if (p->pDataPtr) {
- p->pData = (void *) emalloc(nDataSize);
- p->pDataPtr=NULL;
- }
- memcpy(p->pData, pData, nDataSize);
- }
+ UPDATE_DATA(ht, p, pData, nDataSize);
if (pDest) {
*pDest = p->pData;
}
}
memcpy(p->arKey, arKey, nKeyLength);
p->nKeyLength = nKeyLength;
- if (flag & HASH_ADD_PTR) {
- p->pDataPtr = pData;
- p->pData = &p->pDataPtr;
- } else {
- p->pData = (void *) pemalloc(nDataSize, ht->persistent);
- if (!p->pData) {
- pefree(p, ht->persistent);
- pefree(p->arKey, ht->persistent);
- return FAILURE;
- }
- memcpy(p->pData, pData, nDataSize);
- p->pDataPtr=NULL;
- }
+ INIT_DATA(ht, p, pData, nDataSize);
p->h = h;
CONNECT_TO_BUCKET_DLLIST(p, ht->arBuckets[nIndex]);
if (pDest) {
if (ht->pDestructor) {
ht->pDestructor(p->pData);
}
- if (flag & HASH_ADD_PTR) {
- if (!p->pDataPtr) {
- efree(p->pData);
- }
- p->pDataPtr = pData;
- p->pData = &p->pDataPtr;
- } else {
- if (p->pDataPtr) {
- p->pData = (void *) emalloc(nDataSize);
- p->pDataPtr=NULL;
- }
- memcpy(p->pData, pData, nDataSize);
- }
+ UPDATE_DATA(ht, p, pData, nDataSize);
if (pDest) {
*pDest = p->pData;
}
memcpy(p->arKey, arKey, nKeyLength);
p->nKeyLength = nKeyLength;
- if (flag & HASH_ADD_PTR) {
- p->pDataPtr = pData;
- p->pData = &p->pDataPtr;
- } else {
- p->pData = (void *) pemalloc(nDataSize, ht->persistent);
- if (!p->pData) {
- pefree(p, ht->persistent);
- pefree(p->arKey, ht->persistent);
- return FAILURE;
- }
-
- memcpy(p->pData, pData, nDataSize);
- p->pDataPtr=NULL;
- }
+ INIT_DATA(ht, p, pData, nDataSize);
p->h = h;
CONNECT_TO_BUCKET_DLLIST(p, ht->arBuckets[nIndex]);
if (ht->pDestructor) {
ht->pDestructor(p->pData);
}
- if (flag & HASH_ADD_PTR) {
- if (!p->pDataPtr) {
- efree(p->pData);
- }
- p->pDataPtr = pData;
- p->pData = &p->pDataPtr;
- } else {
- if (p->pDataPtr) {
- p->pData = (void *) emalloc(nDataSize);
- p->pDataPtr=NULL;
- }
- memcpy(p->pData, pData, nDataSize);
- }
+ UPDATE_DATA(ht, p, pData, nDataSize);
HANDLE_UNBLOCK_INTERRUPTIONS();
if (h >= ht->nNextFreeElement) {
ht->nNextFreeElement = h + 1;
}
p->nKeyLength = 0; /* Numeric indices are marked by making the nKeyLength == 0 */
p->h = h;
-
- if (flag & HASH_ADD_PTR) {
- p->pDataPtr = pData;
- p->pData = &p->pDataPtr;
- } else {
- p->pData = (void *) pemalloc(nDataSize, ht->persistent);
- if (!p->pData) {
- pefree(p, ht->persistent);
- return FAILURE;
- }
- memcpy(p->pData, pData, nDataSize);
- p->pDataPtr=NULL;
- }
+ INIT_DATA(ht, p, pData, nDataSize);
if (pDest) {
*pDest = p->pData;
}