summaryrefslogtreecommitdiff
path: root/src/SDK/DWC/gamespy/darray.c
blob: 5259a9f66fab4d6f437dd6b3b09f5ea1e6ed42ed (plain)
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
#include <stdlib.h>
#include <string.h>
#include <DWC/gamespy/nonport.h>
#include <DWC/gamespy/darray.h>

#pragma auto_inline on

static inline void ArrayInsert(DArray *d, void *elem, s32 n)
{
    if (d->size == d->capacity) {
        s32 newCap = d->capacity + d->growAmount;
        d->capacity = newCap;
        d->buf = gsirealloc(d->buf, newCap * d->elemSz);
    }
    d->size++;
    s32 origSize = d->size - 1;
    if (n < origSize) {
        memmove(ArrayNth(d, n+1), ArrayNth(d, n),
               (origSize - n) * d->elemSz);
    }
    memcpy(ArrayNth(d, n), elem, d->elemSz);
}

DArray *ArrayNew(u32 elemSz, s32 initialCap, DtorFunction dtor)
{
    DArray *darray = gsimalloc(sizeof(DArray));
    if (initialCap == 0)
        initialCap = 8;
    darray->size = 0;
    darray->capacity = initialCap;
    darray->elemSz = elemSz;
    darray->growAmount = initialCap;
    darray->elemDtor = dtor;
    if (initialCap != 0) {
        darray->buf = gsimalloc(initialCap * darray->elemSz);
    } else {
        darray->buf = NULL;
    }
    return darray;
}

void ArrayFree(DArray *d)
{
    for (s32 i = 0; i < d->size; i++) {
        if (d->elemDtor) {
            void *elem = ArrayNth(d, i);
            d->elemDtor(elem);
        }
    }
    gsifree(d->buf);
    gsifree(d);
}

s32 ArrayLength(DArray *d)
{
    return d->size;
}

void *ArrayNth(DArray *d, s32 n)
{
    if (n < 0 || n >= d->size)
        return NULL;
    return &d->buf[d->elemSz * n];
}

void ArrayAppend(DArray *d, void *elem)
{
    if (d) {
        ArrayInsert(d, elem, d->size);
    }
}

