188 lines
4.5 KiB
C
188 lines
4.5 KiB
C
/***********************************************************************
|
|
*
|
|
* Copyright (C) 2005-2006 Novell, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; version 2.1
|
|
* of the License.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free
|
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
* To contact Novell about this file by physical or electronic mail,
|
|
* you may find current contact information at www.novell.com.
|
|
*
|
|
***********************************************************************/
|
|
|
|
#ifndef _LIST_ENTRY_H_
|
|
#define _LIST_ENTRY_H_
|
|
|
|
#if defined(__cplusplus) || defined(c_plusplus)
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
//===[ Include files ]=====================================================
|
|
|
|
#include <micasa_types.h>
|
|
|
|
//===[ Type definitions ]==================================================
|
|
|
|
#ifndef CSAPI
|
|
#if defined(WIN32)
|
|
#define CSAPI __stdcall
|
|
#else
|
|
#define CSAPI
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef IN
|
|
#define IN
|
|
#endif
|
|
|
|
#ifndef OUT
|
|
#define OUT
|
|
#endif
|
|
|
|
#ifndef INOUT
|
|
#define INOUT
|
|
#endif
|
|
|
|
//
|
|
// LIST_ENTRY Type
|
|
// Doubly linked list structure
|
|
//
|
|
typedef struct _LIST_ENTRY
|
|
{
|
|
struct _LIST_ENTRY * volatile Flink;
|
|
struct _LIST_ENTRY * volatile Blink;
|
|
} LIST_ENTRY, *PLIST_ENTRY;
|
|
|
|
|
|
//===[ Inlines functions ]===============================================
|
|
|
|
//
|
|
// Inline functions for operating on LIST_ENTRY double-linked lists
|
|
//
|
|
|
|
__inline static void InitializeListHead(
|
|
IN PLIST_ENTRY pListEntry )
|
|
{
|
|
pListEntry->Flink = pListEntry->Blink = pListEntry;
|
|
}
|
|
|
|
__inline static void InsertEntryAfter(
|
|
IN PLIST_ENTRY pListEntry,
|
|
IN PLIST_ENTRY pAfterEntry )
|
|
{
|
|
pListEntry->Flink = pAfterEntry->Flink;
|
|
pListEntry->Blink = pAfterEntry;
|
|
pListEntry->Flink->Blink = pAfterEntry->Flink = pListEntry;
|
|
}
|
|
|
|
__inline static void InsertEntryBefore(
|
|
IN PLIST_ENTRY pListEntry,
|
|
IN PLIST_ENTRY pBeforeEntry )
|
|
{
|
|
pListEntry->Flink = pBeforeEntry;
|
|
pListEntry->Blink = pBeforeEntry->Blink;
|
|
pListEntry->Blink->Flink = pBeforeEntry->Blink = pListEntry;
|
|
}
|
|
|
|
__inline static void InsertHeadList(
|
|
IN PLIST_ENTRY pListHead,
|
|
IN PLIST_ENTRY pListEntry )
|
|
{
|
|
pListEntry->Blink = pListHead;
|
|
pListEntry->Flink = pListHead->Flink;
|
|
pListEntry->Flink->Blink = pListHead->Flink = pListEntry;
|
|
}
|
|
|
|
__inline static void InsertTailList(
|
|
IN PLIST_ENTRY pListHead,
|
|
IN PLIST_ENTRY pListEntry )
|
|
{
|
|
pListEntry->Flink = pListHead;
|
|
pListEntry->Blink = pListHead->Blink;
|
|
pListEntry->Blink->Flink = pListHead->Blink = pListEntry;
|
|
}
|
|
|
|
__inline static bool IsListEmpty(
|
|
IN PLIST_ENTRY pListHead )
|
|
{
|
|
bool rc = false;
|
|
if(pListHead->Flink == pListHead)
|
|
rc = true;
|
|
return(rc);
|
|
}
|
|
|
|
__inline static void RemoveEntryList(
|
|
IN PLIST_ENTRY pListEntry )
|
|
{
|
|
pListEntry->Flink->Blink = pListEntry->Blink;
|
|
pListEntry->Blink->Flink = pListEntry->Flink;
|
|
pListEntry->Flink = pListEntry->Blink = (PLIST_ENTRY) 0xbaadf00d;
|
|
}
|
|
|
|
__inline static PLIST_ENTRY RemoveHeadList(
|
|
IN PLIST_ENTRY pListHead )
|
|
{
|
|
PLIST_ENTRY Entry = (PLIST_ENTRY)0;
|
|
if(pListHead->Flink != pListHead)
|
|
{
|
|
Entry = pListHead->Flink;
|
|
RemoveEntryList(Entry);
|
|
}
|
|
return(Entry);
|
|
}
|
|
|
|
__inline static PLIST_ENTRY RemoveTailList(
|
|
IN PLIST_ENTRY pListHead )
|
|
{
|
|
PLIST_ENTRY Entry= (PLIST_ENTRY)0;
|
|
if(pListHead->Blink != pListHead)
|
|
{
|
|
Entry = pListHead->Blink;
|
|
RemoveEntryList(Entry);
|
|
}
|
|
return(Entry);
|
|
}
|
|
|
|
__inline static PLIST_ENTRY GetFirstListEntry(
|
|
IN PLIST_ENTRY pList)
|
|
{
|
|
PLIST_ENTRY Entry = (PLIST_ENTRY)0;
|
|
if(pList != pList->Flink)
|
|
Entry = pList->Flink;
|
|
return(Entry);
|
|
}
|
|
|
|
__inline static PLIST_ENTRY GetNextListEntry(
|
|
IN PLIST_ENTRY pList,
|
|
IN PLIST_ENTRY pEntry)
|
|
{
|
|
PLIST_ENTRY Entry = (PLIST_ENTRY)0;
|
|
if(pList != pEntry->Flink)
|
|
Entry = pEntry->Flink;
|
|
return(Entry);
|
|
}
|
|
|
|
|
|
//=========================================================================
|
|
|
|
|
|
#if defined(__cplusplus) || defined(c_plusplus)
|
|
}
|
|
#endif // #if defined(__cplusplus) || defined(c_plusplus)
|
|
|
|
#endif // #ifndef _LIST_ENTRY_H_
|
|
|
|
|