From: <man...@us...> - 2014-02-28 16:04:38
|
Revision: 3796 http://sourceforge.net/p/modplug/code/3796 Author: manxorist Date: 2014-02-28 16:04:29 +0000 (Fri, 28 Feb 2014) Log Message: ----------- [Mod] libopenmpt: Automatically determine the appropriate character set conversion implementation via preprocessor macros without relying on the build system. [Mod] libopenmpt: Use iconv only on linux by default. Modified Paths: -------------- trunk/OpenMPT/build/android_ndk/Android.mk trunk/OpenMPT/build/make/Makefile.config.defaults trunk/OpenMPT/build/make/Makefile.config.emscripten trunk/OpenMPT/common/BuildSettings.h trunk/OpenMPT/common/mptString.cpp trunk/OpenMPT/common/version.cpp trunk/OpenMPT/libopenmpt/dox/dependencies.md Modified: trunk/OpenMPT/build/android_ndk/Android.mk =================================================================== --- trunk/OpenMPT/build/android_ndk/Android.mk 2014-02-28 14:47:09 UTC (rev 3795) +++ trunk/OpenMPT/build/android_ndk/Android.mk 2014-02-28 16:04:29 UTC (rev 3796) @@ -10,8 +10,8 @@ LOCAL_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/common $(LOCAL_PATH)/common/svn_version_default -LOCAL_CFLAGS := -fvisibility=hidden -DLIBOPENMPT_BUILD -DMPT_CHARSET_CUSTOMUTF8 -DMPT_WITH_ZLIB -LOCAL_CPPFLAGS := -std=c++11 -fvisibility=hidden -DLIBOPENMPT_BUILD -DMPT_CHARSET_CUSTOMUTF8 -DMPT_WITH_ZLIB +LOCAL_CFLAGS := -fvisibility=hidden -DLIBOPENMPT_BUILD -DMPT_WITH_ZLIB +LOCAL_CPPFLAGS := -std=c++11 -fvisibility=hidden -DLIBOPENMPT_BUILD -DMPT_WITH_ZLIB LOCAL_LDLIBS := -lz LOCAL_SRC_FILES := \ Modified: trunk/OpenMPT/build/make/Makefile.config.defaults =================================================================== --- trunk/OpenMPT/build/make/Makefile.config.defaults 2014-02-28 14:47:09 UTC (rev 3795) +++ trunk/OpenMPT/build/make/Makefile.config.defaults 2014-02-28 16:04:29 UTC (rev 3796) @@ -20,12 +20,12 @@ # Mac OS X overrides -CPPFLAGS += -DMPT_CHARSET_CPP DYNLINK=0 # when using iconv -#CPPFLAGS += -DMPT_ICONV_NO_WCHAR +#CPPFLAGS += -DMPT_WITH_ICONV #LDLIBS += -liconv endif endif + Modified: trunk/OpenMPT/build/make/Makefile.config.emscripten =================================================================== --- trunk/OpenMPT/build/make/Makefile.config.emscripten 2014-02-28 14:47:09 UTC (rev 3795) +++ trunk/OpenMPT/build/make/Makefile.config.emscripten 2014-02-28 16:04:29 UTC (rev 3796) @@ -4,7 +4,7 @@ LD = em++ AR = emar -CPPFLAGS += -DMPT_CHARSET_CPP -DMPT_CHARSET_ASSUME_UTF8_LOCALE +CPPFLAGS += CXXFLAGS += -std=c++0x -fPIC CFLAGS += -std=c99 -fPIC LDFLAGS += -O2 -s DISABLE_EXCEPTION_CATCHING=0 Modified: trunk/OpenMPT/common/BuildSettings.h =================================================================== --- trunk/OpenMPT/common/BuildSettings.h 2014-02-28 14:47:09 UTC (rev 3795) +++ trunk/OpenMPT/common/BuildSettings.h 2014-02-28 16:04:29 UTC (rev 3796) @@ -191,6 +191,44 @@ +#if MPT_OS_WINDOWS + +#define MPT_CHARSET_WIN32 + +#elif MPT_OS_LINUX + +#define MPT_CHARSET_ICONV + +#elif MPT_OS_ANDROID + +#define MPT_CHARSET_INTERNAL + +#elif MPT_OS_EMSCRIPTEN + +#define MPT_CHARSET_CODECVTUTF8 +#ifndef MPT_LOCALE_ASSUME_CHARSET +#define MPT_LOCALE_ASSUME_CHARSET CharsetUTF8 +#endif + +#elif MPT_OS_MACOSX_OR_IOS + +#if defined(MPT_WITH_ICONV) +#define MPT_CHARSET_ICONV +#ifndef MPT_ICONV_NO_WCHAR +#define MPT_ICONV_NO_WCHAR +#endif +#else +#define MPT_CHARSET_CODECVTUTF8 +#endif + +#elif defined(MPT_WITH_ICONV) + +#define MPT_CHARSET_ICONV + +#endif + + + // fixing stuff up #if !defined(MODPLUG_TRACKER) && defined(NO_MO3) @@ -219,8 +257,12 @@ #define MODPLUG_NO_FILESAVE // file saving is broken on big endian #endif +#if !defined(MPT_CHARSET_WIN32) && !defined(MPT_CHARSET_ICONV) && !defined(MPT_CHARSET_CODECVTUTF8) && !defined(MPT_CHARSET_INTERNAL) +#define MPT_CHARSET_INTERNAL +#endif + #if MPT_COMPILER_MSVC #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers #endif Modified: trunk/OpenMPT/common/mptString.cpp =================================================================== --- trunk/OpenMPT/common/mptString.cpp 2014-02-28 14:47:09 UTC (rev 3795) +++ trunk/OpenMPT/common/mptString.cpp 2014-02-28 16:04:29 UTC (rev 3796) @@ -10,9 +10,10 @@ #include "stdafx.h" #include "mptString.h" -#if defined(MPT_CHARSET_CPP) +#if defined(MPT_CHARSET_CODECVTUTF8) #include <codecvt> -#elif defined(MPT_CHARSET_CUSTOMUTF8) +#endif +#if defined(MPT_CHARSET_INTERNAL) #include <cstdlib> #endif #include <iomanip> @@ -29,9 +30,9 @@ #include <strings.h> // for strncasecmp #endif -#if !defined(MPT_CHARSET_CPP) && !defined(MPT_CHARSET_CUSTOMUTF8) && !defined(WIN32) +#if defined(MPT_CHARSET_ICONV) #include <iconv.h> -#endif // !WIN32 +#endif namespace mpt { @@ -108,7 +109,7 @@ }; */ -#if defined(MPT_CHARSET_CPP) || defined(MPT_CHARSET_CUSTOMUTF8) +#if defined(MPT_CHARSET_CODECVTUTF8) || defined(MPT_CHARSET_INTERNAL) static const uint32 CharsetTableISO8859_15[256] = { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f, @@ -167,8 +168,9 @@ 0x2261,0x00b1,0x2265,0x2264,0x2320,0x2321,0x00f7,0x2248,0x00b0,0x2219,0x00b7,0x221a,0x207f,0x00b2,0x25a0,0x00a0 }; -#endif +#endif // MPT_CHARSET_CODECVTUTF8 || MPT_CHARSET_INTERNAL + #define C(x) ((uint8)(x)) // AMS1 actually only supports ASCII plus the modified control characters and no high chars at all. @@ -277,7 +279,7 @@ return res; } -#if defined(MPT_CHARSET_CPP) || defined(MPT_CHARSET_CUSTOMUTF8) +#if defined(MPT_CHARSET_CODECVTUTF8) || defined(MPT_CHARSET_INTERNAL) static std::wstring FromAscii(const std::string &str, wchar_t replacement = L'\uFFFD') //------------------------------------------------------------------------------------ @@ -496,8 +498,10 @@ return String::ToAscii(str, replacement); // fallback } -#if defined(MPT_CHARSET_CPP) +#endif // MPT_CHARSET_CODECVTUTF8 || MPT_CHARSET_INTERNAL +#if defined(MPT_CHARSET_CODECVTUTF8) + static std::wstring FromUTF8(const std::string &str, wchar_t replacement = L'\uFFFD') //----------------------------------------------------------------------------------- { @@ -514,8 +518,10 @@ return conv.to_bytes(str); } -#elif defined(MPT_CHARSET_CUSTOMUTF8) +#endif // MPT_CHARSET_CODECVTUTF8 +#if defined(MPT_CHARSET_INTERNAL) + static std::wstring FromUTF8(const std::string &str, wchar_t replacement = L'\uFFFD') //----------------------------------------------------------------------------------- { @@ -673,9 +679,10 @@ } -#endif // MPT_CHARSET_CPP || MPT_CHARSET_CUSTOMUTF8 +#endif // MPT_CHARSET_INTERNAL -#elif defined(WIN32) +#if defined(MPT_CHARSET_WIN32) + static UINT CharsetToCodepage(Charset charset) { switch(charset) @@ -692,7 +699,11 @@ } return 0; } -#else // !WIN32 + +#endif // MPT_CHARSET_WIN32 + +#if defined(MPT_CHARSET_ICONV) + static const char * CharsetToString(Charset charset) { switch(charset) @@ -709,6 +720,7 @@ } return 0; } + static const char * CharsetToStringTranslit(Charset charset) { switch(charset) @@ -725,6 +737,7 @@ } return 0; } + static const char * Charset_wchar_t() { #if !defined(MPT_ICONV_NO_WCHAR) @@ -756,9 +769,10 @@ return ""; #endif // !MPT_ICONV_NO_WCHAR | MPT_ICONV_NO_WCHAR } -#endif // WIN32 +#endif // MPT_CHARSET_ICONV + // templated on 8bit strings because of type-safe variants template<typename Tdststring> Tdststring EncodeImpl(Charset charset, const std::wstring &src) @@ -773,30 +787,13 @@ std::copy(out.begin(), out.end(), std::back_inserter(result)); return result; } - #if defined(MPT_CHARSET_ASSUME_UTF8_LOCALE) + #if defined(MPT_LOCALE_ASSUME_CHARSET) if(charset == CharsetLocale) { - charset = CharsetUTF8; + charset = MPT_LOCALE_ASSUME_CHARSET; } #endif - #if defined(MPT_CHARSET_CPP) || defined(MPT_CHARSET_CUSTOMUTF8) - std::string out; - switch(charset) - { - case CharsetLocale: out = String::ToLocale(src); break; - case CharsetUTF8: out = String::ToUTF8(src); break; - case CharsetASCII: out = String::ToAscii(src); break; - case CharsetISO8859_1: out = String::ToISO_8859_1(src); break; - case CharsetISO8859_15: out = String::To8bit(src, CharsetTableISO8859_15); break; - case CharsetCP437: out = String::To8bit(src, CharsetTableCP437); break; - case CharsetCP437AMS: out = String::To8bit(src, CharsetTableCP437AMS); break; - case CharsetCP437AMS2: out = String::To8bit(src, CharsetTableCP437AMS2); break; - case CharsetWindows1252: out = String::To8bit(src, CharsetTableWindows1252); break; - } - Tdststring result; - std::copy(out.begin(), out.end(), std::back_inserter(result)); - return result; - #elif defined(WIN32) + #if defined(MPT_CHARSET_WIN32) const UINT codepage = CharsetToCodepage(charset); int required_size = WideCharToMultiByte(codepage, 0, src.c_str(), -1, nullptr, 0, nullptr, nullptr); if(required_size <= 0) @@ -806,7 +803,7 @@ std::vector<CHAR> encoded_string(required_size); WideCharToMultiByte(codepage, 0, src.c_str(), -1, &encoded_string[0], required_size, nullptr, nullptr); return reinterpret_cast<const typename Tdststring::value_type*>(&encoded_string[0]); - #else // !WIN32 + #elif defined(MPT_CHARSET_ICONV) iconv_t conv = iconv_t(); conv = iconv_open(CharsetToStringTranslit(charset), Charset_wchar_t()); if(!conv) @@ -843,7 +840,24 @@ iconv_close(conv); conv = iconv_t(); return reinterpret_cast<const typename Tdststring::value_type*>(&encoded_string[0]); - #endif // WIN32 + #else + std::string out; + switch(charset) + { + case CharsetLocale: out = String::ToLocale(src); break; + case CharsetUTF8: out = String::ToUTF8(src); break; + case CharsetASCII: out = String::ToAscii(src); break; + case CharsetISO8859_1: out = String::ToISO_8859_1(src); break; + case CharsetISO8859_15: out = String::To8bit(src, CharsetTableISO8859_15); break; + case CharsetCP437: out = String::To8bit(src, CharsetTableCP437); break; + case CharsetCP437AMS: out = String::To8bit(src, CharsetTableCP437AMS); break; + case CharsetCP437AMS2: out = String::To8bit(src, CharsetTableCP437AMS2); break; + case CharsetWindows1252: out = String::To8bit(src, CharsetTableWindows1252); break; + } + Tdststring result; + std::copy(out.begin(), out.end(), std::back_inserter(result)); + return result; + #endif } @@ -861,30 +875,13 @@ if(charset == CharsetCP437AMS2) out = String::From8bit(in, CharsetTableCP437AMS2); return out; } - #if defined(MPT_CHARSET_ASSUME_UTF8_LOCALE) + #if defined(MPT_LOCALE_ASSUME_CHARSET) if(charset == CharsetLocale) { - charset = CharsetUTF8; + charset = MPT_LOCALE_ASSUME_CHARSET; } #endif - #if defined(MPT_CHARSET_CPP) || defined(MPT_CHARSET_CUSTOMUTF8) - std::string in; - std::copy(src.begin(), src.end(), std::back_inserter(in)); - std::wstring out; - switch(charset) - { - case CharsetLocale: out = String::FromLocale(in); break; - case CharsetUTF8: out = String::FromUTF8(in); break; - case CharsetASCII: out = String::FromAscii(in); break; - case CharsetISO8859_1: out = String::FromISO_8859_1(in); break; - case CharsetISO8859_15: out = String::From8bit(in, CharsetTableISO8859_15); break; - case CharsetCP437: out = String::From8bit(in, CharsetTableCP437); break; - case CharsetCP437AMS: out = String::From8bit(in, CharsetTableCP437AMS); break; - case CharsetCP437AMS2: out = String::From8bit(in, CharsetTableCP437AMS2); break; - case CharsetWindows1252: out = String::From8bit(in, CharsetTableWindows1252); break; - } - return out; - #elif defined(WIN32) + #if defined(MPT_CHARSET_WIN32) const UINT codepage = CharsetToCodepage(charset); int required_size = MultiByteToWideChar(codepage, 0, reinterpret_cast<const char*>(src.c_str()), -1, nullptr, 0); if(required_size <= 0) @@ -894,7 +891,7 @@ std::vector<WCHAR> decoded_string(required_size); MultiByteToWideChar(codepage, 0, reinterpret_cast<const char*>(src.c_str()), -1, &decoded_string[0], required_size); return &decoded_string[0]; - #else // !WIN32 + #elif defined(MPT_CHARSET_ICONV) iconv_t conv = iconv_t(); conv = iconv_open(Charset_wchar_t(), CharsetToString(charset)); if(!conv) @@ -935,7 +932,24 @@ iconv_close(conv); conv = iconv_t(); return &wide_string[0]; - #endif // WIN32 + #else + std::string in; + std::copy(src.begin(), src.end(), std::back_inserter(in)); + std::wstring out; + switch(charset) + { + case CharsetLocale: out = String::FromLocale(in); break; + case CharsetUTF8: out = String::FromUTF8(in); break; + case CharsetASCII: out = String::FromAscii(in); break; + case CharsetISO8859_1: out = String::FromISO_8859_1(in); break; + case CharsetISO8859_15: out = String::From8bit(in, CharsetTableISO8859_15); break; + case CharsetCP437: out = String::From8bit(in, CharsetTableCP437); break; + case CharsetCP437AMS: out = String::From8bit(in, CharsetTableCP437AMS); break; + case CharsetCP437AMS2: out = String::From8bit(in, CharsetTableCP437AMS2); break; + case CharsetWindows1252: out = String::From8bit(in, CharsetTableWindows1252); break; + } + return out; + #endif } @@ -949,9 +963,7 @@ { return Tdststring(reinterpret_cast<const typename Tdststring::value_type*>(&*src.begin()), reinterpret_cast<const typename Tdststring::value_type*>(&*src.end())); } - #if defined(MPT_CHARSET_CPP) || defined(MPT_CHARSET_CUSTOMUTF8) || defined(WIN32) - return EncodeImpl<Tdststring>(to, DecodeImpl(from, src)); - #else // !WIN32 + #if defined(MPT_CHARSET_ICONV) if(to == CharsetCP437AMS || to == CharsetCP437AMS2 || from == CharsetCP437AMS || from == CharsetCP437AMS2) { return EncodeImpl<Tdststring>(to, DecodeImpl(from, src)); @@ -992,7 +1004,9 @@ iconv_close(conv); conv = iconv_t(); return reinterpret_cast<const typename Tdststring::value_type*>(&dst_string[0]); - #endif // WIN32 + #else + return EncodeImpl<Tdststring>(to, DecodeImpl(from, src)); + #endif } Modified: trunk/OpenMPT/common/version.cpp =================================================================== --- trunk/OpenMPT/common/version.cpp 2014-02-28 14:47:09 UTC (rev 3795) +++ trunk/OpenMPT/common/version.cpp 2014-02-28 16:04:29 UTC (rev 3796) @@ -197,14 +197,14 @@ #else retval += "*unknown"; #endif - #if defined(WIN32) + #if defined(MPT_CHARSET_WIN32) retval += " +WINAPI"; - #elif defined(MPT_CHARSET_CPP) - retval += " +CODECVT"; - #elif defined(MPT_CHARSET_CUSTOMUTF8) - retval += " +CUSTOMUTF8"; - #else + #elif defined(MPT_CHARSET_ICONV) retval += " +ICONV"; + #elif defined(MPT_CHARSET_CODECVTUTF8) + retval += " +CODECVTUTF8"; + #elif defined(MPT_CHARSET_INTERNAL) + retval += " +INTERNALCHARSETS"; #endif #if !defined(NO_ZLIB) retval += " +ZLIB"; Modified: trunk/OpenMPT/libopenmpt/dox/dependencies.md =================================================================== --- trunk/OpenMPT/libopenmpt/dox/dependencies.md 2014-02-28 14:47:09 UTC (rev 3795) +++ trunk/OpenMPT/libopenmpt/dox/dependencies.md 2014-02-28 16:04:29 UTC (rev 3796) @@ -16,10 +16,6 @@ * Required compilers to use libopenmpt: * Any **C89** compatible compiler should work with the C API as long as a C99 compatible **stdint.h** is available. * Any **C++03** compatible compiler should work with the C++ API. - * Character set conversion requires one of: - * **Win32** - * **iconv** - * a **C++11** compliant compiler * **J2B** support requires a inflate (deflate decompression) implementation: * **zlib** * **miniz** can be used internally if no zlib is available. @@ -48,6 +44,11 @@ ### libopenmpt + * Character set conversion can use one of: + * **Win32** + * **iconv** + * **C++11** codecvt_utf8 + instead of the internal conversion tables and functions. * **MO3** support requires the closed-source **unmo3** library. * **doxygen 1.8** or higher is required to build the documentation. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |