Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156/* * PROJECT: ReactOS Setup Library * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) * PURPOSE: Generic list functions * COPYRIGHT: Copyright 2008-2018 Christoph von Wittich <christoph at reactos.org> */
/* INCLUDES *****************************************************************/
#include "precomp.h"
#include "genlist.h"
#define NDEBUG#include <debug.h>
/* FUNCTIONS ****************************************************************/
PGENERIC_LISTNTAPICreateGenericList(VOID){ PGENERIC_LIST List;
List = RtlAllocateHeap(ProcessHeap, 0, sizeof(GENERIC_LIST)); if (List == NULL) return NULL;
InitializeListHead(&List->ListHead); List->NumOfEntries = 0; List->CurrentEntry = NULL;
return List;}
VOIDNTAPIDestroyGenericList( IN OUT PGENERIC_LIST List, IN BOOLEAN FreeData){ PGENERIC_LIST_ENTRY ListEntry; PLIST_ENTRY Entry;
/* Release list entries */ while (!IsListEmpty(&List->ListHead)) { Entry = RemoveHeadList(&List->ListHead); ListEntry = CONTAINING_RECORD(Entry, GENERIC_LIST_ENTRY, Entry);
/* Release user data */ if (FreeData && ListEntry->Data != NULL) RtlFreeHeap(ProcessHeap, 0, ListEntry->Data);
/* Release list entry */ RtlFreeHeap(ProcessHeap, 0, ListEntry); }
/* Release list head */ RtlFreeHeap(ProcessHeap, 0, List);}
BOOLEANNTAPIAppendGenericListEntry( IN OUT PGENERIC_LIST List, IN PVOID Data, IN BOOLEAN Current){ PGENERIC_LIST_ENTRY Entry;
Entry = RtlAllocateHeap(ProcessHeap, 0, sizeof(GENERIC_LIST_ENTRY)); if (Entry == NULL) return FALSE;
Entry->List = List; Entry->Data = Data; Entry->UiData = 0;
InsertTailList(&List->ListHead, &Entry->Entry); ++List->NumOfEntries;
if (Current || List->CurrentEntry == NULL) List->CurrentEntry = Entry;
return TRUE;}
VOIDNTAPISetCurrentListEntry( IN PGENERIC_LIST List, IN PGENERIC_LIST_ENTRY Entry){ if (!Entry || (Entry->List != List)) return; List->CurrentEntry = Entry;}
PGENERIC_LIST_ENTRYNTAPIGetCurrentListEntry( IN PGENERIC_LIST List){ return List->CurrentEntry;}
PGENERIC_LIST_ENTRYNTAPIGetFirstListEntry( IN PGENERIC_LIST List){ if (IsListEmpty(&List->ListHead)) return NULL;
return CONTAINING_RECORD(List->ListHead.Flink, GENERIC_LIST_ENTRY, Entry);}
PGENERIC_LIST_ENTRYNTAPIGetNextListEntry( IN PGENERIC_LIST_ENTRY Entry){ PLIST_ENTRY Next = Entry->Entry.Flink;
if (Next == &Entry->List->ListHead) return NULL;
return CONTAINING_RECORD(Next, GENERIC_LIST_ENTRY, Entry);}
PVOIDNTAPIGetListEntryData( IN PGENERIC_LIST_ENTRY Entry){ return Entry->Data;}
ULONG_PTRGetListEntryUiData( IN PGENERIC_LIST_ENTRY Entry){ return Entry->UiData;}
ULONGNTAPIGetNumberOfListEntries( IN PGENERIC_LIST List){ return List->NumOfEntries;}
/* EOF */