dll_pub.h
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif
#ifndef __INC_DLL_PUB_H__
#define __INC_DLL_PUB_H__
#define DLL_GET_HANDLE(pNode) ((pNode)->ulHandle)
#define DLL_SET_HANDLE(pNode, ulValue) ((pNode)->ulHandle = (U32)(ulValue))
#define DLL_Init(pList) \
{\
(pList)->Head.pNext = &(pList)-> Head; \
(pList)->Head.pPrev = &(pList)-> Head; \
(pList)->ulCount = 0; \
}
#define DLL_Init_Node(pNode) \
(pNode)->pPrev = (pNode)->pNext = NULL;
#define DLL_Add(pList,pNode) \
dll_insert_in_middle((pList),(pList)->Head.pPrev,(pNode),&(pList)->Head)
#define DLL_Count(pList) ((pList)->ulCount)
#define DLL_First(pList) \
((DLL_Count((pList)) == 0) ? NULL: (pList)->Head.pNext)
#define DLL_Last(pList) \
((DLL_Count((pList)) == 0) ? NULL : (pList)->Head.pPrev)
#define DLL_Next(pList,pNode) \
(((pNode) == NULL) ? DLL_First(pList) : \
(((pNode)->pNext == &(pList)->Head) ? NULL : (pNode)->pNext))
#define DLL_Previous(pList,pNode) \
(((pNode) == NULL) ? DLL_Last(pList) : \
(((pNode)->pPrev == &(pList)->Head) ? NULL : (pNode)->pPrev))
#define DLL_Is_Node_In_List(pNode) \
(((pNode)->pNext != NULL) && \
((pNode)->pPrev != NULL) && \
((pNode)->pNext->pPrev == pNode) && \
((pNode)->pPrev->pNext == pNode))
#define DLL_Scan(pList,pNode,TypeCast) \
for(pNode = (TypeCast)(DLL_First((pList))); \
pNode != NULL; \
pNode = (TypeCast)(DLL_Next((pList),((DLL_NODE_S *)(pNode)))))
typedef struct dll_node
{
struct dll_node *pNext;
struct dll_node*pPrev;
U32 ulHandle;
}DLL_NODE_S;
typedef struct DLL{
DLL_NODE_S Head;
U32 ulCount;
}DLL_S;
DLL_NODE_S *dll_find(DLL_S *pList, VOID *pKey,
S32 (*fnValCmp)(VOID *, DLL_NODE_S *));
VOID dll_insert_in_middle (DLL_S *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pMid, DLL_NODE_S *pNext);
#undef dll_insert
VOID dll_insert (DLL_S *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pNode);
VOID dll_delete_in_middle (DLL_S *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pNode, DLL_NODE_S *pNext);
VOID dll_delete(DLL_S *pList, DLL_NODE_S *pNode);
DLL_NODE_S *dll_get (DLL_S *pList);
VOID dll_free_all (DLL_S *pList, VOID (*fnFree)(VOID *));
S32 dll_walk(DLL_S *pList, VOID (*fnVisit)(DLL_NODE_S *));
#endif
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
ssp_dll.c
#include "syscfg.h"
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif
#include "aos.h"
DLL_NODE_S *dll_find(DLL_S *pList, VOID *pKey,
S32 (*fnValCmp)(VOID *, DLL_NODE_S *))
{
DLL_NODE_S *pNode;
DLL_Scan(pList, pNode, DLL_NODE_S *)
{
if (!fnValCmp(pKey, pNode))
return pNode;
}
return NULL;
}
VOID dll_insert_in_middle (DLL_S *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pMid, DLL_NODE_S *pNext)
{
pList->ulCount++;
pMid->pNext = pNext;
pMid->pPrev = pPrev;
pPrev->pNext = pMid;
pNext->pPrev = pMid;
}
VOID dll_delete_in_middle (DLL_S *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pNode, DLL_NODE_S *pNext)
{
pPrev->pNext = pNext;
pNext->pPrev = pPrev;
DLL_Init_Node(pNode);
(pList)->ulCount--;
}
VOID dll_insert (DLL_S *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pNode)
{
if(pPrev == NULL)
{
pPrev = &pList->Head;
}
dll_insert_in_middle(pList,pPrev,pNode,pPrev->pNext);
}
VOID dll_delete(DLL_S *pList, DLL_NODE_S *pNode)
{
if (DLL_Is_Node_In_List(pNode))
{
dll_delete_in_middle(pList, pNode->pPrev, pNode, pNode->pNext);
}
}
DLL_NODE_S *dll_get (DLL_S *pList)
{
DLL_NODE_S *pRetNode;
if(DLL_Count(pList) == 0)
{
return(NULL);
}
pRetNode = pList->Head.pNext;
dll_delete_in_middle(pList,&pList->Head,pList->Head.pNext,pList->Head.pNext->pNext);
return(pRetNode);
}
VOID dll_free_all(DLL_S *pList, VOID (*fnFree)(VOID *))
{
DLL_NODE_S *pTempNode,*pNode,*pHead;
for(pHead = &pList->Head,pNode = pList->Head.pNext; pNode != pHead; pNode = pTempNode)
{
pTempNode = pNode->pNext;
fnFree(pNode);
}
DLL_Init(pList);
}
S32 dll_walk(DLL_S *pList, VOID (*fnVisit)(DLL_NODE_S *))
{
DLL_NODE_S *pNode;
S32 nCnt;
nCnt = 0;
DLL_Scan(pList, pNode, DLL_NODE_S *)
{
fnVisit(pNode);
nCnt++;
}
return nCnt;
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif