-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathdl.c
114 lines (99 loc) · 2.2 KB
/
dl.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <dl.h>
void InitDl(DL *pdl, int ibDle)
{
pdl->ibDle = ibDle;
}
void ClearDl(DL *pdl)
{
pdl->tail = nullptr;
pdl->head = nullptr;
}
void ClearDle(DLE *pdle)
{
pdle->prev = nullptr;
pdle->next = nullptr;
}
DLE *PdleFromDlEntry(DL *pdl, void *pv)
{
return (DLE *)((u8 *)pv + pdl->ibDle);
}
void AppendDlEntry(DL *pdl, void *pv)
{
DLE *newEntry = PdleFromDlEntry(pdl, pv);
if (pdl->tail == nullptr)
{
pdl->head = pv;
}
else
{
DLE *currentTail = PdleFromDlEntry(pdl, pdl->tail);
newEntry->prev = pdl->tail;
currentTail->next = pv;
}
pdl->tail = pv;
}
void PrependDlEntry(DL *pdl, void *pv)
{
DLE *newEntry = PdleFromDlEntry(pdl, pv);
if (pdl->head == nullptr)
{
pdl->tail = pv;
pdl->head = pv;
}
else
{
DLE *currentHead = PdleFromDlEntry(pdl, pdl->head);
newEntry->next = pdl->head;
currentHead->prev = pv;
pdl->head = pv;
}
}
void InsertDlEntryBefore(DL *pdl, void *pvNext, void *pv)
{
if (pvNext == nullptr)
{
AppendDlEntry(pdl, pv);
}
else if (pvNext == pdl->head)
{
PrependDlEntry(pdl, pv);
}
else
{
DLE *newEntry = PdleFromDlEntry(pdl, pv);
DLE *nextEntry = PdleFromDlEntry(pdl, pvNext);
void *prevEntryPointer = nextEntry->prev;
DLE *prevEntry = PdleFromDlEntry(pdl, prevEntryPointer);
newEntry->next = pvNext;
newEntry->prev = prevEntryPointer;
nextEntry->prev = pv;
prevEntry->next = pv;
}
}
INCLUDE_ASM(const s32, "P2/dl", func_001525F8);
INCLUDE_ASM(const s32, "P2/dl", RemoveDlEntry__FP2DLPv);
bool FFindDlEntry(DL *pdl, void *pv)
{
DLE *pdle = PdleFromDlEntry(pdl, pv);
return (pdle->next != 0) || (pdl->tail == pv);
}
bool FIsDlEmpty(DL *pdl)
{
return pdl->head == nullptr;
}
INCLUDE_ASM(const s32, "P2/dl", MergeDl__FP2DLT0);
int CPvDl(DL *pdl)
{
void *pCurItem = pdl->head;
int iCount = 0;
if (pCurItem != 0)
{
while (pCurItem)
{
DLE *pDle = (DLE *)((unsigned char *)pCurItem + pdl->ibDle);
pCurItem = pDle->next;
iCount++;
}
}
return iCount;
}