--- src/jrd/unicode_util.cpp 2012/10/12 09:56:14 57235 +++ src/jrd/unicode_util.cpp 2012/10/12 21:20:30 57236 @@ -42,6 +42,9 @@ #include "unicode/ucnv.h" #include "unicode/ucol.h" +// The next major ICU version after 4.8 is 49. +#define ICU_NEW_VERSION_MEANING 49 + using namespace Firebird; @@ -49,8 +52,16 @@ namespace Jrd { +#if U_ICU_VERSION_MAJOR_NUM >= ICU_NEW_VERSION_MEANING +const char* const UnicodeUtil::DEFAULT_ICU_VERSION = STRINGIZE(U_ICU_VERSION_MAJOR_NUM); +#else const char* const UnicodeUtil::DEFAULT_ICU_VERSION = STRINGIZE(U_ICU_VERSION_MAJOR_NUM)"."STRINGIZE(U_ICU_VERSION_MINOR_NUM); +#endif + + +static void formatFilename(PathName& filename, const char* templateName, + int majorVersion, int minorVersion); // encapsulate ICU collations libraries @@ -79,6 +90,11 @@ { string symbol; + symbol.printf("%s_%d", name, majorVersion); + module->findSymbol(symbol, ptr); + if (ptr) + return; + symbol.printf("%s_%d_%d", name, majorVersion, minorVersion); module->findSymbol(symbol, ptr); if (ptr) @@ -157,14 +173,25 @@ RWLock lock; }; -namespace { - GlobalPtr icuModules; -} +static GlobalPtr icuModules; static const char* const COLL_30_VERSION = "41.128.4.4"; // ICU 3.0 collator version +static void formatFilename(PathName& filename, const char* templateName, + int majorVersion, int minorVersion) +{ + string s; + if (majorVersion >= ICU_NEW_VERSION_MEANING) + s.printf("%d", majorVersion); + else + s.printf("%d%d", majorVersion, minorVersion); + + filename.printf(templateName, s.c_str()); +} + + static void getVersions(const string& configInfo, ObjectsArray& versions) { charset cs; @@ -758,17 +785,17 @@ const Firebird::string& configInfo) { #if defined(WIN_NT) - const char* const inTemplate = "icuin%d%d.dll"; - const char* const ucTemplate = "icuuc%d%d.dll"; + const char* const inTemplate = "icuin%s.dll"; + const char* const ucTemplate = "icuuc%s.dll"; #elif defined(DARWIN) const char* const inTemplate = "/Library/Frameworks/Firebird.framework/Versions/A/Libraries/libicui18n.dylib"; const char* const ucTemplate = "/Library/Frameworks/Firebird.framework/versions/A/Libraries/libicuuc.dylib"; #elif defined(HPUX) - const char* const inTemplate = "libicui18n.sl.%d%d"; - const char* const ucTemplate = "libicuuc.sl.%d%d"; + const char* const inTemplate = "libicui18n.sl.%s"; + const char* const ucTemplate = "libicuuc.sl.%s"; #else - const char* const inTemplate = "libicui18n.so.%d%d"; - const char* const ucTemplate = "libicuuc.so.%d%d"; + const char* const inTemplate = "libicui18n.so.%s"; + const char* const ucTemplate = "libicuuc.so.%s"; #endif ObjectsArray versions; @@ -776,24 +803,28 @@ string version = icuVersion.isEmpty() ? versions[0] : icuVersion; if (version == "default") - { - version.printf("%d.%d", U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM); - } + version = DEFAULT_ICU_VERSION; for (ObjectsArray::const_iterator i(versions.begin()); i != versions.end(); ++i) { int majorVersion, minorVersion; + int n = sscanf((*i == "default" ? version : *i).c_str(), "%d.%d", + &majorVersion, &minorVersion); - if (*i == "default") - { - majorVersion = U_ICU_VERSION_MAJOR_NUM; - minorVersion = U_ICU_VERSION_MINOR_NUM; - } - else if (sscanf(i->c_str(), "%d.%d", &majorVersion, &minorVersion) != 2) + if (n == 1) + minorVersion = 0; + else if (n != 2) continue; string configVersion; - configVersion.printf("%d.%d", majorVersion, minorVersion); + + if (majorVersion >= ICU_NEW_VERSION_MEANING) + { + minorVersion = 0; + configVersion.printf("%d", majorVersion); + } + else + configVersion.printf("%d.%d", majorVersion, minorVersion); if (version != configVersion) continue; @@ -805,7 +836,7 @@ return icu; PathName filename; - filename.printf(ucTemplate, majorVersion, minorVersion); + formatFilename(filename, ucTemplate, majorVersion, minorVersion); icu = FB_NEW(*getDefaultMemoryPool()) ICU(majorVersion, minorVersion); @@ -822,7 +853,7 @@ continue; } - filename.printf(inTemplate, majorVersion, minorVersion); + formatFilename(filename, inTemplate, majorVersion, minorVersion); icu->inModule = ModuleLoader::loadModule(filename); if (!icu->inModule)