diff --git a/include/emulator/xlList.h b/include/emulator/xlList.h index 8154b96..017d143 100644 --- a/include/emulator/xlList.h +++ b/include/emulator/xlList.h @@ -3,12 +3,9 @@ #include "dolphin.h" -typedef struct tXL_NODE tXL_NODE; - -struct tXL_NODE { - /* 0x0 */ tXL_NODE* next; - /* 0x4 */ u8 data[]; -}; // size = 0x4 +// List nodes consist of a pointer to the next node followed by an arbitrary amount of data. +#define NODE_NEXT(pNode) (*(void**)(pNode)) +#define NODE_DATA(pNode) (((u8*)(pNode) + 4)) typedef struct tXL_LIST { /* 0x0 */ s32 nItemSize; diff --git a/src/emulator/xlList.c b/src/emulator/xlList.c index 61169f1..985726d 100644 --- a/src/emulator/xlList.c +++ b/src/emulator/xlList.c @@ -11,8 +11,8 @@ bool xlListMake(tXL_LIST** ppList, s32 nItemSize) { if (xlListMakeItem(&gListList, ppList)) { (*ppList)->nItemCount = 0; (*ppList)->nItemSize = nItemSize; - (*ppList)->pNodeNext = (void*)0; - (*ppList)->pNodeHead = (void*)0; + (*ppList)->pNodeNext = NULL; + (*ppList)->pNodeHead = NULL; return true; } @@ -21,13 +21,13 @@ bool xlListMake(tXL_LIST** ppList, s32 nItemSize) { } static inline bool xlListWipe(tXL_LIST* pList) { - tXL_NODE* pNode; - tXL_NODE* pNodeNext; + void* pNode; + void* pNodeNext; pNode = pList->pNodeHead; while (pNode != NULL) { - pNodeNext = pNode->next; - if (!xlHeapFree((void**)&pNode)) { + pNodeNext = NODE_NEXT(pNode); + if (!xlHeapFree(&pNode)) { return false; } pNode = pNodeNext; @@ -53,22 +53,22 @@ bool xlListFree(tXL_LIST** ppList) { bool xlListMakeItem(tXL_LIST* pList, void** ppItem) { s32 nSize; - tXL_NODE* pListNode; - tXL_NODE* pNode; - tXL_NODE* pNodeNext; + void* pListNode; + void* pNode; + void* pNodeNext; nSize = pList->nItemSize + 4; - if (!xlHeapTake((void**)&pListNode, nSize)) { + if (!xlHeapTake(&pListNode, nSize)) { return false; } - pListNode->next = NULL; - *ppItem = (void*)pListNode->data; - pNode = (tXL_NODE*)&pList->pNodeHead; + NODE_NEXT(pListNode) = NULL; + *ppItem = NODE_DATA(pListNode); + pNode = &pList->pNodeHead; while (pNode != NULL) { - pNodeNext = pNode->next; + pNodeNext = NODE_NEXT(pNode); if (pNodeNext == NULL) { - pNode->next = pListNode; + NODE_NEXT(pNode) = pListNode; pList->nItemCount++; return true; } @@ -79,20 +79,20 @@ bool xlListMakeItem(tXL_LIST* pList, void** ppItem) { } bool xlListFreeItem(tXL_LIST* pList, void** ppItem) { - tXL_NODE* pNode; - tXL_NODE* pNodeNext; + void* pNode; + void* pNodeNext; if (pList->pNodeHead == NULL) { return false; } - pNode = (tXL_NODE*)&pList->pNodeHead; + pNode = &pList->pNodeHead; while (pNode != NULL) { - pNodeNext = pNode->next; - if (*ppItem == (void*)pNodeNext->data) { - pNode->next = pNodeNext->next; + pNodeNext = NODE_NEXT(pNode); + if (*ppItem == NODE_DATA(pNodeNext)) { + NODE_NEXT(pNode) = NODE_NEXT(pNodeNext); *ppItem = NULL; - if (!xlHeapFree((void**)&pNodeNext)) { + if (!xlHeapFree(&pNodeNext)) { return false; } pList->nItemCount--; @@ -106,7 +106,7 @@ bool xlListFreeItem(tXL_LIST* pList, void** ppItem) { } static inline bool xlListTest(tXL_LIST* pList) { - tXL_NODE* pNode; + void* pNode; if (pList == &gListList) { return true; @@ -114,17 +114,17 @@ static inline bool xlListTest(tXL_LIST* pList) { pNode = gListList.pNodeHead; while (pNode != NULL) { - if (pList == (tXL_LIST*)pNode->data) { + if (pList == (tXL_LIST*)NODE_DATA(pNode)) { return true; } - pNode = pNode->next; + pNode = NODE_NEXT(pNode); } return false; } bool xlListTestItem(tXL_LIST* pList, void* pItem) { - tXL_NODE* pListNode; + void* pListNode; if (!xlListTest(pList) || pItem == NULL) { return false; @@ -132,10 +132,10 @@ bool xlListTestItem(tXL_LIST* pList, void* pItem) { pListNode = pList->pNodeHead; while (pListNode != NULL) { - if (pItem == pListNode->data) { + if (pItem == NODE_DATA(pListNode)) { return true; } - pListNode = pListNode->next; + pListNode = NODE_NEXT(pListNode); } return false; diff --git a/src/emulator/xlObject.c b/src/emulator/xlObject.c index 8ac2843..20786a3 100644 --- a/src/emulator/xlObject.c +++ b/src/emulator/xlObject.c @@ -4,10 +4,10 @@ static tXL_LIST* gpListData; static inline bool xlObjectFindData(__anon_0x5062** ppData, _XL_OBJECTTYPE* pType) { - tXL_NODE* pListNode; + void* pListNode; - for (pListNode = (tXL_NODE*)gpListData->pNodeHead; pListNode != NULL; pListNode = pListNode->next) { - *ppData = (__anon_0x5062*)pListNode->data; + for (pListNode = gpListData->pNodeHead; pListNode != NULL; pListNode = NODE_NEXT(pListNode)) { + *ppData = (__anon_0x5062*)NODE_DATA(pListNode); if ((*ppData)->pType == pType) { return true; } @@ -33,8 +33,8 @@ static inline bool xlObjectMakeData(__anon_0x5062** ppData, _XL_OBJECTTYPE* pTyp bool xlObjectMake(void** ppObject, void* pArgument, _XL_OBJECTTYPE* pType) { bool bFlag; __anon_0x5062* pData; - tXL_NODE* temp1; - tXL_NODE* temp2; + void* temp1; + void* temp2; if (!xlObjectFindData(&pData, pType)) { if (!xlObjectMakeData(&pData, pType)) { @@ -49,10 +49,10 @@ bool xlObjectMake(void** ppObject, void* pArgument, _XL_OBJECTTYPE* pType) { return false; } - temp1 = (tXL_NODE*)*ppObject; - temp2 = (tXL_NODE*)pData; - *ppObject = &temp1->data; - temp1->next = temp2; + temp1 = *ppObject; + temp2 = pData; + *ppObject = ((u8*)*ppObject + 4); + NODE_NEXT(temp1) = temp2; if (bFlag) { pType->pfEvent(*ppObject, 0, NULL); @@ -66,7 +66,7 @@ bool xlObjectFree(void** ppObject) { __anon_0x5062* pData = *(__anon_0x5062**)((u8*)*ppObject - 4); pData->pType->pfEvent(*ppObject, 3, NULL); - *ppObject = (void*)((u8*)*ppObject - 4); + *ppObject = ((u8*)*ppObject - 4); if (xlListFreeItem(pData->pList, ppObject) == 0) { return false; @@ -134,10 +134,10 @@ bool xlObjectReset(void) { pListNode = gpListData->pNodeHead; while (pListNode != NULL) { - if (!xlListFree((void*)((s8*)pListNode + 4))) { + if (!xlListFree((void*)((u8*)pListNode + 4))) { return false; } - pListNode = ((tXL_NODE*)pListNode)->next; + pListNode = NODE_NEXT(pListNode); } if (!xlListFree(&gpListData)) {