From bf51754668b1dbf53f9f1fbbee2558c6210826d5 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Mon, 29 Jun 2015 02:39:22 -0400 Subject: [PATCH] Fix *BSD build with GNU iconv --- src/CMakeLists.txt | 9 ++++++++- src/util/string.cpp | 41 ++++++++++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e2f555860..0ed0b8015 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -249,11 +249,18 @@ else() else() set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS}) endif(APPLE) - #set(CLIENT_PLATFORM_LIBS -lXxf86vm) + # This way Xxf86vm is found on OpenBSD too find_library(XXF86VM_LIBRARY Xxf86vm) mark_as_advanced(XXF86VM_LIBRARY) set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY}) + + # Prefer local iconv if installed + find_library(ICONV_LIBRARY iconv) + mark_as_advanced(ICONV_LIBRARY) + if (ICONV_LIBRARY) + set(PLATFORM_LIBS ${PLATFORM_LIBS} ${ICONV_LIBRARY}) + endif() endif() check_include_files(endian.h HAVE_ENDIAN_H) diff --git a/src/util/string.cpp b/src/util/string.cpp index 36a9481c5..187d2a078 100644 --- a/src/util/string.cpp +++ b/src/util/string.cpp @@ -30,22 +30,28 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #ifndef _WIN32 -#include + #include #else -#define _WIN32_WINNT 0x0501 -#include + #define _WIN32_WINNT 0x0501 + #include +#endif + +#if defined(_ICONV_H_) && (defined(__FreeBSD__) || defined(__NetBSD__) || \ + defined(__OpenBSD__) || defined(__DragonFly__)) + #define BSD_ICONV_USED #endif static bool parseHexColorString(const std::string &value, video::SColor &color); static bool parseNamedColorString(const std::string &value, video::SColor &color); #ifndef _WIN32 + bool convert(const char *to, const char *from, char *outbuf, size_t outbuf_size, char *inbuf, size_t inbuf_size) { iconv_t cd = iconv_open(to, from); -#if defined(__FreeBSD__) || defined(__FreeBSD) +#ifdef BSD_ICONV_USED const char *inbuf_ptr = inbuf; #else char *inbuf_ptr = inbuf; @@ -88,7 +94,7 @@ std::wstring utf8_to_wide(const std::string &input) delete[] outbuf; return L""; } - std::wstring out((wchar_t*)outbuf); + std::wstring out((wchar_t *)outbuf); delete[] inbuf; delete[] outbuf; @@ -97,12 +103,15 @@ std::wstring utf8_to_wide(const std::string &input) } #ifdef __ANDROID__ + // TODO: this is an ugly fix for wide_to_utf8 somehow not working on android std::string wide_to_utf8(const std::wstring &input) { return wide_to_narrow(input); } -#else + +#else // __ANDROID__ + std::string wide_to_utf8(const std::wstring &input) { size_t inbuf_size = (input.length() + 1) * sizeof(wchar_t); @@ -128,14 +137,18 @@ std::string wide_to_utf8(const std::wstring &input) return out; } -#endif -#else + +#endif // __ANDROID__ + +#else // _WIN32 + std::wstring utf8_to_wide(const std::string &input) { size_t outbuf_size = input.size() + 1; wchar_t *outbuf = new wchar_t[outbuf_size]; memset(outbuf, 0, outbuf_size * sizeof(wchar_t)); - MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), outbuf, outbuf_size); + MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), + outbuf, outbuf_size); std::wstring out(outbuf); delete[] outbuf; return out; @@ -146,18 +159,20 @@ std::string wide_to_utf8(const std::wstring &input) size_t outbuf_size = (input.size() + 1) * 6; char *outbuf = new char[outbuf_size]; memset(outbuf, 0, outbuf_size); - WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), outbuf, outbuf_size, NULL, NULL); + WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), + outbuf, outbuf_size, NULL, NULL); std::string out(outbuf); delete[] outbuf; return out; } -#endif + +#endif // _WIN32 // You must free the returned string! // The returned string is allocated using new wchar_t *narrow_to_wide_c(const char *str) { - wchar_t* nstr = 0; + wchar_t *nstr = NULL; #if defined(_WIN32) int nResult = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) str, -1, 0, 0); if (nResult == 0) { @@ -168,7 +183,7 @@ wchar_t *narrow_to_wide_c(const char *str) } #else size_t len = strlen(str); - nstr = new wchar_t[len+1]; + nstr = new wchar_t[len + 1]; std::wstring intermediate = narrow_to_wide(str); memset(nstr, 0, (len + 1) * sizeof(wchar_t));