From 392459f0383fadee258ca313e4e23b05c2c86540 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Mon, 14 May 2018 22:16:25 +0200 Subject: [PATCH] Remove dependency on iconv. --- src/openrct2/CMakeLists.txt | 5 - src/openrct2/localisation/Localisation.cpp | 103 ------------------- src/openrct2/localisation/Localisation.h | 3 - src/openrct2/scenario/ScenarioRepository.cpp | 11 +- 4 files changed, 7 insertions(+), 115 deletions(-) diff --git a/src/openrct2/CMakeLists.txt b/src/openrct2/CMakeLists.txt index e3a9ef1498..3de454ae1d 100644 --- a/src/openrct2/CMakeLists.txt +++ b/src/openrct2/CMakeLists.txt @@ -136,11 +136,6 @@ if (NOT DISABLE_TTF) endif () endif () -if (UNIX OR STATIC OR ${CMAKE_SYSTEM_NAME} MATCHES "BSD") - find_library(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c) - target_link_libraries(${PROJECT} ${ICONV_LIBRARIES}) -endif() - if (HAVE_DISCORD_RPC) target_link_libraries(libopenrct2 discord-rpc) endif() diff --git a/src/openrct2/localisation/Localisation.cpp b/src/openrct2/localisation/Localisation.cpp index da03041103..e5177bccfb 100644 --- a/src/openrct2/localisation/Localisation.cpp +++ b/src/openrct2/localisation/Localisation.cpp @@ -1330,106 +1330,3 @@ void money_to_string(money32 amount, char * buffer_to_put_value_to, size_t buffe snprintf(buffer_to_put_value_to, buffer_len, "0"); } } - -utf8 *win1252_to_utf8_alloc(const char *src, size_t srcMaxSize) -{ - size_t stringLength = strnlen(src, srcMaxSize); - size_t reservedSpace = (stringLength * 4) + 1; - utf8 * result = (utf8 *)malloc(reservedSpace); - sint32 actualSpace = win1252_to_utf8(result, src, stringLength, reservedSpace); - return (utf8*)realloc(result, actualSpace); -} - -sint32 win1252_to_utf8(utf8string dst, const char *src, size_t srcLength, size_t maxBufferLength) -{ -#ifdef _WIN32 - utf16 stackBuffer[256]; - utf16 *heapBuffer = nullptr; - utf16 *intermediateBuffer = stackBuffer; - size_t bufferCount = Util::CountOf(stackBuffer); - if (maxBufferLength > bufferCount) { - if (srcLength > bufferCount) { - bufferCount = srcLength + 4; - heapBuffer = (utf16 *)malloc(bufferCount * sizeof(utf16)); - assert(heapBuffer != nullptr); - intermediateBuffer = heapBuffer; - } - } - MultiByteToWideChar(CP_ACP, 0, src, -1, intermediateBuffer, (sint32)bufferCount); - sint32 result = WideCharToMultiByte(CP_UTF8, 0, intermediateBuffer, -1, dst, (sint32)maxBufferLength, NULL, NULL); - - free(heapBuffer); -#elif defined(__ANDROID__) - JNIEnv *env = (_JNIEnv *)SDL_AndroidGetJNIEnv(); - - jclass localisation = env->FindClass("website/openrct2/Localisation"); - jmethodID win1252ToUtf8 = env->GetStaticMethodID(localisation, "win1252ToUtf8", "([B)Ljava/lang/String;"); - - jbyteArray bytes = env->NewByteArray(srcLength); - env->SetByteArrayRegion(bytes, 0, srcLength, (jbyte *) src); - - jstring jstring1 = (jstring)env->CallStaticObjectMethod(localisation, win1252ToUtf8, bytes); - - const char* utf = env->GetStringUTFChars(jstring1, NULL); - strcpy(dst, utf); - env->ReleaseStringUTFChars(jstring1, utf); - env->DeleteLocalRef(localisation); - env->DeleteLocalRef(bytes); - env->DeleteLocalRef(jstring1); - - int result = strlen(dst) + 1; -#else - //log_warning("converting %s of size %d", src, srcLength); - char *buffer_conv = strndup(src, srcLength); - char *buffer_orig = buffer_conv; - const char *to_charset = "UTF-8"; - const char *from_charset = "CP1252"; - iconv_t cd = iconv_open(to_charset, from_charset); - if ((iconv_t)-1 == cd) - { - sint32 error = errno; - switch (error) - { - case EINVAL: - log_error("Unsupported conversion from %s to %s, errno = %d", from_charset, to_charset, error); - break; - default: - log_error("Unknown error while initialising iconv, errno = %d", error); - } - return 0; - } - size_t obl = maxBufferLength; - char *outBuf = dst; - size_t conversion_result = iconv(cd, &buffer_conv, &srcLength, &outBuf, &obl); - if (conversion_result == (size_t)-1) - { - sint32 error = errno; - switch (error) - { - case EILSEQ: - log_error("Encountered invalid sequence"); - break; - case EINVAL: - log_error("Encountered incomplete sequence"); - break; - case E2BIG: - log_error("Ran out of space"); - break; - default: - log_error("Unknown error encountered, errno = %d", error); - } - } - sint32 close_result = iconv_close(cd); - if (close_result == -1) - { - log_error("Failed to close iconv, errno = %d", errno); - } - size_t byte_diff = maxBufferLength - obl + 1; - dst[byte_diff - 1] = '\0'; - //log_warning("converted %s of size %d, %d", dst, byte_diff, strlen(dst)); - sint32 result = byte_diff; - free(buffer_orig); -#endif // _WIN32 - - return result; -} diff --git a/src/openrct2/localisation/Localisation.h b/src/openrct2/localisation/Localisation.h index ccf0d4ef45..b3208a83c3 100644 --- a/src/openrct2/localisation/Localisation.h +++ b/src/openrct2/localisation/Localisation.h @@ -50,9 +50,6 @@ rct_string_id user_string_allocate(sint32 base, const utf8 *text); void user_string_free(rct_string_id id); bool is_user_string_id(rct_string_id stringId); -utf8 *win1252_to_utf8_alloc(const char *src, size_t srcMaxSize); -sint32 win1252_to_utf8(utf8string dst, const char *src, size_t srcLength, size_t maxBufferLength); - wchar_t encoding_convert_rct2_to_unicode(wchar_t rct2str); uint32 encoding_convert_unicode_to_rct2(uint32 unicode); diff --git a/src/openrct2/scenario/ScenarioRepository.cpp b/src/openrct2/scenario/ScenarioRepository.cpp index 31eb0a95bf..49eae21046 100644 --- a/src/openrct2/scenario/ScenarioRepository.cpp +++ b/src/openrct2/scenario/ScenarioRepository.cpp @@ -33,6 +33,7 @@ #include "ScenarioSources.h" #include "../config/Config.h" +#include "../localisation/Language.h" #include "../localisation/Localisation.h" #include "../localisation/LocalisationService.h" #include "../platform/platform.h" @@ -128,7 +129,7 @@ private: static constexpr uint32 MAGIC_NUMBER = 0x58444953; // SIDX static constexpr uint16 VERSION = 3; static constexpr auto PATTERN = "*.sc4;*.sc6"; - + public: explicit ScenarioFileIndex(const IPlatformEnvironment& env) : FileIndex("scenario index", @@ -238,7 +239,7 @@ private: // RCT2 scenario auto fs = FileStream(path, FILE_MODE_OPEN); auto chunkReader = SawyerChunkReader(&fs); - + rct_s6_header header = chunkReader.ReadChunkAs(); if (header.type == S6_TYPE_SCENARIO) { @@ -647,7 +648,8 @@ private: if (scBasic.CompanyValue > highscore->company_value) { SafeFree(highscore->name); - highscore->name = win1252_to_utf8_alloc(scBasic.CompletedBy, Util::CountOf(scBasic.CompletedBy)); + std::string name = rct2_to_utf8(scBasic.CompletedBy, RCT2_LANGUAGE_ID_ENGLISH_UK); + highscore->name = String::Duplicate(name.c_str()); highscore->company_value = scBasic.CompanyValue; highscore->timestamp = DATETIME64_MIN; break; @@ -658,7 +660,8 @@ private: { scenario_highscore_entry * highscore = InsertHighscore(); highscore->fileName = String::Duplicate(scBasic.Path); - highscore->name = win1252_to_utf8_alloc(scBasic.CompletedBy, Util::CountOf(scBasic.CompletedBy)); + std::string name = rct2_to_utf8(scBasic.CompletedBy, RCT2_LANGUAGE_ID_ENGLISH_UK); + highscore->name = String::Duplicate(name.c_str()); highscore->company_value = scBasic.CompanyValue; highscore->timestamp = DATETIME64_MIN; }