prime/src/Kyoto/Text/CStringTable.cpp
Luke Street 1efd8da0b0 Migrate to inline=deferred,noauto
Former-commit-id: 863cf71312a4d5952ea653813c7afb4c9883b6a2
2022-07-28 09:19:26 -04:00

49 lines
1.5 KiB
C++

#include "Kyoto/Text/CStringTable.hpp"
#include "rstl/pair.hpp"
#include "rstl/vector.hpp"
#include "Kyoto/CFactoryMgr.hpp"
static FourCC mCurrentLanguage = 'ENGL';
static const wchar_t skInvalidString[] = L"Invalid";
CStringTable::CStringTable(CInputStream& in) : x0_stringCount(0), x4_data(NULL) {
in.ReadLong();
in.ReadLong();
size_t langCount = in.Get< size_t >();
x0_stringCount = in.Get< u32 >();
rstl::vector< rstl::pair< FourCC, u32 > > langOffsets(langCount);
for (size_t i = 0; i < langCount; ++i) {
langOffsets.push_back(in.Get< rstl::pair< FourCC, u32 > >());
}
size_t offset = langOffsets.front().second;
for (size_t i = 0; i < langCount; ++i) {
if (langOffsets[i].first == mCurrentLanguage) {
offset = langOffsets[i].second;
break;
}
}
for (u32 i = 0; i < offset; ++i) {
in.ReadChar();
}
u32 dataLen = in.Get< u32 >();
x4_data = new u8[dataLen];
in.ReadBytes(x4_data.get(), dataLen);
}
const wchar_t* CStringTable::GetString(s32 idx) const {
if (idx < 0 || idx >= x0_stringCount) {
return skInvalidString;
}
s32 offset = *(reinterpret_cast< const s32* >(x4_data.get()) + idx);
return reinterpret_cast< const wchar_t* >(x4_data.get() + offset);
}
template <>
CFactoryFnReturn::CFactoryFnReturn(CStringTable* ptr) : obj(TToken< CStringTable >::GetIObjObjectFor(ptr).release()) {}
CFactoryFnReturn FStringTableFactory(const SObjectTag& tag, CInputStream& in, const CVParamTransfer& xfer) { return new CStringTable(in); }