00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __LIST_H__
00025 #define __LIST_H__
00026
00027 #include <windows.h>
00028
00029 typedef LIST_ENTRY LIST_NODE_HDR, *PLIST_NODE_HDR;
00030 typedef LIST_NODE_HDR LIST, *PLIST;
00031
00032 typedef VOID PLIST_CALLBACK(PLIST_NODE_HDR);
00033
00034 VOID
00035 InitializeList(
00036 IN PLIST NewList
00037 );
00038
00039 VOID
00040 InsertHead(
00041 IN PLIST List,
00042 IN PLIST_NODE_HDR ListNode
00043 );
00044
00045 VOID
00046 InsertTail(
00047 IN PLIST List,
00048 IN PLIST_NODE_HDR ListNode
00049 );
00050
00051 VOID
00052 RemoveNode(
00053 IN PLIST_NODE_HDR ListNode
00054 );
00055
00056 PLIST_NODE_HDR
00057 RemoveHead(
00058 IN PLIST List
00059 );
00060
00061 PLIST_NODE_HDR
00062 RemoveTail(
00063 IN PLIST List
00064 );
00065
00066 BOOL
00067 IsListEmpty(
00068 IN PLIST List
00069 );
00070
00071 PLIST_NODE_HDR
00072 GetListHead(
00073 IN PLIST List
00074 );
00075
00076 PLIST_NODE_HDR
00077 GetListTail(
00078 IN PLIST List
00079 );
00080
00081 PLIST_NODE_HDR
00082 GetNextEntry(
00083 IN PLIST_NODE_HDR ListNode
00084 );
00085
00086 PLIST_NODE_HDR
00087 GetPrevEntry(
00088 IN PLIST_NODE_HDR ListNode
00089 );
00090
00091 VOID
00092 DestroyListNoCallback(
00093 IN PLIST List
00094 );
00095
00096 VOID
00097 DestroyListWithCallback(
00098 IN PLIST List,
00099 IN PLIST_CALLBACK Callback
00100 );
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 #define InitializeList(nl) \
00115 { ((PLIST)(nl)) -> Flink = ((PLIST)(nl)) -> Blink = nl; }
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 #define InsertHead(List, Node) { \
00126 PLIST_NODE_HDR _EX_Flink; \
00127 PLIST_NODE_HDR _EX_List; \
00128 \
00129 _EX_List = ((PLIST_NODE_HDR) (List)); \
00130 _EX_Flink = _EX_List -> Flink; \
00131 ((PLIST_NODE_HDR) (Node))->Blink = _EX_List; \
00132 ((PLIST_NODE_HDR) (Node))->Flink = _EX_Flink; \
00133 _EX_Flink->Blink = (((PLIST_NODE_HDR) (Node))); \
00134 _EX_List->Flink = ((PLIST_NODE_HDR) (Node)); \
00135 }
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 #define InsertTail(List, Node) { \
00147 PLIST_NODE_HDR _EX_Blink; \
00148 PLIST_NODE_HDR _EX_List; \
00149 \
00150 _EX_List = ((PLIST_NODE_HDR) (List)); \
00151 _EX_Blink = _EX_List->Blink; \
00152 ((PLIST_NODE_HDR) (Node))->Flink = _EX_List; \
00153 ((PLIST_NODE_HDR) (Node))->Blink = _EX_Blink; \
00154 _EX_Blink->Flink = (((PLIST_NODE_HDR) (Node))); \
00155 _EX_List->Blink = ((PLIST_NODE_HDR) (Node)); \
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165 #define RemoveNode(node) { \
00166 PLIST_NODE_HDR _EX_Blink; \
00167 PLIST_NODE_HDR _EX_Flink; \
00168 \
00169 _EX_Flink = ((PLIST_NODE_HDR) (node))->Flink; \
00170 _EX_Blink = ((PLIST_NODE_HDR) (node))->Blink; \
00171 _EX_Blink->Flink = _EX_Flink; \
00172 _EX_Flink->Blink = _EX_Blink; \
00173 }
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 #define RemoveHead(List) \
00184 GetListHead((List)); \
00185 RemoveNode(((PLIST_NODE_HDR) (List))->Flink)
00186
00187
00188
00189
00190
00191
00192
00193
00194 #define RemoveTail(List) \
00195 GetListTail((List)); \
00196 RemoveNode(((PLIST_NODE_HDR) (List))->Blink)
00197
00198
00199
00200
00201
00202
00203
00204
00205 #define IsListEmpty(List) \
00206 (((PLIST_NODE_HDR) (List))->Flink == ((PLIST_NODE_HDR) (List)))
00207
00208
00209
00210
00211
00212
00213
00214
00215 #define GetListHead(List) \
00216 (((PLIST_NODE_HDR) (List))->Flink)
00217
00218
00219
00220
00221
00222
00223
00224
00225 #define GetListTail(List) \
00226 (((PLIST_NODE_HDR) (List))->Blink)
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236 #define GetNextEntry(ListNode) \
00237 (((PLIST_NODE_HDR) (ListNode)) -> Flink);
00238
00239
00240
00241
00242
00243
00244
00245
00246 #define GetPrevEntry(ListNode) \
00247 (((PLIST_NODE_HDR) (ListNode)) -> Blink);
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 #define DestroyListNoCallback(list) \
00258 PLIST_NODE_HDR currNode; \
00259 \
00260 while (!IsListEmpty((list))) { \
00261 currNode = RemoveHead((list)); \
00262 } \
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273 #define DestroyListWithCallback(list, cb) { \
00274 PLIST_NODE_HDR currNode; \
00275 \
00276 while (!IsListEmpty((list))) { \
00277 currNode = RemoveHead((list)); \
00278 (cb)(currNode); \
00279 } \
00280 }
00281
00282 #endif
00283