ReactOS 0.4.16-dev-747-gbc52d5f
genlist.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Setup Library
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Generic list functions
5 * COPYRIGHT: Copyright 2008-2018 Christoph von Wittich <christoph at reactos.org>
6 */
7
8/* INCLUDES *****************************************************************/
9
10#include "precomp.h"
11
12#include "genlist.h"
13
14#define NDEBUG
15#include <debug.h>
16
17/* FUNCTIONS ****************************************************************/
18
22{
24
26 if (List == NULL)
27 return NULL;
28
29 InitializeListHead(&List->ListHead);
30 List->NumOfEntries = 0;
31 List->CurrentEntry = NULL;
32
33 return List;
34}
35
36VOID
40 IN BOOLEAN FreeData)
41{
42 PGENERIC_LIST_ENTRY ListEntry;
44
45 /* Release list entries */
46 while (!IsListEmpty(&List->ListHead))
47 {
48 Entry = RemoveHeadList(&List->ListHead);
50
51 /* Release user data */
52 if (FreeData && ListEntry->Data != NULL)
53 RtlFreeHeap(ProcessHeap, 0, ListEntry->Data);
54
55 /* Release list entry */
56 RtlFreeHeap(ProcessHeap, 0, ListEntry);
57 }
58
59 /* Release list head */
61}
62
68 IN BOOLEAN Current)
69{
71
73 if (Entry == NULL)
74 return FALSE;
75
76 Entry->List = List;
77 Entry->Data = Data;
78 Entry->UiData = 0;
79
80 InsertTailList(&List->ListHead, &Entry->Entry);
81 ++List->NumOfEntries;
82
83 if (Current || List->CurrentEntry == NULL)
84 List->CurrentEntry = Entry;
85
86 return TRUE;
87}
88
89VOID
94{
95 if (!Entry || (Entry->List != List))
96 return;
97 List->CurrentEntry = Entry;
98}
99
101NTAPI
104{
105 return List->CurrentEntry;
106}
107
109NTAPI
112{
113 if (IsListEmpty(&List->ListHead))
114 return NULL;
115
116 return CONTAINING_RECORD(List->ListHead.Flink, GENERIC_LIST_ENTRY, Entry);
117}
118
120NTAPI
123{
124 PLIST_ENTRY Next = Entry->Entry.Flink;
125
126 if (Next == &Entry->List->ListHead)
127 return NULL;
128
130}
131
132PVOID
133NTAPI
136{
137 return Entry->Data;
138}
139
143{
144 return Entry->UiData;
145}
146
147ULONG
148NTAPI
151{
152 return List->NumOfEntries;
153}
154
155/* EOF */
unsigned char BOOLEAN
HANDLE ProcessHeap
Definition: servman.c:15
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:616
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:634
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define InsertTailList(ListHead, Entry)
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
#define RemoveHeadList(ListHead)
Definition: env_spec_w32.h:964
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
ULONG NTAPI GetNumberOfListEntries(IN PGENERIC_LIST List)
Definition: genlist.c:149
VOID NTAPI SetCurrentListEntry(IN PGENERIC_LIST List, IN PGENERIC_LIST_ENTRY Entry)
Definition: genlist.c:91
VOID NTAPI DestroyGenericList(IN OUT PGENERIC_LIST List, IN BOOLEAN FreeData)
Definition: genlist.c:38
ULONG_PTR GetListEntryUiData(IN PGENERIC_LIST_ENTRY Entry)
Definition: genlist.c:141
PGENERIC_LIST NTAPI CreateGenericList(VOID)
Definition: genlist.c:21
BOOLEAN NTAPI AppendGenericListEntry(IN OUT PGENERIC_LIST List, IN PVOID Data, IN BOOLEAN Current)
Definition: genlist.c:65
PGENERIC_LIST_ENTRY NTAPI GetFirstListEntry(IN PGENERIC_LIST List)
Definition: genlist.c:110
PGENERIC_LIST_ENTRY NTAPI GetNextListEntry(IN PGENERIC_LIST_ENTRY Entry)
Definition: genlist.c:121
PGENERIC_LIST_ENTRY NTAPI GetCurrentListEntry(IN PGENERIC_LIST List)
Definition: genlist.c:102
PVOID NTAPI GetListEntryData(IN PGENERIC_LIST_ENTRY Entry)
Definition: genlist.c:134
STDMETHOD() Next(THIS_ ULONG celt, IAssociationElement *pElement, ULONG *pceltFetched) PURE
base of all file and directory entries
Definition: entries.h:83
Entry(ENTRY_TYPE etype)
Definition: entries.cpp:35
Definition: genlist.h:11
PVOID Data
Definition: genlist.h:14
Definition: typedefs.h:120
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550