157 lines
2.5 KiB
C++
Executable file
157 lines
2.5 KiB
C++
Executable file
#include "PowerPC_EABI_Support/Runtime/NMWException.h"
|
|
#include "PowerPC_EABI_Support/Runtime/MWCPlusLib.h"
|
|
|
|
#define ARRAY_HEADER_SIZE 16
|
|
|
|
extern "C" {
|
|
extern void abort();
|
|
}
|
|
|
|
namespace std {
|
|
/**
|
|
* @note Address: N/A
|
|
* @note Size: 0x20
|
|
*/
|
|
static void dthandler() { abort(); }
|
|
|
|
static terminate_handler thandler = dthandler;
|
|
|
|
/**
|
|
* @note Address: N/A
|
|
* @note Size: 0x28
|
|
*/
|
|
static void duhandler() { terminate(); }
|
|
|
|
static unexpected_handler uhandler = duhandler;
|
|
|
|
/**
|
|
* @note Address: N/A
|
|
* @note Size: 0x28
|
|
*/
|
|
extern void terminate() { thandler(); }
|
|
|
|
/**
|
|
* @note Address: N/A
|
|
* @note Size: 0x28
|
|
*/
|
|
extern void unexpected() { uhandler(); }
|
|
} // namespace std
|
|
|
|
/**
|
|
* @note Address: N/A
|
|
* @note Size: 0x22C
|
|
*/
|
|
extern char __throw_catch_compare(const char* throwtype, const char* catchtype, s32* offset_result)
|
|
{
|
|
const char *cptr1, *cptr2;
|
|
|
|
*offset_result = 0;
|
|
|
|
if ((cptr2 = catchtype) == 0) {
|
|
return true;
|
|
}
|
|
|
|
cptr1 = throwtype;
|
|
|
|
if (*cptr2 == 'P') {
|
|
cptr2++;
|
|
if (*cptr2 == 'C')
|
|
cptr2++;
|
|
if (*cptr2 == 'V')
|
|
cptr2++;
|
|
if (*cptr2 == 'v') {
|
|
if (*cptr1 == 'P' || *cptr1 == '*') {
|
|
return true;
|
|
}
|
|
}
|
|
cptr2 = catchtype;
|
|
}
|
|
|
|
switch (*cptr1) {
|
|
case '*':
|
|
case '!':
|
|
if (*cptr1++ != *cptr2++)
|
|
return false;
|
|
for (;;) {
|
|
if (*cptr1 == *cptr2++) {
|
|
if (*cptr1++ == '!') {
|
|
s32 offset;
|
|
|
|
for (offset = 0; *cptr1 != '!';) {
|
|
offset = offset * 10 + *cptr1++ - '0';
|
|
}
|
|
*offset_result = offset;
|
|
return true;
|
|
}
|
|
} else {
|
|
while (*cptr1++ != '!') { }
|
|
while (*cptr1++ != '!') { }
|
|
if (*cptr1 == 0)
|
|
return false;
|
|
|
|
cptr2 = catchtype + 1;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
while ((*cptr1 == 'P' || *cptr1 == 'R') && *cptr1 == *cptr2) {
|
|
cptr1++;
|
|
cptr2++;
|
|
|
|
if (*cptr2 == 'C') {
|
|
if (*cptr1 == 'C')
|
|
cptr1++;
|
|
cptr2++;
|
|
}
|
|
if (*cptr1 == 'C')
|
|
return false;
|
|
|
|
if (*cptr2 == 'V') {
|
|
if (*cptr1 == 'V')
|
|
cptr1++;
|
|
cptr2++;
|
|
}
|
|
if (*cptr1 == 'V')
|
|
return false;
|
|
}
|
|
|
|
for (; *cptr1 == *cptr2; cptr1++, cptr2++) {
|
|
if (*cptr1 == 0)
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
class __partial_array_destructor {
|
|
private:
|
|
void* p;
|
|
size_t size;
|
|
size_t n;
|
|
ConstructorDestructor dtor;
|
|
|
|
public:
|
|
size_t i;
|
|
|
|
__partial_array_destructor(void* array, size_t elementsize, size_t nelements, ConstructorDestructor destructor)
|
|
{
|
|
p = array;
|
|
size = elementsize;
|
|
n = nelements;
|
|
dtor = destructor;
|
|
i = n;
|
|
}
|
|
|
|
~__partial_array_destructor()
|
|
{
|
|
char* ptr;
|
|
|
|
if (i < n && dtor) {
|
|
for (ptr = (char*)p + size * i; i > 0; i--) {
|
|
ptr -= size;
|
|
DTORCALL_COMPLETE(dtor, ptr);
|
|
}
|
|
}
|
|
}
|
|
};
|