1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-03-03 09:09:40 +00:00

Fix compile errors by using StatelessUtf8Encoder

This commit is contained in:
elsid 2022-02-14 23:28:44 +01:00 committed by Bret Curtis
parent 4a06351c3b
commit 139ae9325a
3 changed files with 9 additions and 37 deletions

View file

@ -38,45 +38,17 @@ namespace ESM
}
bool Reader::getStringImpl(std::string& str, std::size_t size,
Files::IStreamPtr filestream, ToUTF8::Utf8Encoder* encoder, bool hasNull)
Files::IStreamPtr filestream, ToUTF8::StatelessUtf8Encoder* encoder, bool hasNull)
{
std::size_t newSize = size;
if (encoder)
{
if (!hasNull)
newSize += 1; // Utf8Encoder::getLength() expects a null terminator
std::string tmp;
tmp.resize(newSize);
filestream->read(&tmp[0], size);
if ((std::size_t)filestream->gcount() == size)
std::string input(size, '\0');
filestream->read(input.data(), size);
if (filestream->gcount() == static_cast<std::streamsize>(size))
{
if (hasNull)
{
assert (tmp[newSize - 1] == '\0'
&& "ESM4::Reader::getString string is not terminated with a null");
}
else
{
// NOTE: script text of some mods have terminating null;
// unfortunately we just have to deal with it
//if (tmp[newSize - 2] != '\0')
tmp[newSize - 1] = '\0'; // for Utf8Encoder::getLength()
}
encoder->toUtf8(tmp, str, newSize - 1);
// NOTE: the encoder converts “keep” as “keep†which increases the length,
// which results in below resize() truncating the string
if (str.size() == newSize) // ascii
str.resize(newSize - 1); // don't want the null terminator
else
{
// this is a horrible hack but fortunately there's only a few like this
std::string tmp2(str.data());
str.swap(tmp2);
}
encoder->getUtf8(input, ToUTF8::BufferAllocationPolicy::FitToRequiredSize, str);
return true;
}
}

View file

@ -31,7 +31,7 @@ namespace ESM
virtual inline bool hasMoreRecs() const = 0;
virtual inline void setEncoder(ToUTF8::Utf8Encoder* encoder) = 0;
virtual inline void setEncoder(ToUTF8::StatelessUtf8Encoder* encoder) = 0;
// used to check for dependencies e.g. CS::Editor::run()
virtual inline const std::vector<ESM::MasterData>& getGameFiles() const = 0;
@ -53,7 +53,7 @@ namespace ESM
protected:
bool getStringImpl(std::string& str, std::size_t size,
Files::IStreamPtr filestream, ToUTF8::Utf8Encoder* encoder, bool hasNull = false);
Files::IStreamPtr filestream, ToUTF8::StatelessUtf8Encoder* encoder, bool hasNull = false);
};
}

View file

@ -77,7 +77,7 @@ namespace ESM4 {
ReaderContext mCtx;
ToUTF8::Utf8Encoder* mEncoder;
ToUTF8::StatelessUtf8Encoder* mEncoder;
std::size_t mFileSize;
@ -140,7 +140,7 @@ namespace ESM4 {
inline bool isEsm4() const final { return true; }
inline void setEncoder(ToUTF8::Utf8Encoder* encoder) final { mEncoder = encoder; };
inline void setEncoder(ToUTF8::StatelessUtf8Encoder* encoder) final { mEncoder = encoder; };
const std::vector<ESM::MasterData>& getGameFiles() const final { return mHeader.mMaster; }