2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-01-13 12:11:50 +00:00

refactor: return ZoneOutputOffset when writing via ZoneOutputStream

This commit is contained in:
Jan Laupetin
2026-01-06 22:37:46 +00:00
parent df07ebe083
commit 4048de44a1
16 changed files with 262 additions and 92 deletions

View File

@@ -60,15 +60,18 @@ void ContentWriter::WriteScriptStringList(const bool atStreamStart)
m_stream->PushBlock(XFILE_BLOCK_VIRTUAL);
if (atStreamStart)
varScriptStringList = m_stream->Write(varScriptStringList);
varScriptStringListWritten = m_stream->Write(varScriptStringList);
if (varScriptStringList->strings != nullptr)
{
m_stream->Align(alignof(const char*));
m_stream->Align(4);
varXString = varScriptStringList->strings;
WriteXStringArray(true, varScriptStringList->count);
m_stream->MarkFollowing(varScriptStringList->strings);
#ifdef ARCH_x86
static_assert(offsetof(ScriptStringList, strings) == 4u);
#endif
m_stream->MarkFollowing(varScriptStringListWritten.WithInnerOffset(4));
}
m_stream->PopBlock();
@@ -90,7 +93,7 @@ void ContentWriter::WriteXAsset(const bool atStreamStart)
assert(varXAsset != nullptr);
if (atStreamStart)
varXAsset = m_stream->Write(varXAsset);
varXAssetWritten = m_stream->Write(varXAsset);
switch (varXAsset->type)
{
@@ -150,12 +153,17 @@ void ContentWriter::WriteXAssetArray(const bool atStreamStart, const size_t coun
assert(varXAsset != nullptr);
if (atStreamStart)
varXAsset = m_stream->Write(varXAsset, count);
varXAssetWritten = m_stream->Write(varXAsset, count);
for (size_t index = 0; index < count; index++)
{
WriteXAsset(false);
varXAsset++;
#ifdef ARCH_x86
static_assert(sizeof(XAsset) == 8u);
#endif
varXAssetWritten.Inc(8u);
}
}
@@ -170,17 +178,26 @@ void ContentWriter::WriteContent(ZoneOutputStream& stream)
CreateXAssetList(assetList, memory);
varXAssetList = static_cast<XAssetList*>(m_stream->WriteDataRaw(&assetList, sizeof(assetList)));
varXAssetList = &assetList;
varXAssetListWritten = m_stream->WriteDataRaw(&assetList, sizeof(assetList));
#ifdef ARCH_x86
static_assert(offsetof(XAssetList, stringList) == 0u);
#endif
varScriptStringList = &varXAssetList->stringList;
varScriptStringListWritten = varXAssetListWritten.WithInnerOffset(0);
WriteScriptStringList(false);
if (varXAssetList->assets != nullptr)
{
m_stream->Align(alignof(XAsset));
m_stream->Align(4);
varXAsset = varXAssetList->assets;
WriteXAssetArray(true, varXAssetList->assetCount);
m_stream->MarkFollowing(varXAssetList->assets);
#ifdef ARCH_x86
static_assert(offsetof(XAssetList, assets) == 12u);
#endif
m_stream->MarkFollowing(varXAssetListWritten.WithInnerOffset(12));
}
m_stream->PopBlock();