mirror of https://github.com/OpenRCT2/OpenRCT2.git
Fix convert_multibyte_charset
This commit is contained in:
parent
c506f2730d
commit
941d92dc2a
|
@ -18,7 +18,6 @@
|
|||
|
||||
#include "../common.h"
|
||||
|
||||
#include "../localisation/localisation.h"
|
||||
#include "Math.hpp"
|
||||
#include "Memory.hpp"
|
||||
#include "String.hpp"
|
||||
|
@ -121,6 +120,22 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the StringBuilder and returns the working buffer (resized to the string size).
|
||||
*/
|
||||
utf8 * StealString()
|
||||
{
|
||||
utf8 * result = _buffer;
|
||||
result = Memory::ReallocateArray<utf8>(result, _length + 1);
|
||||
result[_length] = 0;
|
||||
|
||||
_length = 0;
|
||||
_capacity = 0;
|
||||
_buffer = nullptr;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current string buffer as a new fire-and-forget string.
|
||||
*/
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "../core/Memory.hpp"
|
||||
#include "../core/Path.hpp"
|
||||
#include "../core/String.hpp"
|
||||
#include "../core/StringBuilder.hpp"
|
||||
#include "../object/ObjectManager.h"
|
||||
#include "LanguagePack.h"
|
||||
|
||||
|
@ -295,31 +296,26 @@ static utf8 * convert_multibyte_charset(const char * src, int languageId)
|
|||
{
|
||||
constexpr char CODEPOINT_DOUBLEBYTE = (char)0xFF;
|
||||
|
||||
size_t reservedLength = (String::LengthOf(src) * 4) + 1;
|
||||
utf8 * buffer = Memory::Allocate<utf8>(reservedLength);
|
||||
utf8 * dst = buffer;
|
||||
auto sb = StringBuilder(64);
|
||||
for (const char * ch = src; *ch != 0;)
|
||||
{
|
||||
if (*ch == CODEPOINT_DOUBLEBYTE)
|
||||
{
|
||||
ch++;
|
||||
char a = *ch++;
|
||||
char b = *ch++;
|
||||
uint16 codepoint = (uint16)((a << 8) | b);
|
||||
uint8 a = *ch++;
|
||||
uint8 b = *ch++;
|
||||
wchar_t codepoint16 = (wchar_t)((a << 8) | b);
|
||||
|
||||
codepoint = convert_specific_language_character_to_unicode(languageId, codepoint);
|
||||
dst = String::WriteCodepoint(dst, codepoint);
|
||||
codepoint16 = convert_specific_language_character_to_unicode(languageId, codepoint16);
|
||||
sb.Append(codepoint16);
|
||||
}
|
||||
else
|
||||
{
|
||||
dst = String::WriteCodepoint(dst, *ch++);
|
||||
codepoint_t codepoint = (uint8)*ch++;
|
||||
sb.Append(codepoint);
|
||||
}
|
||||
}
|
||||
*dst++ = 0;
|
||||
size_t actualLength = (size_t)(dst - buffer);
|
||||
buffer = Memory::Reallocate(buffer, actualLength);
|
||||
|
||||
return buffer;
|
||||
return sb.StealString();
|
||||
}
|
||||
|
||||
static bool rct2_language_is_multibyte_charset(int languageId)
|
||||
|
|
Loading…
Reference in New Issue