Files
tww/src/JSystem/JMessage/processor.cpp
T
Jasper St. Pierre b1072511e5 JMessage work
2024-03-09 14:38:46 -08:00

571 lines
18 KiB
C++

//
// Generated by dtk
// Translation Unit: processor.cpp
//
#include "JSystem/JMessage/processor.h"
#include "JSystem/JMessage/control.h"
namespace JMessage {
namespace {
/* 8029EDA4-8029EDCC .text process_setMessageIndex_reserved___Q28JMessage23@unnamed@processor_cpp@FUs */
bool process_setMessageIndex_reserved_(u16 messageIndex) {
switch (messageIndex) {
case 0xFFFF:
return false;
default:
return false;
}
}
/* 8029EDCC-8029EE18 .text process_setMessage_index___Q28JMessage23@unnamed@processor_cpp@FPQ28JMessage8TControlUs */
bool process_setMessage_index_(TControl* control, u16 index) {
if (index >= 0xFF00) {
return process_setMessageIndex_reserved_(index);
} else {
control->mMessageIndex = index;
return !!control->setMessageCode_flush_();
}
}
/* 8029EE18-8029EE6C .text process_setMessage_code___Q28JMessage23@unnamed@processor_cpp@FPQ28JMessage8TControlUl */
bool process_setMessage_code_(TControl* control, u32 code) {
/* Nonmatching */
u16 messageIndex = code & 0xFFFF;
if (messageIndex >= 0xFF00) {
return process_setMessageIndex_reserved_(code);
} else {
return !!control->setMessageCode(code);
}
}
}; // namespace
/* 8029EE6C-8029EEA4 .text pushCurrent__Q28JMessage10TProcessorFPCc */
void TProcessor::pushCurrent(const char* v) {
if (v == NULL)
return;
if (!mStack.IsStorable())
return;
mStack.push(mCurrent);
mCurrent = v;
}
/* 8029EEA4-8029EEC8 .text popCurrent__Q28JMessage10TProcessorFv */
const char* TProcessor::popCurrent() {
mCurrent = mStack.top();
mStack.pop();
}
struct SelectCallBackWork {
/* 0x00 */ TProcessor::OnSelectBeginCallBack mCallBack;
/* 0x04 */ const char* mBase;
/* 0x08 */ const void* mTable;
/* 0x0C */ u32 mRest;
};
/* 8029EEC8-8029EF54 .text on_select_begin__Q28JMessage10TProcessorFPFPQ28JMessage10TProcessor_PCcPCvPCcUl */
void TProcessor::on_select_begin(OnSelectBeginCallBack callback, const void* offs, const char* base, u32 rest) {
if (mStack.IsStorable()) {
mProcess.reset_select();
SelectCallBackWork* work = (SelectCallBackWork*)&mProcess.mCallBackWork;
work->mCallBack = callback;
work->mBase = base;
work->mTable = offs;
work->mRest = rest;
const char *v = work->mCallBack(this);
pushCurrent(v);
do_select_begin(rest);
}
}
/* 8029EF54-8029EFA0 .text on_select_end__Q28JMessage10TProcessorFv */
void TProcessor::on_select_end() {
mProcess.reset_normal();
popCurrent();
do_select_end();
}
/* 8029EFA0-8029EFFC .text on_select_separate__Q28JMessage10TProcessorFv */
void TProcessor::on_select_separate() {
popCurrent();
SelectCallBackWork* work = (SelectCallBackWork*)&mProcess.mCallBackWork;
const char *v = work->mCallBack(this);
pushCurrent(v);
do_select_separate();
}
/* 8029EFFC-8029F000 .text do_character__Q28JMessage10TProcessorFi */
void TProcessor::do_character(int) {
}
/* 8029F000-8029F008 .text do_tag__Q28JMessage10TProcessorFUlPCvUl */
bool TProcessor::do_tag(u32, const void*, u32) {
return false;
}
/* 8029F008-8029F010 .text do_systemTagCode__Q28JMessage10TProcessorFUsPCvUl */
bool TProcessor::do_systemTagCode(u16, const void*, u32) {
return false;
}
/* 8029F010-8029F014 .text do_select_begin__Q28JMessage10TProcessorFUl */
void TProcessor::do_select_begin(u32) {
}
/* 8029F014-8029F018 .text do_select_end__Q28JMessage10TProcessorFv */
void TProcessor::do_select_end() {
}
/* 8029F018-8029F01C .text do_select_separate__Q28JMessage10TProcessorFv */
void TProcessor::do_select_separate() {
}
/* 8029F01C-8029F064 .text __dt__Q28JMessage10TProcessorFv */
TProcessor::~TProcessor() {
}
/* 8029F064-8029F080 .text reset___Q28JMessage10TProcessorFPCc */
void TProcessor::reset_(const char* v) {
mCurrent = v;
mStack.clear();
mProcess.reset_normal();
}
/* 8029F080-8029F120 .text on_tag___Q28JMessage10TProcessorFv */
void TProcessor::on_tag_() {
u32 size;
const u8* current = (const u8*)getCurrent();
size = current[1];
mCurrent = (const char*)current + size;
u32 tag = (current[2] << 16 | current[3] << 8);
tag |= current[4];
if (!do_tag(tag, &current[5], size - 5)) {
do_tag_(tag, &current[5], size - 5);
}
}
/* 8029F120-8029F248 .text do_tag___Q28JMessage10TProcessorFUlPCvUl */
bool TProcessor::do_tag_(u32 tag, const void* data, u32 size) {
u16 code = data::getTagCode(tag);
u8 group = data::getTagGroup(tag);
switch (group) {
case 0xFF:
if (!do_systemTagCode(code, data, size)) {
do_systemTagCode_(code, data, size);
}
break;
case 0xFE:
pushCurrent(mControl->on_word(code));
break;
case 0xFD:
pushCurrent(mControl->on_message_limited(code));
break;
case 0xF6:
on_select_begin(process_select_limited_, data, (char*)data + size, code);
break;
case 0xF5:
on_select_begin(process_select_, data, (char*)data + size, code);
break;
}
}
/* 8029F248-8029F2A0 .text do_systemTagCode___Q28JMessage10TProcessorFUsPCvUl */
void TProcessor::do_systemTagCode_(u16 code, const void* data, u32 size) {
switch (code) {
case 0x05:
pushCurrent(mControl->on_message(JGadget::binary::TParseValue<u32, JGadget::binary::TParseValue_endian_big_>::parse(data)));
break;
}
}
/* 8029F2A0-8029F37C .text process_character___Q28JMessage10TProcessorFv */
bool TProcessor::process_character_() {
/* Nonmatching */
const char * current = getCurrent();
switch (current[0]) {
case 0:
if (!mProcess.mCallBack(this))
return false;
break;
case 0x1A:
on_tag_();
break;
default:
// mControl->do_word(current[0]);
break;
}
return true;
}
/* 8029F37C-8029F3C4 .text process_onCharacterEnd_normal___Q28JMessage10TProcessorFPQ28JMessage10TProcessor */
bool TProcessor::process_onCharacterEnd_normal_(TProcessor* proc) {
if (!proc->mStack.empty()) {
proc->popCurrent();
return true;
} else {
proc->do_end_();
return false;
}
}
/* 8029F3C4-8029F40C .text process_onCharacterEnd_select___Q28JMessage10TProcessorFPQ28JMessage10TProcessor */
bool TProcessor::process_onCharacterEnd_select_(TProcessor* proc) {
SelectCallBackWork* work = (SelectCallBackWork*) &proc->mProcess.mCallBackWork;
work->mRest--;
if (work->mRest != 0) {
proc->on_select_separate();
return true;
} else {
proc->on_select_end();
return true;
}
}
/* 8029F40C-8029F428 .text process_select_limited___Q28JMessage10TProcessorFPQ28JMessage10TProcessor */
const char* TProcessor::process_select_limited_(TProcessor* proc) {
SelectCallBackWork* work = (SelectCallBackWork*) &proc->mProcess.mCallBackWork;
u16 offs = ((const u16*)work->mTable)[0];
work->mTable = (const char*)work->mTable + sizeof(offs);
return &work->mBase[offs];
}
/* 8029F428-8029F444 .text process_select___Q28JMessage10TProcessorFPQ28JMessage10TProcessor */
const char* TProcessor::process_select_(TProcessor* proc) {
/* Nonmatching */
SelectCallBackWork* work = (SelectCallBackWork*) &proc->mProcess.mCallBackWork;
u32 offs = ((const u32*)work->mTable)[0];
work->mTable = (const char*)work->mTable + sizeof(offs);
return &work->mBase[offs];
}
struct JumpCallBackWork {
/* 0x00 */ u32 mTarget;
};
struct BranchCallBackWork {
/* 0x00 */ const void* mTable;
/* 0x04 */ u32 mTarget;
};
/* 8029F444-8029F480 .text __ct__Q28JMessage18TSequenceProcessorFPQ28JMessage8TControl */
TSequenceProcessor::TSequenceProcessor(TControl* control) : TProcessor(control) {
mStatus = kStatus_Begin;
}
/* 8029F480-8029F4E0 .text __dt__Q28JMessage18TSequenceProcessorFv */
TSequenceProcessor::~TSequenceProcessor() {
}
/* 8029F4E0-8029F658 .text process__Q28JMessage18TSequenceProcessorFPCc */
const char* TSequenceProcessor::process(const char* stop) {
/* Nonmatching */
do {
switch (mStatus) {
case kStatus_Normal:
break;
case kStatus_Jump:
if (!on_jump_isReady())
return mCurrent;
mStatus = kStatus_Normal;
if (mProcess.mCallBack(this))
on_jump(mControl->getMessageEntry(), mControl->getMessageData_begin());
break;
case kStatus_Branch:
{
BranchCallBackWork* work = (BranchCallBackWork*) &mProcess.mCallBackWork;
u32 rt = on_branch_queryResult();
if (rt > 0xFFFF) {
switch (rt) {
case -1:
return mCurrent;
case -2:
mStatus = kStatus_Normal;
break;
}
} else {
mStatus = kStatus_Normal;
if (rt < work->mTarget && mProcess.mCallBack(this))
on_branch(mControl->getMessageEntry(), mControl->getMessageData_begin());
}
}
break;
}
if (mCurrent == stop) {
do_end_();
return NULL;
}
if (!on_isReady())
return mCurrent;
} while (process_character_());
return NULL;
}
/* 8029F658-8029F684 .text on_isReady__Q28JMessage18TSequenceProcessorFv */
bool TSequenceProcessor::on_isReady() {
return do_isReady();
}
/* 8029F684-8029F698 .text on_jump_register__Q28JMessage18TSequenceProcessorFPFPQ28JMessage18TSequenceProcessor_bUl */
void TSequenceProcessor::on_jump_register(OnJumpRegisterCallBack callback, u32 target) {
mStatus = kStatus_Jump;
mProcess.mCallBack = (ProcessorCallBack)callback;
JumpCallBackWork* work = (JumpCallBackWork*) &mProcess.mCallBackWork;
work->mTarget = target;
}
/* 8029F698-8029F6C4 .text on_jump_isReady__Q28JMessage18TSequenceProcessorFv */
bool TSequenceProcessor::on_jump_isReady() {
return do_jump_isReady();
}
/* 8029F6C4-8029F720 .text on_jump__Q28JMessage18TSequenceProcessorFPCvPCc */
void TSequenceProcessor::on_jump(const void* target, const char* v) {
reset_(v);
do_jump(target, v);
}
/* 8029F720-8029F730 .text on_branch_register__Q28JMessage18TSequenceProcessorFPFPQ28JMessage18TSequenceProcessorUl_bPCvUl */
void TSequenceProcessor::on_branch_register(OnBranchRegisterCallBack callback, const void* offset, u32 target) {
mProcess.mCallBack = (ProcessorCallBack)callback;
BranchCallBackWork* work = (BranchCallBackWork*) &mProcess.mCallBackWork;
work->mTable = offset;
work->mTarget = target;
}
/* 8029F730-8029F764 .text on_branch_query__Q28JMessage18TSequenceProcessorFUs */
void TSequenceProcessor::on_branch_query(u16 branch) {
mStatus = 4;
do_branch_query(branch);
}
/* 8029F764-8029F790 .text on_branch_queryResult__Q28JMessage18TSequenceProcessorFv */
int TSequenceProcessor::on_branch_queryResult() {
return do_branch_queryResult();
}
/* 8029F790-8029F7EC .text on_branch__Q28JMessage18TSequenceProcessorFPCvPCc */
void TSequenceProcessor::on_branch(const void* target, const char* v) {
reset_(v);
do_branch(target, v);
}
/* 8029F7EC-8029F7F0 .text do_begin__Q28JMessage18TSequenceProcessorFPCvPCc */
void TSequenceProcessor::do_begin(const void*, const char*) {
}
/* 8029F7F0-8029F7F4 .text do_end__Q28JMessage18TSequenceProcessorFv */
void TSequenceProcessor::do_end() {
}
/* 8029F7F4-8029F7FC .text do_isReady__Q28JMessage18TSequenceProcessorFv */
bool TSequenceProcessor::do_isReady() {
return true;
}
/* 8029F7FC-8029F804 .text do_jump_isReady__Q28JMessage18TSequenceProcessorFv */
bool TSequenceProcessor::do_jump_isReady() {
return true;
}
/* 8029F804-8029F808 .text do_jump__Q28JMessage18TSequenceProcessorFPCvPCc */
void TSequenceProcessor::do_jump(const void*, const char*) {
}
/* 8029F808-8029F80C .text do_branch_query__Q28JMessage18TSequenceProcessorFUs */
void TSequenceProcessor::do_branch_query(u16) {
}
/* 8029F80C-8029F814 .text do_branch_queryResult__Q28JMessage18TSequenceProcessorFv */
int TSequenceProcessor::do_branch_queryResult() {
return -2;
}
/* 8029F814-8029F818 .text do_branch__Q28JMessage18TSequenceProcessorFPCvPCc */
void TSequenceProcessor::do_branch(const void*, const char*) {
}
/* 8029F818-8029F868 .text reset___Q28JMessage18TSequenceProcessorFPCc */
void TSequenceProcessor::reset_(const char* v) {
TProcessor::reset_(v);
mStatus = kStatus_Begin;
if (v != NULL)
mStatus = kStatus_Normal;
}
/* 8029F868-8029F894 .text do_begin___Q28JMessage18TSequenceProcessorFPCvPCc */
void TSequenceProcessor::do_begin_(const void* target, const char* v) {
do_begin(target, v);
}
/* 8029F894-8029F8C8 .text do_end___Q28JMessage18TSequenceProcessorFv */
void TSequenceProcessor::do_end_() {
mStatus = kStatus_End;
do_end();
}
/* 8029F8C8-8029F9D4 .text do_tag___Q28JMessage18TSequenceProcessorFUlPCvUl */
bool TSequenceProcessor::do_tag_(u32 tag, const void* data, u32 size) {
const char* datap = (const char*)data;
u16 code = data::getTagCode(tag);
u8 group = data::getTagGroup(tag);
switch (group) {
case 0xFC:
on_jump_register(process_jump_limited_, code);
break;
case 0xFB:
on_branch_register(process_branch_limited_, datap, code);
break;
case 0xFA:
on_branch_register(process_branch_, datap, code);
break;
case 0xF9:
on_branch_query(code);
break;
case 0xF8:
on_branch_register(process_branch_limited_, datap + 2, JGadget::binary::TParseValue<u16, JGadget::binary::TParseValue_endian_big_>::parse(datap));
on_branch_query(code);
break;
case 0xF7:
on_branch_register(process_branch_, datap + 2, JGadget::binary::TParseValue<u16, JGadget::binary::TParseValue_endian_big_>::parse(datap));
on_branch_query(code);
break;
default:
TProcessor::do_tag_(tag, data, size);
break;
}
}
/* 8029F9D4-8029FA2C .text do_systemTagCode___Q28JMessage18TSequenceProcessorFUsPCvUl */
void TSequenceProcessor::do_systemTagCode_(u16 code, const void* data, u32 size) {
switch (code) {
case 0:
case 1:
case 2:
case 3:
break;
case 6:
u32 target = JGadget::binary::TParseValue<u32, JGadget::binary::TParseValue_endian_big_>::parse(data);
on_jump_register(process_jump_, target);
break;
case 4:
case 5:
default:
TProcessor::do_systemTagCode_(code, data, size);
break;
}
}
/* 8029FA2C-8029FA5C .text process_jump_limited___Q28JMessage18TSequenceProcessorFPQ28JMessage18TSequenceProcessor */
bool TSequenceProcessor::process_jump_limited_(TSequenceProcessor* proc) {
JumpCallBackWork* work = (JumpCallBackWork*) &proc->mProcess.mCallBackWork;
process_setMessage_index_(proc->mControl, work->mTarget);
}
/* 8029FA5C-8029FA88 .text process_jump___Q28JMessage18TSequenceProcessorFPQ28JMessage18TSequenceProcessor */
bool TSequenceProcessor::process_jump_(TSequenceProcessor* proc) {
JumpCallBackWork* work = (JumpCallBackWork*) &proc->mProcess.mCallBackWork;
process_setMessage_code_(proc->mControl, work->mTarget);
}
/* 8029FA88-8029FAB8 .text process_branch_limited___Q28JMessage18TSequenceProcessorFPQ28JMessage18TSequenceProcessorUl */
bool TSequenceProcessor::process_branch_limited_(TSequenceProcessor* proc, u32 choice) {
/* Nonmatching */
BranchCallBackWork* work = (BranchCallBackWork*) &proc->mProcess.mCallBackWork;
process_setMessage_index_(proc->mControl, ((u16*)work->mTable)[choice]);
}
/* 8029FAB8-8029FAE8 .text process_branch___Q28JMessage18TSequenceProcessorFPQ28JMessage18TSequenceProcessorUl */
bool TSequenceProcessor::process_branch_(TSequenceProcessor* proc, u32 choice) {
/* Nonmatching */
BranchCallBackWork* work = (BranchCallBackWork*) &proc->mProcess.mCallBackWork;
process_setMessage_code_(proc->mControl, ((u32*)work->mTable)[choice]);
}
/* 8029FAE8-8029FB20 .text __ct__Q28JMessage19TRenderingProcessorFPQ28JMessage8TControl */
TRenderingProcessor::TRenderingProcessor(TControl* control) : TProcessor(control) {
}
/* 8029FB20-8029FB80 .text __dt__Q28JMessage19TRenderingProcessorFv */
TRenderingProcessor::~TRenderingProcessor() {
}
/* 8029FB80-8029FBF0 .text process__Q28JMessage19TRenderingProcessorFPCc */
const char* TRenderingProcessor::process(const char* stop) {
/* Nonmatching */
do {
if (mCurrent == stop) {
do_end_();
return NULL;
}
} while(process_character_());
return NULL;
}
/* 8029FBF0-8029FBF4 .text do_begin__Q28JMessage19TRenderingProcessorFPCvPCc */
void TRenderingProcessor::do_begin(const void*, const char*) {
}
/* 8029FBF4-8029FBF8 .text do_end__Q28JMessage19TRenderingProcessorFv */
void TRenderingProcessor::do_end() {
}
/* 8029FBF8-8029FC24 .text do_begin___Q28JMessage19TRenderingProcessorFPCvPCc */
void TRenderingProcessor::do_begin_(const void* entry, const char* data) {
do_begin(entry, data);
}
/* 8029FC24-8029FC50 .text do_end___Q28JMessage19TRenderingProcessorFv */
void TRenderingProcessor::do_end_() {
do_end();
}
/* 8029FC50-8029FC84 .text do_tag___Q28JMessage19TRenderingProcessorFUlPCvUl */
bool TRenderingProcessor::do_tag_(u32 tag, const void* data, u32 size) {
u8 group = data::getTagGroup(tag);
switch (group) {
case 0xFC:
case 0xFB:
case 0xFA:
case 0xF9:
case 0xF8:
case 0xF7:
break;
default:
TProcessor::do_tag_(tag, data, size);
break;
}
}
/* 8029FC84-8029FCC4 .text do_systemTagCode___Q28JMessage19TRenderingProcessorFUsPCvUl */
void TRenderingProcessor::do_systemTagCode_(u16 code, const void* data, u32 size) {
switch (code) {
case 0x06:
case 0x03:
case 0x02:
case 0x01:
case 0x00:
break;
default:
TProcessor::do_systemTagCode_(code, data, size);
break;
}
}
}; // namespace JMessage