1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-04 12:39:55 +00:00

Merge branch 'fix_esm4_reader_utf8' into 'master'

Fix conversion to UTF8 for ESM4 Reader strings

See merge request OpenMW/openmw!2394
This commit is contained in:
psi29a 2022-09-12 07:04:39 +00:00
commit 622f906855
2 changed files with 29 additions and 2 deletions

View File

@ -62,6 +62,24 @@ namespace EsmTool
template <class T> template <class T>
constexpr bool hasFlags = HasFlags<T>::value; constexpr bool hasFlags = HasFlags<T>::value;
template <class T, class = std::void_t<>>
struct HasEditorId : std::false_type {};
template <class T>
struct HasEditorId<T, std::void_t<decltype(T::mEditorId)>> : std::true_type {};
template <class T>
constexpr bool hasEditorId = HasEditorId<T>::value;
template <class T, class = std::void_t<>>
struct HasModel : std::false_type {};
template <class T>
struct HasModel<T, std::void_t<decltype(T::mModel)>> : std::true_type {};
template <class T>
constexpr bool hasModel = HasModel<T>::value;
template <class T> template <class T>
void readTypedRecord(const Params& params, ESM4::Reader& reader) void readTypedRecord(const Params& params, ESM4::Reader& reader)
{ {
@ -75,9 +93,13 @@ namespace EsmTool
std::cout << "\n Record: " << ESM::NAME(reader.hdr().record.typeId).toStringView(); std::cout << "\n Record: " << ESM::NAME(reader.hdr().record.typeId).toStringView();
if constexpr (hasFormId<T>) if constexpr (hasFormId<T>)
std::cout << ' ' << value.mFormId; std::cout << "\n FormId: " << value.mFormId;
if constexpr (hasFlags<T>) if constexpr (hasFlags<T>)
std::cout << "\n Record flags: " << recordFlags(value.mFlags); std::cout << "\n Record flags: " << recordFlags(value.mFlags);
if constexpr (hasEditorId<T>)
std::cout << "\n EditorId: " << value.mEditorId;
if constexpr (hasModel<T>)
std::cout << "\n Model: " << value.mModel;
std::cout << '\n'; std::cout << '\n';
} }

View File

@ -652,7 +652,12 @@ bool Reader::getStringImpl(std::string& str, std::size_t size,
stream.read(input.data(), size); stream.read(input.data(), size);
if (stream.gcount() == static_cast<std::streamsize>(size)) if (stream.gcount() == static_cast<std::streamsize>(size))
{ {
encoder->getUtf8(input, ToUTF8::BufferAllocationPolicy::FitToRequiredSize, str); const std::string_view result = encoder->getUtf8(input, ToUTF8::BufferAllocationPolicy::FitToRequiredSize, str);
if (str.empty() && !result.empty())
{
str = std::move(input);
str.resize(result.size());
}
return true; return true;
} }
} }