MT7601u/src/include/link_list.h
Murat Demirtas 612db32659 FIXED
2016-10-30 14:40:00 +00:00

183 lines
3.4 KiB
C

#ifndef __LINK_LIST_H__
#define __LINK_LIST_H__
typedef struct _LIST_ENTRY
{
struct _LIST_ENTRY *pNext;
} LIST_ENTRY, *PLIST_ENTRY;
typedef struct _LIST_HEADR
{
PLIST_ENTRY pHead;
PLIST_ENTRY pTail;
UCHAR size;
} LIST_HEADER, *PLIST_HEADER;
static inline VOID initList(
IN PLIST_HEADER pList)
{
pList->pHead = pList->pTail = NULL;
pList->size = 0;
return;
}
static inline VOID insertTailList(
IN PLIST_HEADER pList,
IN PLIST_ENTRY pEntry)
{
pEntry->pNext = NULL;
if (pList->pTail)
pList->pTail->pNext = pEntry;
else
pList->pHead = pEntry;
pList->pTail = pEntry;
pList->size++;
return;
}
static inline PLIST_ENTRY removeHeadList(
IN PLIST_HEADER pList)
{
PLIST_ENTRY pNext;
PLIST_ENTRY pEntry;
pEntry = pList->pHead;
if (pList->pHead != NULL)
{
pNext = pList->pHead->pNext;
pList->pHead = pNext;
if (pNext == NULL)
pList->pTail = NULL;
pList->size--;
}
return pEntry;
}
static inline int getListSize(
IN PLIST_HEADER pList)
{
return pList->size;
}
static inline PLIST_ENTRY delEntryList(
IN PLIST_HEADER pList,
IN PLIST_ENTRY pEntry)
{
PLIST_ENTRY pCurEntry;
PLIST_ENTRY pPrvEntry;
if(pList->pHead == NULL)
return NULL;
if(pEntry == pList->pHead)
{
pCurEntry = pList->pHead;
pList->pHead = pCurEntry->pNext;
if(pList->pHead == NULL)
pList->pTail = NULL;
pList->size--;
return pCurEntry;
}
pPrvEntry = pList->pHead;
pCurEntry = pPrvEntry->pNext;
while(pCurEntry != NULL)
{
if (pEntry == pCurEntry)
{
pPrvEntry->pNext = pCurEntry->pNext;
if(pEntry == pList->pTail)
pList->pTail = pPrvEntry;
pList->size--;
break;
}
pPrvEntry = pCurEntry;
pCurEntry = pPrvEntry->pNext;
}
return pCurEntry;
}
typedef struct _DL_LIST
{
struct _DL_LIST *Next;
struct _DL_LIST *Prev;
}DL_LIST, *PDL_LIST;
static inline void DlListInit(struct _DL_LIST *List)
{
List->Next = List;
List->Prev = List;
}
static inline void DlListAdd(struct _DL_LIST *List, struct _DL_LIST *Item)
{
Item->Next = List->Next;
Item->Prev = List;
List->Next->Prev = Item;
List->Next = Item;
}
static inline void DlListAddTail(struct _DL_LIST *List, struct _DL_LIST *Item)
{
DlListAdd(List->Prev, Item);
}
static inline void DlListDel(struct _DL_LIST *Item)
{
Item->Next->Prev = Item->Prev;
Item->Prev->Next = Item->Next;
Item->Next = NULL;
Item->Prev = NULL;
}
static inline int DlListEmpty(struct _DL_LIST *List)
{
return List->Next == List;
}
static inline unsigned int DlListLen(struct _DL_LIST *List)
{
struct _DL_LIST *Item;
unsigned int Count = 0;
for (Item = List->Next; Item != List; Item = Item->Next)
Count++;
return Count;
}
#ifndef offsetof
#define offsetof(type, member) ((long) &((type *) 0)->member)
#endif
#define DlListEntry(item, type, member) \
((type *) ((char *) item - offsetof(type, member)))
#define DlListFirst(list, type, member) \
(DlListEmpty((list)) ? NULL : \
DlListEntry((list)->Next, type, member))
#define DlListForEach(item, list, type, member) \
for (item = DlListEntry((list)->Next, type, member); \
&item->member != (list); \
item = DlListEntry(item->member.Next, type, member))
#define DlListForEachSafe(item, n, list, type, member) \
for (item = DlListEntry((list)->Next, type, member), \
n = DlListEntry(item->member.Next, type, member); \
&item->member != (list); \
item = n, n = DlListEntry(n->member.Next, type, member))
#endif /* ___LINK_LIST_H__ */