/*============================================================================= // _priv_simple_hash.c //============================================================================= // COMPANY : // AUTHOR : firstpw // DATE : // DESCRIPTION : //============================================================================= */ #define _PRIV_SIMPLE_HASH_C
/*============================================================================= // I N C L U D E //============================================================================= */ #include "_priv_simple_hash.h"
/*============================================================================= // M A C R O //============================================================================= */
/*============================================================================= // C O N S T A N T //============================================================================= */
/*============================================================================= // S T R U C T U R E //============================================================================= */
/*============================================================================= // S T A T I C V A R I A B L E //============================================================================= */
/*============================================================================= // S T A T I C F U N C T I O N //============================================================================= */ /* ------------------------------ Start Of sHash --------------------------- */ /* Simple Hash */ Boolean priv_sHash_init(Priv_sHash_Entity* pEnt) { xu32 idx;
BCHK_NULL(pEnt); XSTART()
/* Bucket Init : Header Init */ XMEMSET(pEnt->mHashBucketArr, 0x00, sizeof(pEnt->mHashBucketArr)); LOOP(PRIV_MAX_HASH_ENTRY) { if(pEnt->mHashAllEntry[idx].mHashUsed) { pEnt->mHashAllEntry[idx].mHashUsed = uFalse; } }
RETURN(uTrue); }
Boolean priv_sHash_find(Priv_sHash_Entity* pEnt, xu8* pKey, Priv_sHash_Node** ppElem) { xu32 idx; Priv_sHash_Node* pElem;
BCHK_NULL(pEnt); BCHK_NULL(pKey); /* ppElem == NULL : is_exist BCHK_NULL(ppElem); */ XSTART();
/* Select Bucket Idx */ idx = PRIV_HASH_BUCK_IDX_BY_MAC(pKey); HASH_LOOP_ENTRY(pElem, pEnt->mHashBucketArr[idx]) { if (PRIV_IS_MAC_ADDR_EQ(pElem->mHashKey, pKey)) { /* Found */ if (ppElem) *ppElem = pElem; RETURN(uTrue); } } /* NOT Found */
RETURN(uFalse); }
Boolean priv_sHash_get_elem(Priv_sHash_Entity* pEnt, Priv_sHash_Node** ppElem) { xu32 idx;
BCHK_NULL(pEnt); BCHK_NULL(ppElem); XSTART();
LOOP(PRIV_MAX_HASH_ENTRY) { if(! pEnt->mHashAllEntry[idx].mHashUsed) { /* Select Bucket Idx */ *ppElem = &pEnt->mHashAllEntry[idx]; RETURN(uTrue); } }
RETURN(uFalse); }
Boolean priv_sHash_insert(Priv_sHash_Entity* pEnt, xu8* pKey, Priv_sHash_Node** ppElem) { xu32 idx; Priv_sHash_Node* pElem;
BCHK_NULL(pEnt); BCHK_NULL(pKey); BCHK_NULL(ppElem); XSTART();
if(! priv_sHash_get_elem(pEnt, &pElem)) { RETURN(uFalse); } pElem->mHashUsed = uTrue; XMEMCPY(pElem->mHashKey, pKey, PRIV_MAC_ADDR_LEN); /* Select Bucket Idx */ idx = PRIV_HASH_BUCK_IDX(pElem); HASH_INSERT_ENTRY(pEnt->mHashBucketArr[idx], pElem);
*ppElem = pElem;
RETURN(uTrue); }
/* Not found => insert */ Boolean priv_sHash_find_insert(Priv_sHash_Entity* pEnt, xu8* pKey, Priv_sHash_Node** ppElem) { BCHK_NULL(pEnt); BCHK_NULL(pKey); BCHK_NULL(ppElem); XSTART();
if (priv_sHash_find(pEnt, pKey, ppElem)) { /* Found */ RETURN(uTrue); } if (priv_sHash_insert(pEnt, pKey, ppElem)) { /* Found */ RETURN(uTrue); } /* There is No Room : Full */ RETURN(uFalse); }
Boolean priv_sHash_delete(Priv_sHash_Entity* pEnt, xu8* pKey) { xu32 idx; Priv_sHash_Node* pElem;
BCHK_NULL(pEnt); BCHK_NULL(pKey); XSTART();
if (! priv_sHash_find(pEnt, pKey, &pElem)) { /* NOT Found */ RETURN(uTrue); } idx = PRIV_HASH_BUCK_IDX(pElem); HASH_DELETE_ENTRY(pEnt->mHashBucketArr[idx], pElem);
pElem->mHashUsed = uFalse; RETURN(uFalse); }
Boolean priv_sHash_delete_with_node(Priv_sHash_Entity* pEnt, Priv_sHash_Node* pElem) { xu32 idx;
BCHK_NULL(pEnt); BCHK_NULL(pElem); XSTART();
idx = PRIV_HASH_BUCK_IDX(pElem); HASH_DELETE_ENTRY(pEnt->mHashBucketArr[idx], pElem);
pElem->mHashUsed = uFalse; RETURN(uFalse); }
Boolean priv_sHash_loop_cb(Priv_sHash_Entity* pEnt, Priv_sHash_Cb pCb, void* pUserPtr, Boolean isStopOnFail) { xu32 idx; Priv_sHash_Node* pElem;
BCHK_NULL(pEnt); XSTART();
LOOP(PRIV_MAX_HASH_ENTRY) { pElem = &pEnt->mHashAllEntry[idx]; if(pElem->mHashUsed) { if(! pCb(pUserPtr, pElem) && isStopOnFail) { XLOG("UserCb(%u) is failed.", idx); RETURN(uFalse); } } }
RETURN(uTrue); } /* ------------------------------ End Of sHash --------------------------- */
|