#ifdef NONMATCHING
void ArrayInsertSorted(DArray *d, void *elem, CompareFunction compar)
{
    char *buf;
    u32 elemSz;
    s32 mid, high, low;
    elemSz = d->elemSz;
    buf = d->buf;
    high = d->size - 1;
    low = 0;
    while (low <= high) {
        mid = (low + high) >> 1;
        s32 result = compar(&buf[mid * elemSz], elem);
        if (result < 0) {
            low = mid + 1;
        }
        if (result >= 0) {
            high = mid - 1;
        }
    }
    char *recomputeLow = &buf[low * elemSz];
    ArrayInsert(d, elem, (recomputeLow - d->buf)/ (s32)d->elemSz);
}
#else
_savegpr_23();
_restgpr_23();
_savegpr_24();
_restgpr_24();
asm void ArrayInsertSorted(DArray *d, void *elem, CompareFunction compar)
{
    nofralloc
    /* 80336044 00331CA4  94 21 FF D0 */	stwu r1, -0x30(r1)
    /* 80336048 00331CA8  7C 08 02 A6 */	mflr r0
    /* 8033604C 00331CAC  90 01 00 34 */	stw r0, 0x34(r1)
    /* 80336050 00331CB0  39 61 00 30 */	addi r11, r1, 0x30
    /* 80336054 00331CB4  4B E9 10 C9 */	bl _savegpr_24
    /* 80336058 00331CB8  80 C3 00 00 */	lwz r6, 0(r3)
    /* 8033605C 00331CBC  7C 7D 1B 78 */	mr r29, r3
    /* 80336060 00331CC0  83 83 00 08 */	lwz r28, 8(r3)
    /* 80336064 00331CC4  7C 9E 23 78 */	mr r30, r4
    /* 80336068 00331CC8  83 E3 00 14 */	lwz r31, 0x14(r3)
    /* 8033606C 00331CCC  7C B8 2B 78 */	mr r24, r5
    /* 80336070 00331CD0  3B 46 FF FF */	addi r26, r6, -1
    /* 80336074 00331CD4  3B 20 00 00 */	li r25, 0
    /* 80336078 00331CD8  48 00 00 3C */	b lbl_803360B4
    lbl_8033607C:
    /* 8033607C 00331CDC  7C 19 D2 14 */	add r0, r25, r26
    /* 80336080 00331CE0  7F 0C C3 78 */	mr r12, r24
    /* 80336084 00331CE4  7C 1B 0E 70 */	srawi r27, r0, 1
    /* 80336088 00331CE8  7F C4 F3 78 */	mr r4, r30
    /* 8033608C 00331CEC  7C 1B E1 D6 */	mullw r0, r27, r28
    /* 80336090 00331CF0  7C 7F 02 14 */	add r3, r31, r0
    /* 80336094 00331CF4  7D 89 03 A6 */	mtctr r12
    /* 80336098 00331CF8  4E 80 04 21 */	bctrl
    /* 8033609C 00331CFC  2C 03 00 00 */	cmpwi r3, 0
    /* 803360A0 00331D00  40 80 00 08 */	bge lbl_803360A8
    /* 803360A4 00331D04  3B 3B 00 01 */	addi r25, r27, 1
    lbl_803360A8:
    /* 803360A8 00331D08  2C 03 00 00 */	cmpwi r3, 0
    /* 803360AC 00331D0C  41 80 00 08 */	blt lbl_803360B4
    /* 803360B0 00331D10  3B 5B FF FF */	addi r26, r27, -1
    lbl_803360B4:
    /* 803360B4 00331D14  7C 19 D0 00 */	cmpw r25, r26
    /* 803360B8 00331D18  40 81 FF C4 */	ble lbl_8033607C
    /* 803360BC 00331D1C  7C D9 E1 D6 */	mullw r6, r25, r28
    /* 803360C0 00331D20  80 7D 00 14 */	lwz r3, 0x14(r29)
    /* 803360C4 00331D24  80 BD 00 08 */	lwz r5, 8(r29)
    /* 803360C8 00331D28  80 1D 00 00 */	lwz r0, 0(r29)
    /* 803360CC 00331D2C  80 9D 00 04 */	lwz r4, 4(r29)
    /* 803360D0 00331D30  7C DF 32 14 */	add r6, r31, r6
    /* 803360D4 00331D34  7C C3 30 50 */	subf r6, r3, r6
    /* 803360D8 00331D38  7C 00 20 00 */	cmpw r0, r4
    /* 803360DC 00331D3C  7F E6 2B D6 */	divw r31, r6, r5
    /* 803360E0 00331D40  40 82 00 1C */	bne lbl_803360FC
    /* 803360E4 00331D44  80 1D 00 0C */	lwz r0, 0xc(r29)
    /* 803360E8 00331D48  7C 04 02 14 */	add r0, r4, r0
    /* 803360EC 00331D4C  7C 80 29 D6 */	mullw r4, r0, r5
    /* 803360F0 00331D50  90 1D 00 04 */	stw r0, 4(r29)
    /* 803360F4 00331D54  48 00 32 31 */	bl gsirealloc
    /* 803360F8 00331D58  90 7D 00 14 */	stw r3, 0x14(r29)
    lbl_803360FC:
    /* 803360FC 00331D5C  80 7D 00 00 */	lwz r3, 0(r29)
    /* 80336100 00331D60  38 A3 00 01 */	addi r5, r3, 1
    /* 80336104 00331D64  38 C5 FF FF */	addi r6, r5, -1
    /* 80336108 00331D68  90 BD 00 00 */	stw r5, 0(r29)
    /* 8033610C 00331D6C  7C 1F 30 00 */	cmpw r31, r6
    /* 80336110 00331D70  40 80 00 64 */	bge lbl_80336174
    /* 80336114 00331D74  34 9F 00 01 */	addic. r4, r31, 1
    /* 80336118 00331D78  41 80 00 0C */	blt lbl_80336124
    /* 8033611C 00331D7C  7C 04 28 00 */	cmpw r4, r5
    /* 80336120 00331D80  41 80 00 0C */	blt lbl_8033612C
    lbl_80336124:
    /* 80336124 00331D84  38 60 00 00 */	li r3, 0
    /* 80336128 00331D88  48 00 00 14 */	b lbl_8033613C
    lbl_8033612C:
    /* 8033612C 00331D8C  80 1D 00 08 */	lwz r0, 8(r29)
    /* 80336130 00331D90  80 7D 00 14 */	lwz r3, 0x14(r29)
    /* 80336134 00331D94  7C 00 21 D6 */	mullw r0, r0, r4
    /* 80336138 00331D98  7C 63 02 14 */	add r3, r3, r0
    lbl_8033613C:
    /* 8033613C 00331D9C  2C 1F 00 00 */	cmpwi r31, 0
    /* 80336140 00331DA0  41 80 00 0C */	blt lbl_8033614C
    /* 80336144 00331DA4  7C 1F 28 00 */	cmpw r31, r5
    /* 80336148 00331DA8  41 80 00 0C */	blt lbl_80336154
    lbl_8033614C:
    /* 8033614C 00331DAC  38 80 00 00 */	li r4, 0
    /* 80336150 00331DB0  48 00 00 14 */	b lbl_80336164
    lbl_80336154:
    /* 80336154 00331DB4  80 1D 00 08 */	lwz r0, 8(r29)
    /* 80336158 00331DB8  80 9D 00 14 */	lwz r4, 0x14(r29)
    /* 8033615C 00331DBC  7C 00 F9 D6 */	mullw r0, r0, r31
    /* 80336160 00331DC0  7C 84 02 14 */	add r4, r4, r0
    lbl_80336164:
    /* 80336164 00331DC4  80 BD 00 08 */	lwz r5, 8(r29)
    /* 80336168 00331DC8  7C 1F 30 50 */	subf r0, r31, r6
    /* 8033616C 00331DCC  7C A5 01 D6 */	mullw r5, r5, r0
    /* 80336170 00331DD0  4B E9 41 05 */	bl memmove
    lbl_80336174:
    /* 80336174 00331DD4  2C 1F 00 00 */	cmpwi r31, 0
    /* 80336178 00331DD8  41 80 00 10 */	blt lbl_80336188
    /* 8033617C 00331DDC  80 1D 00 00 */	lwz r0, 0(r29)
    /* 80336180 00331DE0  7C 1F 00 00 */	cmpw r31, r0
    /* 80336184 00331DE4  41 80 00 0C */	blt lbl_80336190
    lbl_80336188:
    /* 80336188 00331DE8  38 60 00 00 */	li r3, 0
    /* 8033618C 00331DEC  48 00 00 14 */	b lbl_803361A0
    lbl_80336190:
    /* 80336190 00331DF0  80 1D 00 08 */	lwz r0, 8(r29)
    /* 80336194 00331DF4  80 7D 00 14 */	lwz r3, 0x14(r29)
    /* 80336198 00331DF8  7C 00 F9 D6 */	mullw r0, r0, r31
    /* 8033619C 00331DFC  7C 63 02 14 */	add r3, r3, r0
    lbl_803361A0:
    /* 803361A0 00331E00  80 BD 00 08 */	lwz r5, 8(r29)
    /* 803361A4 00331E04  7F C4 F3 78 */	mr r4, r30
    /* 803361A8 00331E08  4B CC DE 59 */	bl memcpy
    /* 803361AC 00331E0C  39 61 00 30 */	addi r11, r1, 0x30
    /* 803361B0 00331E10  4B E9 0F B9 */	bl _restgpr_24
    /* 803361B4 00331E14  80 01 00 34 */	lwz r0, 0x34(r1)
    /* 803361B8 00331E18  7C 08 03 A6 */	mtlr r0
    /* 803361BC 00331E1C  38 21 00 30 */	addi r1, r1, 0x30
    /* 803361C0 00331E20  4E 80 00 20 */	blr
}
#pragma peephole on
#endif

