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>
8 /* INCLUDES *****************************************************************/
17 /* FUNCTIONS ****************************************************************/
20 CreateGenericList(VOID
)
24 List
= RtlAllocateHeap(ProcessHeap
, 0, sizeof(GENERIC_LIST
));
28 InitializeListHead(&List
->ListHead
);
29 List
->NumOfEntries
= 0;
30 List
->CurrentEntry
= NULL
;
37 IN OUT PGENERIC_LIST List
,
40 PGENERIC_LIST_ENTRY ListEntry
;
43 /* Release list entries */
44 while (!IsListEmpty(&List
->ListHead
))
46 Entry
= RemoveHeadList(&List
->ListHead
);
47 ListEntry
= CONTAINING_RECORD(Entry
, GENERIC_LIST_ENTRY
, Entry
);
49 /* Release user data */
50 if (FreeData
&& ListEntry
->Data
!= NULL
)
51 RtlFreeHeap(ProcessHeap
, 0, ListEntry
->Data
);
53 /* Release list entry */
54 RtlFreeHeap(ProcessHeap
, 0, ListEntry
);
57 /* Release list head */
58 RtlFreeHeap(ProcessHeap
, 0, List
);
62 AppendGenericListEntry(
63 IN OUT PGENERIC_LIST List
,
67 PGENERIC_LIST_ENTRY Entry
;
69 Entry
= RtlAllocateHeap(ProcessHeap
, 0, sizeof(GENERIC_LIST_ENTRY
));
77 InsertTailList(&List
->ListHead
, &Entry
->Entry
);
80 if (Current
|| List
->CurrentEntry
== NULL
)
81 List
->CurrentEntry
= Entry
;
88 IN PGENERIC_LIST List
,
89 IN PGENERIC_LIST_ENTRY Entry
)
91 if (!Entry
|| (Entry
->List
!= List
))
93 List
->CurrentEntry
= Entry
;
98 IN PGENERIC_LIST List
)
100 return List
->CurrentEntry
;
105 IN PGENERIC_LIST List
)
107 if (IsListEmpty(&List
->ListHead
))
110 return CONTAINING_RECORD(List
->ListHead
.Flink
, GENERIC_LIST_ENTRY
, Entry
);
115 IN PGENERIC_LIST_ENTRY Entry
)
117 PLIST_ENTRY Next
= Entry
->Entry
.Flink
;
119 if (Next
== &Entry
->List
->ListHead
)
122 return CONTAINING_RECORD(Next
, GENERIC_LIST_ENTRY
, Entry
);
127 IN PGENERIC_LIST_ENTRY Entry
)
134 IN PGENERIC_LIST_ENTRY Entry
)
136 return Entry
->UiData
;
140 GetNumberOfListEntries(
141 IN PGENERIC_LIST List
)
143 return List
->NumOfEntries
;