sm64coopdx/src/pc/lua/smlua_cobject_allowlist.c
2023-06-24 13:57:32 -07:00

102 lines
No EOL
2.7 KiB
C

#include <stdio.h>
#include "smlua.h"
#include "data/dynos_cmap.cpp.h"
#define LOT_COUNT (LOT_MAX + (LOT_AUTOGEN_MAX - LOT_AUTOGEN_MIN))
static void* sObjectAllowList[LOT_COUNT] = { NULL };
static u64 sCachedObjectAllowed[LOT_COUNT] = { 0 };
static u16 smlua_lot_mapping(u16 lot) {
if (lot >= LOT_MAX) {
return LOT_MAX + (lot - LOT_AUTOGEN_MIN);
} else {
return lot;
}
}
void smlua_cobject_allowlist_init(void) {
smlua_cobject_allowlist_shutdown();
}
void smlua_cobject_allowlist_shutdown(void) {
for (s32 i = 0; i < LOT_COUNT; i++) {
sCachedObjectAllowed[i] = 0;
if (sObjectAllowList[i]) {
hmap_clear(sObjectAllowList[i]);
}
}
}
void smlua_cobject_allowlist_add(u16 lot, u64 pointer) {
if (pointer == 0) { return; }
if (!smlua_valid_lot(lot)) { return; }
u16 m = smlua_lot_mapping(lot);
if (sCachedObjectAllowed[m] == pointer) { return; }
sCachedObjectAllowed[m] = pointer;
if (!sObjectAllowList[m]) {
sObjectAllowList[m] = hmap_create();
}
if (!hmap_get(sObjectAllowList[m], pointer)) {
hmap_put(sObjectAllowList[m], pointer, (void*)1);
}
}
bool smlua_cobject_allowlist_contains(u16 lot, u64 pointer) {
if (pointer == 0) { return false; }
if (!smlua_valid_lot(lot)) { return false; }
u16 m = smlua_lot_mapping(lot);
if (sCachedObjectAllowed[m] == pointer) { return true; }
if (!sObjectAllowList[m]) { return false; }
return hmap_get(sObjectAllowList[m], pointer) != 0;
}
/////////////////////////////
static void* sPointerAllowList[LVT_MAX] = { 0 };
static u64 sCachedPointerAllowed[LVT_MAX] = { 0 };
void smlua_cpointer_allowlist_init(void) {
smlua_cpointer_allowlist_shutdown();
}
void smlua_cpointer_allowlist_shutdown(void) {
for (s32 i = 0; i < LVT_MAX; i++) {
sCachedPointerAllowed[i] = 0;
if (sPointerAllowList[i]) {
hmap_clear(sPointerAllowList[i]);
}
}
}
void smlua_cpointer_allowlist_add(u16 lvt, u64 pointer) {
if (pointer == 0) { return; }
if (!smlua_valid_lvt(lvt)) { return; }
if (sCachedPointerAllowed[lvt] == pointer) { return; }
sCachedPointerAllowed[lvt] = pointer;
if (!sPointerAllowList[lvt]) {
sPointerAllowList[lvt] = hmap_create();
}
if (!hmap_get(sPointerAllowList[lvt], pointer)) {
hmap_put(sPointerAllowList[lvt], pointer, (void*)1);
}
}
bool smlua_cpointer_allowlist_contains(u16 lvt, u64 pointer) {
if (pointer == 0) { return false; }
if (!smlua_valid_lvt(lvt)) { return false; }
if (sCachedPointerAllowed[lvt] == pointer) { return true; }
if (!sPointerAllowList[lvt]) { return false; }
return hmap_get(sPointerAllowList[lvt], pointer) != 0;
}