From: <man...@us...> - 2013-11-09 13:29:11
|
Revision: 3144 http://sourceforge.net/p/modplug/code/3144 Author: manxorist Date: 2013-11-09 13:29:02 +0000 (Sat, 09 Nov 2013) Log Message: ----------- [Fix] Fix CharsetLocale for non-windows. [Imp] Add very basic charset conversion sanity check test cases. Modified Paths: -------------- trunk/OpenMPT/common/mptString.cpp trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/common/mptString.cpp =================================================================== --- trunk/OpenMPT/common/mptString.cpp 2013-11-09 12:40:56 UTC (rev 3143) +++ trunk/OpenMPT/common/mptString.cpp 2013-11-09 13:29:02 UTC (rev 3144) @@ -10,6 +10,7 @@ #include "stdafx.h" #include "mptString.h" +#include <stdexcept> #include <vector> #include <cstdarg> @@ -68,7 +69,7 @@ { switch(charset) { - case CharsetLocale: return "char"; break; + case CharsetLocale: return ""; break; // "char" breaks with glibc when no locale is set case CharsetUTF8: return "UTF-8"; break; case CharsetUS_ASCII: return "ASCII"; break; case CharsetISO8859_1: return "ISO-8859-1"; break; @@ -96,6 +97,10 @@ #else // !WIN32 iconv_t conv = iconv_t(); conv = iconv_open(CharsetToString(charset), "wchar_t"); + if(!conv) + { + throw std::runtime_error("iconv conversion not working"); + } std::vector<wchar_t> wide_string(src.c_str(), src.c_str() + src.length() + 1); std::vector<char> encoded_string(wide_string.size() * 8); // large enough char * inbuf = (char*)&wide_string[0]; @@ -130,6 +135,10 @@ #else // !WIN32 iconv_t conv = iconv_t(); conv = iconv_open("wchar_t", CharsetToString(charset)); + if(!conv) + { + throw std::runtime_error("iconv conversion not working"); + } std::vector<char> encoded_string(src.c_str(), src.c_str() + src.length() + 1); std::vector<wchar_t> wide_string(encoded_string.size() * 8); // large enough char * inbuf = &encoded_string[0]; @@ -156,6 +165,10 @@ #else // !WIN32 iconv_t conv = iconv_t(); conv = iconv_open(CharsetToString(to), CharsetToString(from)); + if(!conv) + { + throw std::runtime_error("iconv conversion not working"); + } std::vector<char> src_string(src.c_str(), src.c_str() + src.length() + 1); std::vector<char> dst_string(src_string.size() * 8); // large enough char * inbuf = &src_string[0]; Modified: trunk/OpenMPT/test/test.cpp =================================================================== --- trunk/OpenMPT/test/test.cpp 2013-11-09 12:40:56 UTC (rev 3143) +++ trunk/OpenMPT/test/test.cpp 2013-11-09 13:29:02 UTC (rev 3144) @@ -572,6 +572,16 @@ VERIFY_EQUAL(strlen(ModSpecs::Collection[i]->commands), MAX_EFFECTS); VERIFY_EQUAL(strlen(ModSpecs::Collection[i]->volcommands), MAX_VOLCMDS); } + + // Charset conversions (basic sanity checks) + VERIFY_EQUAL(mpt::String::Encode(L"a", mpt::CharsetLocale), "a"); + VERIFY_EQUAL(mpt::String::Encode(L"a", mpt::CharsetUTF8), "a"); + VERIFY_EQUAL(mpt::String::Encode(L"a", mpt::CharsetISO8859_1), "a"); + VERIFY_EQUAL(mpt::String::Encode(L"a", mpt::CharsetUS_ASCII), "a"); + VERIFY_EQUAL(mpt::String::Decode("a", mpt::CharsetLocale), L"a"); + VERIFY_EQUAL(mpt::String::Decode("a", mpt::CharsetUTF8), L"a"); + VERIFY_EQUAL(mpt::String::Decode("a", mpt::CharsetISO8859_1), L"a"); + VERIFY_EQUAL(mpt::String::Decode("a", mpt::CharsetUS_ASCII), L"a"); // Path conversions #ifdef MODPLUG_TRACKER This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |