mirror of
https://github.com/YikeStone/MT7601u.git
synced 2025-08-03 11:24:09 +05:30
183 lines
3.4 KiB
C
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__ */
|
|
|