962289b451fbd11d86baf5fbf2549afc7085ab03
3 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 VOID
RtlListInitializeHead(PLIST_ITEM ListHead
)
24 ListHead
->ListPrev
= NULL
;
25 ListHead
->ListNext
= NULL
;
28 VOID
RtlListInsertHead(PLIST_ITEM ListHead
, PLIST_ITEM Entry
)
30 ListHead
= RtlListGetHead(ListHead
);
31 ListHead
->ListPrev
= Entry
;
32 Entry
->ListNext
= ListHead
;
33 Entry
->ListPrev
= NULL
;
36 VOID
RtlListInsertTail(PLIST_ITEM ListHead
, PLIST_ITEM Entry
)
38 ListHead
= RtlListGetTail(ListHead
);
39 ListHead
->ListNext
= Entry
;
40 Entry
->ListNext
= NULL
;
41 Entry
->ListPrev
= ListHead
;
44 PLIST_ITEM
RtlListRemoveHead(PLIST_ITEM ListHead
)
46 PLIST_ITEM OldListHead
= RtlListGetHead(ListHead
);
48 ListHead
= ListHead
->ListNext
;
49 ListHead
->ListPrev
= NULL
;
54 PLIST_ITEM
RtlListRemoveTail(PLIST_ITEM ListHead
)
58 ListTail
= RtlListGetTail(ListHead
);
59 ListHead
= ListTail
->ListPrev
;
60 ListHead
->ListNext
= NULL
;
65 PLIST_ITEM
RtlListGetHead(PLIST_ITEM ListHead
)
67 while (ListHead
->ListPrev
!= NULL
)
69 ListHead
= ListHead
->ListPrev
;
75 PLIST_ITEM
RtlListGetTail(PLIST_ITEM ListHead
)
77 while (ListHead
->ListNext
!= NULL
)
79 ListHead
= ListHead
->ListNext
;
85 BOOL
RtlListIsEmpty(PLIST_ITEM ListHead
)
92 return (ListHead
->ListNext
== NULL
);
95 U32
RtlListCountEntries(PLIST_ITEM ListHead
)
99 while (ListHead
!= NULL
)
102 ListHead
= ListHead
->ListNext
;
108 PLIST_ITEM
RtlListGetPrevious(PLIST_ITEM ListEntry
)
110 return ListEntry
->ListPrev
;
113 PLIST_ITEM
RtlListGetNext(PLIST_ITEM ListEntry
)
115 return ListEntry
->ListNext
;
118 PLIST_ITEM
RtlListRemoveEntry(PLIST_ITEM ListEntry
)
120 PLIST_ITEM ListNext
= RtlListGetNext(ListEntry
);
121 PLIST_ITEM ListPrev
= RtlListGetPrevious(ListEntry
);
123 if (ListPrev
!= NULL
)
125 ListPrev
->ListNext
= ListNext
;
128 if (ListNext
!= NULL
)
130 ListNext
->ListPrev
= ListPrev
;
136 VOID
RtlListInsertEntry(PLIST_ITEM InsertAfter
, PLIST_ITEM ListEntry
)
138 PLIST_ITEM ListNext
= RtlListGetNext(InsertAfter
);
140 InsertAfter
->ListNext
= ListEntry
;
141 ListEntry
->ListPrev
= InsertAfter
;
142 ListEntry
->ListNext
= ListNext
;
145 VOID
RtlListMoveEntryPrevious(PLIST_ITEM ListEntry
)
147 PLIST_ITEM ListPrev
= RtlListGetPrevious(ListEntry
);
149 if (ListPrev
== NULL
)
155 // Move the previous entry after this one
157 RtlListRemoveEntry(ListPrev
);
158 RtlListInsertEntry(ListEntry
, ListPrev
);
161 VOID
RtlListMoveEntryNext(PLIST_ITEM ListEntry
)
163 PLIST_ITEM ListNext
= RtlListGetNext(ListEntry
);
165 if (ListNext
== NULL
)
171 // Move this entry after the next entry
173 RtlListRemoveEntry(ListEntry
);
174 RtlListInsertEntry(ListNext
, ListEntry
);