summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/darray.s2
-rw-r--r--asm/text_6.s4
-rw-r--r--include/darray.h5
-rw-r--r--include/hashtable.h1
-rw-r--r--include/qsort.h15
-rw-r--r--src/darray.c56
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()