From 0b1d351cd70a5b5e170d77d2880f806d88d45073 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 19 Aug 2021 08:33:07 -0400 Subject: NNS_FND_list --- arm9/lib/libnns/src/NNS_FND_heapcommon.c | 4 +- arm9/lib/libnns/src/NNS_FND_list.c | 128 +++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 arm9/lib/libnns/src/NNS_FND_list.c (limited to 'arm9/lib/libnns/src') diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c index 2520aab2..664007f1 100644 --- a/arm9/lib/libnns/src/NNS_FND_heapcommon.c +++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c @@ -13,7 +13,7 @@ static inline void NNSi_FndHeapHeadSetOptionFlag(NNSiFndHeapHead *pHead, u8 opti void *NNS_FndGetNextListObject(NNSFndList *, void *); -NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) +static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) { NNSiFndHeapHead * pHead = NULL; @@ -30,7 +30,7 @@ NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) return NULL; } -NNSFndList* FindListContainHeap(const void * memBlock) +static NNSFndList* FindListContainHeap(const void * memBlock) { NNSFndList* ret = &sRootList; NNSiFndHeapHead* pHead = FindContainHeap(&sRootList, memBlock); diff --git a/arm9/lib/libnns/src/NNS_FND_list.c b/arm9/lib/libnns/src/NNS_FND_list.c new file mode 100644 index 00000000..d4dd7620 --- /dev/null +++ b/arm9/lib/libnns/src/NNS_FND_list.c @@ -0,0 +1,128 @@ +#include "nitro.h" +#include "NNS_FND_list.h" + +#define OBJ_TO_LINK(list, obj) ((NNSFndLink*)((void*)(obj) + (list)->offset)) + +void NNS_FndInitList(NNSFndList* list, s32 alignment) +{ + list->headObject = NULL; + list->tailObject = NULL; + list->numObjects = 0; + list->offset = (u16)alignment; +} + +static void SetFirstObject(NNSFndList* list, void* object) +{ + NNSFndLink* tail = OBJ_TO_LINK(list, object); + tail->nextObject = NULL; + tail->prevObject = NULL; + list->headObject = object; + list->tailObject = object; + list->numObjects++; +} + +void NNS_FndAppendListObject(NNSFndList* list, void* object) +{ + if (list->headObject == NULL) + { + SetFirstObject(list, object); + } + else + { + NNSFndLink *tail = OBJ_TO_LINK(list, object); + tail->prevObject = list->tailObject; + tail->nextObject = NULL; + OBJ_TO_LINK(list, list->tailObject)->nextObject = object; + list->tailObject = object; + list->numObjects++; + } +} + +void NNS_FndPrependListObject(NNSFndList* list, void* object) +{ + if (list->headObject == NULL) + { + SetFirstObject(list, object); + } + else + { + NNSFndLink *tail = OBJ_TO_LINK(list, object); + tail->prevObject = NULL; + tail->nextObject = list->headObject; + OBJ_TO_LINK(list, list->headObject)->prevObject = object; + list->headObject = object; + list->numObjects++; + } +} + +void NNS_FndInsertListObject(NNSFndList* list, void* where, void* object) +{ + if (where == NULL) + { + NNS_FndAppendListObject(list, object); + } + + else if (where == list->headObject) + { + NNS_FndPrependListObject(list, object); + } + else + { + NNSFndLink* tail = OBJ_TO_LINK(list, object); + void* prevObject = OBJ_TO_LINK(list, where)->prevObject; + NNSFndLink* head = OBJ_TO_LINK(list, prevObject); + tail->prevObject = prevObject; + tail->nextObject = where; + head->nextObject = object; + OBJ_TO_LINK(list, where)->prevObject = object; + list->numObjects++; + } +} + +void NNS_FndRemoveListObject(NNSFndList* list, void* object) +{ + NNSFndLink* node = OBJ_TO_LINK(list, object); + if (node->prevObject == NULL) + { + list->headObject = node->nextObject; + } + else + { + OBJ_TO_LINK(list, node->prevObject)->nextObject = node->nextObject; + } + if (node->nextObject == NULL) + { + list->tailObject = node->prevObject; + } + else + { + OBJ_TO_LINK(list, node->nextObject)->prevObject = node->prevObject; + } + node->prevObject = NULL; + node->nextObject = NULL; + list->numObjects--; +} + +void * NNS_FndGetNextListObject(NNSFndList* list, void* object) +{ + if (object == NULL) + { + return list->headObject; + } + else + { + return OBJ_TO_LINK(list, object)->nextObject; + } +} + +void * NNS_FndGetPrevListObject(NNSFndList* list, void* object) +{ + if (object == NULL) + { + return list->tailObject; + } + else + { + return OBJ_TO_LINK(list, object)->prevObject; + } +} -- cgit v1.2.3