Fix a couple of problems with underruns and stopping/restarting.
[wine] / dlls / imagehlp / internal.c
1 /*
2  *      IMAGEHLP library
3  *
4  *      Copyright 1998  Patrik Stridvall
5  */
6
7 #include "winbase.h"
8 #include "winerror.h"
9 #include "windef.h"
10 #include "debugtools.h"
11 #include "imagehlp.h"
12
13 /***********************************************************************
14  *              InitializeListHead
15  */
16 VOID InitializeListHead(PLIST_ENTRY pListHead)
17 {
18   pListHead->Flink = pListHead;
19   pListHead->Blink = pListHead;
20 }
21
22 /***********************************************************************
23  *              InsertHeadList
24  */
25 VOID InsertHeadList(PLIST_ENTRY pListHead, PLIST_ENTRY pEntry)
26 {
27   pEntry->Blink = pListHead;
28   pEntry->Flink = pListHead->Flink;
29   pListHead->Flink = pEntry;
30 }
31
32 /***********************************************************************
33  *              InsertTailList
34  */
35 VOID InsertTailList(PLIST_ENTRY pListHead, PLIST_ENTRY pEntry)
36 {
37   pEntry->Flink = pListHead;
38   pEntry->Blink = pListHead->Blink;
39   pListHead->Blink = pEntry;
40 }
41
42 /***********************************************************************
43  *              IsListEmpty
44  */
45 BOOLEAN IsListEmpty(PLIST_ENTRY pListHead)
46 {
47   return !pListHead;
48 }
49
50 /***********************************************************************
51  *              PopEntryList
52  */
53 PSINGLE_LIST_ENTRY PopEntryList(PSINGLE_LIST_ENTRY pListHead)
54 {
55   pListHead->Next = NULL;
56   return pListHead;
57 }
58
59 /***********************************************************************
60  *              PushEntryList
61  */
62 VOID PushEntryList(
63   PSINGLE_LIST_ENTRY pListHead, PSINGLE_LIST_ENTRY pEntry)
64 {
65   pEntry->Next=pListHead;
66 }
67
68 /***********************************************************************
69  *              RemoveEntryList
70  */
71 VOID RemoveEntryList(PLIST_ENTRY pEntry)
72 {
73   pEntry->Flink->Blink = pEntry->Blink;
74   pEntry->Blink->Flink = pEntry->Flink;
75   pEntry->Flink = NULL;
76   pEntry->Blink = NULL;
77 }
78
79 /***********************************************************************
80  *              RemoveHeadList
81  */
82 PLIST_ENTRY RemoveHeadList(PLIST_ENTRY pListHead)
83 {
84   PLIST_ENTRY p = pListHead->Flink;
85   
86   if(p != pListHead)
87     {
88       RemoveEntryList(pListHead); 
89       return p;
90     }
91   else
92     {
93       pListHead->Flink = NULL;
94       pListHead->Blink = NULL;
95       return NULL;
96     }
97 }
98
99 /***********************************************************************
100  *              RemoveTailList
101  */
102 PLIST_ENTRY RemoveTailList(PLIST_ENTRY pListHead)
103 {
104   RemoveHeadList(pListHead->Blink);
105   if(pListHead != pListHead->Blink)
106     return pListHead;
107   else
108     return NULL;
109 }