318 lines
9.8 KiB
C
318 lines
9.8 KiB
C
|
|
//=============================================================================
|
|
// Microsoft (R) Bloodhound (tm). Copyright (C) 1991-1993.
|
|
//
|
|
// MODULE: list.h
|
|
//
|
|
// Modification History
|
|
//
|
|
// raypa 03/17/93 Created.
|
|
//=============================================================================
|
|
|
|
#if !defined(_LIST_)
|
|
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
|
|
|
|
#define _LIST_
|
|
#pragma pack(1)
|
|
|
|
//=============================================================================
|
|
// The LINK structure is used to chain structures together into a list.
|
|
//=============================================================================
|
|
|
|
typedef struct _LINK *LPLINK;
|
|
|
|
typedef struct _LINK
|
|
{
|
|
LPLINK PrevLink; //... Previous or back pointer.
|
|
LPLINK NextLink; //... Next or forward pointer.
|
|
} LINK;
|
|
|
|
//=============================================================================
|
|
// The LIST data structure.
|
|
//=============================================================================
|
|
|
|
typedef struct _LIST
|
|
{
|
|
LPLINK Tail; //... List Tail pointer.
|
|
LPLINK Head; //... List Head pointer.
|
|
DWORD Length; //... List Length.
|
|
} LIST;
|
|
|
|
typedef LIST *LPLIST;
|
|
|
|
|
|
#ifndef NO_INLINE
|
|
|
|
#ifndef INLINE
|
|
#define INLINE __inline
|
|
#endif
|
|
|
|
//=============================================================================
|
|
// FUNCTIONS.
|
|
//=============================================================================
|
|
|
|
INLINE LPLINK WINAPI GetPrevLink(LPLINK Link)
|
|
{
|
|
return Link->PrevLink;
|
|
}
|
|
|
|
INLINE LPLINK WINAPI GetNextLink(LPLINK Link)
|
|
{
|
|
return Link->NextLink;
|
|
}
|
|
|
|
INLINE LPLINK WINAPI GetHeadOfList(LPLIST List)
|
|
{
|
|
return List->Head;
|
|
}
|
|
|
|
INLINE LPLINK WINAPI GetTailOfList(LPLIST List)
|
|
{
|
|
return List->Tail;
|
|
}
|
|
|
|
INLINE DWORD WINAPI GetListLength(LPLIST List)
|
|
{
|
|
return List->Length;
|
|
}
|
|
|
|
//=============================================================================
|
|
// FUNCTION: InitializeList()
|
|
//
|
|
// Modification History
|
|
//
|
|
// raypa 04/15/93 Created
|
|
//=============================================================================
|
|
|
|
INLINE LPLIST WINAPI InitializeList(LPLIST List)
|
|
{
|
|
List->Head = (LPLINK) 0L;
|
|
List->Tail = (LPLINK) 0L;
|
|
List->Length = 0;
|
|
|
|
return List;
|
|
}
|
|
|
|
//=============================================================================
|
|
// FUNCTION: AddLinkToLink()
|
|
//
|
|
// Modification History
|
|
//
|
|
// raypa 04/15/93 Created
|
|
//=============================================================================
|
|
|
|
INLINE VOID WINAPI AddLinkToLink(LPLINK DstLink, LPLINK SrcLink)
|
|
{
|
|
//=========================================================================
|
|
// Make the source link point at the destination link.
|
|
//=========================================================================
|
|
|
|
SrcLink->PrevLink = DstLink;
|
|
SrcLink->NextLink = DstLink->NextLink;
|
|
|
|
//=========================================================================
|
|
// Make the destination link point at the source link.
|
|
//=========================================================================
|
|
|
|
DstLink->NextLink->PrevLink = SrcLink;
|
|
DstLink->NextLink = SrcLink;
|
|
}
|
|
|
|
//=============================================================================
|
|
// FUNCTION: AddToList()
|
|
//
|
|
// Modification History
|
|
//
|
|
// raypa 04/15/93 Created
|
|
//=============================================================================
|
|
|
|
INLINE LPLINK WINAPI AddToList(LPLIST List, LPLINK DstLink, LPLINK SrcLink)
|
|
{
|
|
//=========================================================================
|
|
// Grow the list length by one.
|
|
//=========================================================================
|
|
|
|
List->Length++;
|
|
|
|
//=========================================================================
|
|
// If SrcLink is NULL then add DstLink to the end of the list.
|
|
//=========================================================================
|
|
|
|
if ( SrcLink == (LPLINK) 0L )
|
|
{
|
|
//=====================================================================
|
|
// If the tail pointer is NULL then the list is empty.
|
|
//=====================================================================
|
|
|
|
if ( List->Tail != (LPLINK) 0L )
|
|
{
|
|
AddLinkToLink(List->Tail, DstLink);
|
|
}
|
|
else
|
|
{
|
|
DstLink->PrevLink = DstLink;
|
|
DstLink->NextLink = DstLink;
|
|
|
|
List->Head = DstLink;
|
|
}
|
|
|
|
return (List->Tail = DstLink);
|
|
}
|
|
|
|
//=========================================================================
|
|
// If DstLink is NULL then add SrcLink to the front of the list.
|
|
//=========================================================================
|
|
|
|
if ( DstLink == (LPLINK) 0L )
|
|
{
|
|
//=====================================================================
|
|
// If the head pointer is NULL then the list is empty.
|
|
//=====================================================================
|
|
|
|
if ( List->Head != (LPLINK) 0L )
|
|
{
|
|
AddLinkToLink(List->Head, SrcLink);
|
|
}
|
|
else
|
|
{
|
|
SrcLink->PrevLink = SrcLink;
|
|
SrcLink->NextLink = SrcLink;
|
|
|
|
List->Tail = SrcLink;
|
|
}
|
|
|
|
return (List->Head = SrcLink);
|
|
}
|
|
|
|
//=========================================================================
|
|
// Neither DstLink nor SrcLink is NULL so link them together.
|
|
//=========================================================================
|
|
|
|
AddLinkToLink(DstLink, SrcLink);
|
|
|
|
return SrcLink;
|
|
}
|
|
|
|
//=============================================================================
|
|
// FUNCTION: DeleteFromList()
|
|
//
|
|
// Modification History
|
|
//
|
|
// raypa 04/15/93 Created
|
|
//=============================================================================
|
|
|
|
INLINE LPLINK WINAPI DeleteFromList(LPLIST List, LPLINK Link)
|
|
{
|
|
//=========================================================================
|
|
// If the list is empty then return NULL.
|
|
//=========================================================================
|
|
|
|
if ( List->Length != 0 )
|
|
{
|
|
//=====================================================================
|
|
// If the list length is not zero then we may need to fixup head and
|
|
// tail pointers in the event we delete the first or last link,
|
|
// respectively.
|
|
//=====================================================================
|
|
|
|
if ( --List->Length != 0 )
|
|
{
|
|
//=================================================================
|
|
// If we are deleting the front link then fixup the head pointer.
|
|
//=================================================================
|
|
|
|
if ( List->Head == Link )
|
|
{
|
|
List->Head = List->Head->NextLink;
|
|
}
|
|
|
|
//=================================================================
|
|
// If we are deleting the end link then fixup the tail pointer.
|
|
//=================================================================
|
|
|
|
if ( List->Tail == Link )
|
|
{
|
|
List->Tail = List->Tail->PrevLink;
|
|
}
|
|
|
|
//=================================================================
|
|
// Now we can unlink this link from the list.
|
|
//=================================================================
|
|
|
|
Link->NextLink->PrevLink = Link->PrevLink;
|
|
Link->PrevLink->NextLink = Link->NextLink;
|
|
}
|
|
else
|
|
{
|
|
//=================================================================
|
|
// There is only one link on the list and we just deleted it.
|
|
//=================================================================
|
|
|
|
List->Head = (LPLINK) 0L;
|
|
List->Tail = (LPLINK) 0L;
|
|
}
|
|
|
|
return Link;
|
|
}
|
|
|
|
return (LPLINK) 0L;
|
|
}
|
|
|
|
//=============================================================================
|
|
// FUNCTION: AddToFrontOfList()
|
|
//
|
|
// Modification History
|
|
//
|
|
// raypa 04/15/93 Created
|
|
//=============================================================================
|
|
|
|
INLINE LPLINK WINAPI AddToFrontOfList(LPLIST List, LPLINK Link)
|
|
{
|
|
return AddToList(List, (LPLINK) 0L, Link);
|
|
}
|
|
|
|
//=============================================================================
|
|
// FUNCTION: AddToEndOfList()
|
|
//
|
|
// Modification History
|
|
//
|
|
// raypa 04/15/93 Created
|
|
//=============================================================================
|
|
|
|
INLINE LPLINK WINAPI AddToEndOfList(LPLIST List, LPLINK Link)
|
|
{
|
|
return AddToList(List, Link, (LPLINK) 0L);
|
|
}
|
|
|
|
//=============================================================================
|
|
// FUNCTION: DeleteFromFrontOfList()
|
|
//
|
|
// Modification History
|
|
//
|
|
// raypa 04/15/93 Created
|
|
//=============================================================================
|
|
|
|
INLINE LPLINK WINAPI DeleteFromFrontOfList(LPLIST List)
|
|
{
|
|
return DeleteFromList(List, GetHeadOfList(List));
|
|
}
|
|
|
|
//=============================================================================
|
|
// FUNCTION: DeleteFromEndOfList()
|
|
//
|
|
// Modification History
|
|
//
|
|
// raypa 04/15/93 Created
|
|
//=============================================================================
|
|
|
|
INLINE LPLINK WINAPI DeleteFromEndOfList(LPLIST List)
|
|
{
|
|
return DeleteFromList(List, GetTailOfList(List));
|
|
}
|
|
|
|
#endif
|
|
|
|
#pragma pack()
|
|
#pragma option pop /*P_O_Pop*/
|
|
#endif
|