Parse checksumoverride for StructuredDataDef

This commit is contained in:
Jan 2022-03-21 11:05:48 +01:00
parent 93fea39ddd
commit 49c774b1e6
3 changed files with 39 additions and 2 deletions

View File

@ -87,6 +87,32 @@ namespace sdd::def_scope_sequences
} }
}; };
class SequenceChecksumOverride final : public StructuredDataDefParser::sequence_t
{
static constexpr auto CAPTURE_VALUE = 1;
public:
SequenceChecksumOverride()
{
const SimpleMatcherFactory create(this);
AddMatchers({
create.Keyword("checksumoverride"),
create.Integer().Capture(CAPTURE_VALUE),
create.Char(';')
});
}
protected:
void ProcessMatch(StructuredDataDefParserState* state, SequenceResult<SimpleParserValue>& result) const override
{
assert(state->m_current_def);
state->m_checksum_overriden = true;
state->m_checksum_override_value = result.NextCapture(CAPTURE_VALUE).IntegerValue();
}
};
class SequenceCloseScope final : public StructuredDataDefParser::sequence_t class SequenceCloseScope final : public StructuredDataDefParser::sequence_t
{ {
static constexpr auto CAPTURE_NAME = 1; static constexpr auto CAPTURE_NAME = 1;
@ -130,12 +156,17 @@ namespace sdd::def_scope_sequences
CreateDefaultStructWhenNoStructsSpecified(state); CreateDefaultStructWhenNoStructsSpecified(state);
SetDefSizeFromRootStruct(state); SetDefSizeFromRootStruct(state);
// TODO: Calculate checksum here if(!state->m_checksum_overriden)
state->m_current_def->m_checksum = state->m_current_def->CalculateChecksum();
else
state->m_current_def->m_checksum = state->m_checksum_override_value;
state->m_current_def = nullptr; state->m_current_def = nullptr;
state->m_def_types_by_name.clear(); state->m_def_types_by_name.clear();
state->m_def_indexed_arrays.clear(); state->m_def_indexed_arrays.clear();
state->m_def_enumed_arrays.clear(); state->m_def_enumed_arrays.clear();
state->m_checksum_overriden = false;
state->m_checksum_override_value = 0u;
} }
}; };
} }
@ -154,4 +185,5 @@ void StructuredDataDefScopeSequences::AddSequences() const
AddSequence(std::make_unique<SequenceCloseScope>()); AddSequence(std::make_unique<SequenceCloseScope>());
AddSequence(std::make_unique<SequenceEnum>()); AddSequence(std::make_unique<SequenceEnum>());
AddSequence(std::make_unique<SequenceStruct>()); AddSequence(std::make_unique<SequenceStruct>());
AddSequence(std::make_unique<SequenceChecksumOverride>());
} }

View File

@ -6,6 +6,8 @@ StructuredDataDefParserState::StructuredDataDefParserState()
: m_current_def(nullptr), : m_current_def(nullptr),
m_current_enum(nullptr), m_current_enum(nullptr),
m_current_struct(nullptr), m_current_struct(nullptr),
m_current_struct_offset_in_bits(0u) m_current_struct_offset_in_bits(0u),
m_checksum_override_value(0u),
m_checksum_overriden(false)
{ {
} }

View File

@ -19,6 +19,9 @@ namespace sdd
CommonStructuredDataStruct* m_current_struct; CommonStructuredDataStruct* m_current_struct;
size_t m_current_struct_offset_in_bits; size_t m_current_struct_offset_in_bits;
size_t m_checksum_override_value;
bool m_checksum_overriden;
std::map<std::string, CommonStructuredDataType> m_def_types_by_name; std::map<std::string, CommonStructuredDataType> m_def_types_by_name;
std::map<CommonStructuredDataIndexedArray, size_t> m_def_indexed_arrays; std::map<CommonStructuredDataIndexedArray, size_t> m_def_indexed_arrays;
std::map<CommonStructuredDataEnumedArray, size_t> m_def_enumed_arrays; std::map<CommonStructuredDataEnumedArray, size_t> m_def_enumed_arrays;