diff options
-rw-r--r-- | asm/darray.s | 2 | ||||
-rw-r--r-- | asm/text_6.s | 4 | ||||
-rw-r--r-- | include/darray.h | 5 | ||||
-rw-r--r-- | include/hashtable.h | 1 | ||||
-rw-r--r-- | include/qsort.h | 15 | ||||
-rw-r--r-- | src/darray.c | 56 |
6 files changed, 62 insertions, 21 deletions
diff --git a/asm/darray.s b/asm/darray.s index 2b50e17..d7bdbbb 100644 --- a/asm/darray.s +++ b/asm/darray.s @@ -506,7 +506,7 @@ ArraySort: /* 80336420 00332080 80 85 00 00 */ lwz r4, 0(r5)
/* 80336424 00332084 80 63 00 14 */ lwz r3, 0x14(r3)
/* 80336428 00332088 80 A5 00 08 */ lwz r5, 8(r5)
-/* 8033642C 0033208C 4B E9 67 A0 */ b func_801CCBCC
+/* 8033642C 0033208C 4B E9 67 A0 */ b qsort
.global ArraySearch
ArraySearch:
diff --git a/asm/text_6.s b/asm/text_6.s index 31a179a..302fa21 100644 --- a/asm/text_6.s +++ b/asm/text_6.s @@ -2652,8 +2652,8 @@ lbl_801CCBB8: /* 801CCBC4 001C8824 38 21 00 A0 */ addi r1, r1, 0xa0 /* 801CCBC8 001C8828 4E 80 00 20 */ blr -.global func_801CCBCC -func_801CCBCC: +.global qsort +qsort: /* 801CCBCC 001C882C 94 21 FF C0 */ stwu r1, -0x40(r1) /* 801CCBD0 001C8830 7C 08 02 A6 */ mflr r0 /* 801CCBD4 001C8834 28 04 00 02 */ cmplwi r4, 2 diff --git a/include/darray.h b/include/darray.h index 2859cd4..ff592ce 100644 --- a/include/darray.h +++ b/include/darray.h @@ -5,6 +5,11 @@ extern "C" {
#endif
+#include "types.h"
+
+typedef int (*SortFunction)(const void *, const void *);
+typedef BOOL (*MapFunction)(const void *, s32);
+
typedef struct DArray {
s32 size;
s32 capacity;
diff --git a/include/hashtable.h b/include/hashtable.h index b4c0ad5..79acbf6 100644 --- a/include/hashtable.h +++ b/include/hashtable.h @@ -9,7 +9,6 @@ extern "C" { typedef s32 (*HashFunction)(void *, s32);
-
typedef struct HashTable {
DArray **chains;
s32 size;
diff --git a/include/qsort.h b/include/qsort.h new file mode 100644 index 0000000..c68b747 --- /dev/null +++ b/include/qsort.h @@ -0,0 +1,15 @@ +#ifndef POKEREVO_QSORT_H
+#define POKEREVO_QSORT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void qsort(void *base, size_t nmemb, size_t size,
+ int (*compar)(const void *, const void *));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //POKEREVO_QSORT_H
diff --git a/src/darray.c b/src/darray.c index c8c4c7a..847af0b 100644 --- a/src/darray.c +++ b/src/darray.c @@ -5,16 +5,20 @@ ==ArrayNth 8035a598 80335ef0 30
==ArrayAppend 8035a5c8 80335f20 124
ArrayInsertSorted 8035a6ec 80336044 180
-ArrayRemoveAt 8035a86c 803361c4 ac
+==ArrayRemoveAt 8035a86c 803361c4 ac
ArrayDeleteAt 8035a918 80336270 f0
ArrayReplaceAt 8035aa08 80336360 b8
-# ArraySort 80336418 18
+==# ArraySort 80336418 18
ArraySearch 8035aad8 80336430 198
-ArrayMapBackwards 8035ac70 803365c8 9c
-ArrayMapBackwards2 8035ad0c 80336664 a4
+==ArrayMapBackwards 8035ac70 803365c8 9c
+==ArrayMapBackwards2 8035ad0c 80336664 a4
ArrayClear 8035adb0 80336708 104
#endif
+#include "types.h"
+#include "qsort.h"
+#include "darray.h"
+
DArray *ArrayNew(u32 p1, s32 p2, s32 p3)
{
DArray *darray = gsimalloc(sizeof(DArray)); // r31
@@ -49,16 +53,16 @@ void ArrayFree(DArray *p1) gsifree(p1);
}
-s32 ArrayLength(DArray *p1)
+s32 ArrayLength(DArray *arr)
{
- return p1->size;
+ return arr->size;
}
-void *ArrayNth(DArray *p1, s32 p2)
+void *ArrayNth(DArray *arr, s32 n)
{
- if (p2 < 0 || p2 >= p1->size)
+ if (n < 0 || n >= arr->size)
return NULL;
- return &p1->buf[i * p1->elementSz];
+ return &arr->buf[n * arr->elementSz];
}
// params in r29, r30
@@ -107,9 +111,16 @@ ArrayInsertSorted() }
-ArrayRemoveAt()
+// p1 = r31, n = r4
+void ArrayRemoveAt(DArray *p1, s32 n)
{
-
+ s32 origSize = p1->size;
+ s32 decOrigSize = origSize - 1;
+ if (n < decOrigSize) { // if not the last element
+ memmove(ArrayNth(p1, n), ArrayNth(p1, n+1),
+ p1->elementSz * (decOrigSize - n));
+ }
+ p1->size--;
}
ArrayDeleteAt()
@@ -122,9 +133,9 @@ ArrayReplaceAt() }
-ArraySort()
+void ArraySort(DArray *p1, SortFunction compar)
{
-
+ qsort(p1->buf, p1->size, elementSz, compar);
}
ArraySearch()
@@ -132,14 +143,25 @@ ArraySearch() }
-ArrayMapBackwards()
+// params r28, r29, r30
+void ArrayMapBackwards(DArray *p1, MapFunction p2, s32 p3)
{
-
+ for (s32 i = p1->size - 1; i >= 0; i--) {
+ void *elem = ArrayNth(p1, i);
+ p2(elem, p3);
+ }
}
-ArrayMapBackwards2()
+// params r27 ...
+void *ArrayMapBackwards2(DArray *p1, MapFunction p2, s32 p3)
{
-
+ for (s32 i = p1->size - 1; i >= 0; i--) {
+ void *elem = ArrayNth(p1, i);
+ if (p2(elem, p3) == FALSE) {
+ return elem;
+ }
+ }
+ return NULL;
}
ArrayClear()
|