http://www.pudn.com/downloads129/sourcecode/embed/detail552605.html
http://www.verysource.com/abstractrtos-122247.html
sll_pub.h
#ifndef _UTLSLL_H_
#define _UTLSLL_H_
#ifdef __cplusplus
extern "C" {
#endif
typedef struct SLL_NODE{
struct SLL_NODE *pNext;
U32 ulHandle;
}SLL_NODE_S;
typedef struct SLL{
SLL_NODE_S Head;
SLL_NODE_S *Tail;
U32 u4_Count;
}SLL_S;
#define SLL_GET_HANDLE(pNode) ((pNode)->ulHandle)
#define SLL_SET_HANDLE(pNode, ulValue) ((pNode)->ulHandle = (U32)(ulValue))
#define SLL_Init(pList) \
{\
(pList)->Head.pNext = &(pList)->Head; \
(pList)->Tail = &(pList)->Head; \
(pList)->u4_Count = 0;\
}
#define SLL_Init_Node(pNode) \
(pNode)->pNext = 0;
#define SLL_Add(pList,pNode) \
SLL_Insert_In_Middle((pList),(pList)->Tail,(pNode),&(pList)->Head)
#define SLL_Count(pList) ((pList)->u4_Count)
#define SLL_First(pList) \
((SLL_Count((pList)) == 0) ? NULL: (pList)->Head.pNext)
#define SLL_Last(pList) \
((SLL_Count((pList)) == 0) ? NULL : (pList)->Tail)
#define SLL_Next(pList,pNode) \
(((pNode) == NULL) ? SLL_First(pList) : \
(((pNode)->pNext == &(pList)->Head) ? NULL : (pNode)->pNext))
#define SLL_Is_Node_In_List(pNode) \
(pNode->pNext != NULL)
#define SLL_Scan(pList,pNode,TypeCast) \
for(pNode = (TypeCast)(SLL_First((pList))); \
pNode != NULL; \
pNode = (TypeCast)SLL_Next((pList),((SLL_NODE_S *)(pNode))))
SLL_NODE_S *SLL_Find(SLL_S *pList, VOID *pKey, S32 (*fnValCmp)(VOID *, SLL_NODE_S *));
VOID SLL_Insert_In_Middle (SLL_S *pList, SLL_NODE_S *pPrev, SLL_NODE_S *pMid, SLL_NODE_S *pNext);
VOID SLL_Delete_In_Middle (SLL_S *pList,
SLL_NODE_S *pPrev,
SLL_NODE_S *pNode,
SLL_NODE_S *pNext);
VOID SLL_Delete (SLL_S *pList, SLL_NODE_S *pNode);
SLL_NODE_S *SLL_Get (SLL_S *pList);
VOID SLL_Insert (SLL_S *pList,SLL_NODE_S *pPrev,SLL_NODE_S *pNode);
SLL_NODE_S *SLL_Previous (SLL_S *pList,SLL_NODE_S *pNode);
VOID SLL_FreeAll (SLL_S *pList, VOID (*fnFree)(VOID *));
S32 SLL_Walk(SLL_S *pList, VOID (*fnVisit)(SLL_NODE_S *));
#ifdef __cplusplus
}
#endif
#endif
ssp_sll.c
#include "syscfg.h"
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif
#include "aos.h"
SLL_NODE_S *SLL_Find(SLL_S *pList, VOID *pKey,
S32 (*fnValCmp)(VOID *, SLL_NODE_S *))
{
SLL_NODE_S *pNode;
SLL_Scan(pList, pNode, SLL_NODE_S *)
{
if (!fnValCmp(pKey, pNode))
return pNode;
}
return NULL;
}
VOID SLL_Insert_In_Middle (SLL_S *pList, SLL_NODE_S *pPrev, SLL_NODE_S *pMid, SLL_NODE_S *pNext)
{
pList->u4_Count++;
pMid->pNext = pNext;
pPrev->pNext = pMid;
if(pNext == &pList->Head) pList->Tail = pMid;
}
VOID SLL_Delete_In_Middle (SLL_S *pList, SLL_NODE_S *pPrev, SLL_NODE_S *pNode, SLL_NODE_S *pNext)
{
if(pNext == &pList->Head) pList->Tail = pPrev;
pPrev->pNext = pNext;
SLL_Init_Node(pNode);
pList->u4_Count--;
}
VOID SLL_Delete (SLL_S *pList, SLL_NODE_S *pNode)
{
SLL_NODE_S *pPrev;
if(!(SLL_Is_Node_In_List(pNode))) return;
if((pPrev = SLL_Previous(pList,pNode)) == NULL)
pPrev = &pList->Head;
SLL_Delete_In_Middle(pList,pPrev,pNode,pNode->pNext);
}
SLL_NODE_S *SLL_Get (SLL_S *pList)
{
SLL_NODE_S *pRetNode;
if(SLL_Count(pList) == 0) return(NULL);
pRetNode = pList->Head.pNext;
SLL_Delete_In_Middle(pList,&pList->Head,pList->Head.pNext,pList->Head.pNext->pNext);
return(pRetNode);
}
VOID SLL_Insert (SLL_S *pList, SLL_NODE_S *pPrev, SLL_NODE_S *pNode)
{
if(pPrev == NULL) pPrev = &pList->Head;
SLL_Insert_In_Middle(pList,pPrev,pNode,pPrev->pNext);
}
SLL_NODE_S *SLL_Previous (SLL_S *pList, SLL_NODE_S *pNode)
{
SLL_NODE_S *pPrev;
if(pNode == NULL) return(SLL_Last(pList));
if (!SLL_Count(pList))
return NULL;
for(pPrev = &pList->Head; pNode != pPrev->pNext ; pPrev = pPrev->pNext)
{
}
return((pPrev == &pList->Head) ? NULL : pPrev);
}
VOID SLL_FreeAll (SLL_S *pList, VOID (*fnFree)(VOID *))
{
SLL_NODE_S *pTempNode,*pNode,*pHead;
for(pHead = &pList->Head,pNode = pList->Head.pNext; pNode != pHead; pNode = pTempNode){
pTempNode = pNode->pNext;
fnFree(pNode);
}
SLL_Init(pList);
}
S32 SLL_Walk(SLL_S *pList, VOID (*fnVisit)(SLL_NODE_S *))
{
SLL_NODE_S *pNode;
S32 nCnt;
nCnt = 0;
SLL_Scan(pList, pNode, SLL_NODE_S *)
{
fnVisit(pNode);
nCnt++;
}
return nCnt;
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif