home *** CD-ROM | disk | FTP | other *** search
-
- //=============================================================================
- // 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
-