void ArrayRemoveAt(DArray *d, s32 n)
{
    s32 origSize = d->size;
    s32 decOrigSize = origSize - 1;
    if (n < decOrigSize) {
        memmove(ArrayNth(d, n), ArrayNth(d, n+1), 
            d->elemSz * (decOrigSize - n));
    }
    d->size--;
}

void ArrayDeleteAt(DArray *d, s32 n)
{
    if (d->elemDtor) {
        d->elemDtor(ArrayNth(d, n));
    }
    ArrayRemoveAt(d, n);
}

void ArrayReplaceAt(DArray *d, void *elem, s32 n)
{
    if (d->elemDtor) {
        d->elemDtor(ArrayNth(d, n));
    }
    memcpy(ArrayNth(d, n), elem, d->elemSz);
}

void ArraySort(DArray *d, CompareFunction compar)
{
    qsort(d->buf, (u32)d->size, d->elemSz, compar);
}

#ifdef NONMATCHING
s32 ArraySearch(DArray *d, void *elem, CompareFunction cmp, s32 start, s32 doBinarySearch)
{
    BOOL found = TRUE;
    char *ptr;
    
    s32 arrSize;
    if (!d || (arrSize = d->size) == 0) {
        return -1;
    }
    if (doBinarySearch) {
        char *r27 = ArrayNth(d, start);
        s32 high = arrSize - start - 1;
        u32 elemSz = d->elemSz;
        s32 low = 0;
        found = FALSE;
        while (low <= high) {
            s32 mid = (low + high) >> 1;
            s32 result = cmp(&r27[mid * elemSz], elem);
            if (result == 0) {
                found = TRUE;
            }
            if (result < 0) {
                low = mid + 1;
            }
            if (result >= 0) {
                high = mid - 1;
            }
        }
        ptr = &r27[low * elemSz];
    } else {
        char *r23 = ArrayNth(d, start);
        u32 elemSz = d->elemSz;
        s32 r24 = arrSize - start;
        for (s32 i = 0, j = 0; i < r24; j += elemSz, i++) {
            if (cmp(elem, &r23[j]) == 0) {
                ptr = &r23[i * elemSz];
                goto exit;
            }
        }
        ptr = NULL;
    }
    exit:
    if (ptr && found) {
        return (ptr - d->buf) / (s32)d->elemSz;
    }
    return -1;
}
#else
asm s32 ArraySearch(DArray *d, void *elem, CompareFunction cmp, s32 start, s32 doBinarySearch)
{
    nofralloc
    /* 80336430 00332090  94 21 FF D0 */	stwu r1, -0x30(r1)
    /* 80336434 00332094  7C 08 02 A6 */	mflr r0
    /* 80336438 00332098  90 01 00 34 */	stw r0, 0x34(r1)
    /* 8033643C 0033209C  39 61 00 30 */	addi r11, r1, 0x30
    /* 80336440 003320A0  4B E9 0C D9 */	bl _savegpr_23
    /* 80336444 003320A4  2C 03 00 00 */	cmpwi r3, 0
    /* 80336448 003320A8  7C 7C 1B 78 */	mr r28, r3
    /* 8033644C 003320AC  7C 9D 23 78 */	mr r29, r4
    /* 80336450 003320B0  7C BE 2B 78 */	mr r30, r5
    /* 80336454 003320B4  3B E0 00 01 */	li r31, 1
    /* 80336458 003320B8  41 82 00 10 */	beq lbl_80336468
    /* 8033645C 003320BC  80 A3 00 00 */	lwz r5, 0(r3)
    /* 80336460 003320C0  2C 05 00 00 */	cmpwi r5, 0
    /* 80336464 003320C4  40 82 00 0C */	bne lbl_80336470
    lbl_80336468:
    /* 80336468 003320C8  38 60 FF FF */	li r3, -1
    /* 8033646C 003320CC  48 00 01 44 */	b lbl_803365B0
    lbl_80336470:
    /* 80336470 003320D0  2C 07 00 00 */	cmpwi r7, 0
    /* 80336474 003320D4  41 82 00 9C */	beq lbl_80336510
    /* 80336478 003320D8  2C 06 00 00 */	cmpwi r6, 0
    /* 8033647C 003320DC  41 80 00 0C */	blt lbl_80336488
    /* 80336480 003320E0  7C 06 28 00 */	cmpw r6, r5
    /* 80336484 003320E4  41 80 00 0C */	blt lbl_80336490
    lbl_80336488:
    /* 80336488 003320E8  3B 60 00 00 */	li r27, 0
    /* 8033648C 003320EC  48 00 00 14 */	b lbl_803364A0
    lbl_80336490:
    /* 80336490 003320F0  80 03 00 08 */	lwz r0, 8(r3)
    /* 80336494 003320F4  80 83 00 14 */	lwz r4, 0x14(r3)
    /* 80336498 003320F8  7C 00 31 D6 */	mullw r0, r0, r6
    /* 8033649C 003320FC  7F 64 02 14 */	add r27, r4, r0
    lbl_803364A0:
    /* 803364A0 00332100  7C 86 28 50 */	subf r4, r6, r5
    /* 803364A4 00332104  83 43 00 08 */	lwz r26, 8(r3)
    /* 803364A8 00332108  3B 04 FF FF */	addi r24, r4, -1
    /* 803364AC 0033210C  3A E0 00 00 */	li r23, 0
    /* 803364B0 00332110  3B E0 00 00 */	li r31, 0
    /* 803364B4 00332114  48 00 00 48 */	b lbl_803364FC
    lbl_803364B8:
    /* 803364B8 00332118  7C 17 C2 14 */	add r0, r23, r24
    /* 803364BC 0033211C  7F CC F3 78 */	mr r12, r30
    /* 803364C0 00332120  7C 19 0E 70 */	srawi r25, r0, 1
    /* 803364C4 00332124  7F A4 EB 78 */	mr r4, r29
    /* 803364C8 00332128  7C 19 D1 D6 */	mullw r0, r25, r26
    /* 803364CC 0033212C  7C 7B 02 14 */	add r3, r27, r0
    /* 803364D0 00332130  7D 89 03 A6 */	mtctr r12
    /* 803364D4 00332134  4E 80 04 21 */	bctrl
    /* 803364D8 00332138  2C 03 00 00 */	cmpwi r3, 0
    /* 803364DC 0033213C  40 82 00 08 */	bne lbl_803364E4
    /* 803364E0 00332140  3B E0 00 01 */	li r31, 1
    lbl_803364E4:
    /* 803364E4 00332144  2C 03 00 00 */	cmpwi r3, 0
    /* 803364E8 00332148  40 80 00 08 */	bge lbl_803364F0
    /* 803364EC 0033214C  3A F9 00 01 */	addi r23, r25, 1
    lbl_803364F0:
    /* 803364F0 00332150  2C 03 00 00 */	cmpwi r3, 0
    /* 803364F4 00332154  41 80 00 08 */	blt lbl_803364FC
    /* 803364F8 00332158  3B 19 FF FF */	addi r24, r25, -1
    lbl_803364FC:
    /* 803364FC 0033215C  7C 17 C0 00 */	cmpw r23, r24
    /* 80336500 00332160  40 81 FF B8 */	ble lbl_803364B8
    /* 80336504 00332164  7C 17 D1 D6 */	mullw r0, r23, r26
    /* 80336508 00332168  7C 9B 02 14 */	add r4, r27, r0
    /* 8033650C 0033216C  48 00 00 7C */	b lbl_80336588
    lbl_80336510:
    /* 80336510 00332170  2C 06 00 00 */	cmpwi r6, 0
    /* 80336514 00332174  41 80 00 0C */	blt lbl_80336520
    /* 80336518 00332178  7C 06 28 00 */	cmpw r6, r5
    /* 8033651C 0033217C  41 80 00 0C */	blt lbl_80336528
    lbl_80336520:
    /* 80336520 00332180  3A E0 00 00 */	li r23, 0
    /* 80336524 00332184  48 00 00 14 */	b lbl_80336538
    lbl_80336528:
    /* 80336528 00332188  80 03 00 08 */	lwz r0, 8(r3)
    /* 8033652C 0033218C  80 83 00 14 */	lwz r4, 0x14(r3)
    /* 80336530 00332190  7C 00 31 D6 */	mullw r0, r0, r6
    /* 80336534 00332194  7E E4 02 14 */	add r23, r4, r0
    lbl_80336538:
    /* 80336538 00332198  83 23 00 08 */	lwz r25, 8(r3)
    /* 8033653C 0033219C  7F 06 28 50 */	subf r24, r6, r5
    /* 80336540 003321A0  3B 40 00 00 */	li r26, 0
    /* 80336544 003321A4  3B 60 00 00 */	li r27, 0
    /* 80336548 003321A8  48 00 00 34 */	b lbl_8033657C
    lbl_8033654C:
    /* 8033654C 003321AC  7F CC F3 78 */	mr r12, r30
    /* 80336550 003321B0  7F A3 EB 78 */	mr r3, r29
    /* 80336554 003321B4  7C 97 DA 14 */	add r4, r23, r27
    /* 80336558 003321B8  7D 89 03 A6 */	mtctr r12
    /* 8033655C 003321BC  4E 80 04 21 */	bctrl
    /* 80336560 003321C0  2C 03 00 00 */	cmpwi r3, 0
    /* 80336564 003321C4  40 82 00 10 */	bne lbl_80336574
    /* 80336568 003321C8  7C 19 D1 D6 */	mullw r0, r25, r26
    /* 8033656C 003321CC  7C 97 02 14 */	add r4, r23, r0
    /* 80336570 003321D0  48 00 00 18 */	b lbl_80336588
    lbl_80336574:
    /* 80336574 003321D4  7F 7B CA 14 */	add r27, r27, r25
    /* 80336578 003321D8  3B 5A 00 01 */	addi r26, r26, 1
    lbl_8033657C:
    /* 8033657C 003321DC  7C 1A C0 00 */	cmpw r26, r24
    /* 80336580 003321E0  41 80 FF CC */	blt lbl_8033654C
    /* 80336584 003321E4  38 80 00 00 */	li r4, 0
    lbl_80336588:
    /* 80336588 003321E8  2C 04 00 00 */	cmpwi r4, 0
    /* 8033658C 003321EC  41 82 00 20 */	beq lbl_803365AC
    /* 80336590 003321F0  2C 1F 00 00 */	cmpwi r31, 0
    /* 80336594 003321F4  41 82 00 18 */	beq lbl_803365AC
    /* 80336598 003321F8  80 7C 00 14 */	lwz r3, 0x14(r28)
    /* 8033659C 003321FC  80 1C 00 08 */	lwz r0, 8(r28)
    /* 803365A0 00332200  7C 63 20 50 */	subf r3, r3, r4
    /* 803365A4 00332204  7C 63 03 D6 */	divw r3, r3, r0
    /* 803365A8 00332208  48 00 00 08 */	b lbl_803365B0
    lbl_803365AC:
    /* 803365AC 0033220C  38 60 FF FF */	li r3, -1
    lbl_803365B0:
    /* 803365B0 00332210  39 61 00 30 */	addi r11, r1, 0x30
    /* 803365B4 00332214  4B E9 0B B1 */	bl _restgpr_23
    /* 803365B8 00332218  80 01 00 34 */	lwz r0, 0x34(r1)
    /* 803365BC 0033221C  7C 08 03 A6 */	mtlr r0
    /* 803365C0 00332220  38 21 00 30 */	addi r1, r1, 0x30
    /* 803365C4 00332224  4E 80 00 20 */	blr
}
#pragma peephole on
#endif

void ArrayMapBackwards(DArray *d, MapFunction map, s32 p3)
{
    for (s32 i = d->size - 1; i >= 0; i--) {
        void *elem = ArrayNth(d, i);
        map(elem, p3);
    }
}

void *ArrayMapBackwards2(DArray *d, MapFunction map, s32 p3)
{
    for (s32 i = d->size - 1; i >= 0; i--) {
        void *elem = ArrayNth(d, i);
        if (map(elem, p3) == FALSE) {
            return elem;
        }
    }
    return NULL;
}

void ArrayClear(DArray *d)
{
    for (s32 i = d->size - 1; i >= 0; i--) {
        ArrayDeleteAt(d, i);
    }
}