740
758
const Firebird::string& configInfo)
742
760
#if defined(WIN_NT)
743
const char* const inTemplate = "icuin%s%s.dll";
744
const char* const ucTemplate = "icuuc%s%s.dll";
761
const char* const inTemplate = "icuin%d%d.dll";
762
const char* const ucTemplate = "icuuc%d%d.dll";
745
763
#elif defined(DARWIN)
746
764
const char* const inTemplate = "/Library/Frameworks/Firebird.framework/Versions/A/Libraries/libicui18n.dylib";
747
765
const char* const ucTemplate = "/Library/Frameworks/Firebird.framework/versions/A/Libraries/libicuuc.dylib";
748
766
#elif defined(HPUX)
749
const char* const inTemplate = "libicui18n.sl.%s%s";
750
const char* const ucTemplate = "libicuuc.sl.%s%s";
767
const char* const inTemplate = "libicui18n.sl.%d%d";
768
const char* const ucTemplate = "libicuuc.sl.%d%d";
752
const char* const inTemplate = "libicui18n.so.%s%s";
753
const char* const ucTemplate = "libicuuc.so.%s%s";
770
const char* const inTemplate = "libicui18n.so.%d%d";
771
const char* const ucTemplate = "libicuuc.so.%d%d";
756
774
ObjectsArray<string> versions;
765
783
for (ObjectsArray<string>::const_iterator i(versions.begin()); i != versions.end(); ++i)
785
int majorVersion, minorVersion;
770
787
if (*i == "default")
772
majorVersion = STRINGIZE(U_ICU_VERSION_MAJOR_NUM);
773
minorVersion = STRINGIZE(U_ICU_VERSION_MINOR_NUM);
777
const size_t pos = i->find('.');
781
majorVersion = i->substr(0, pos);
782
minorVersion = i->substr(pos + 1);
785
if (version != majorVersion + "." + minorVersion)
789
majorVersion = U_ICU_VERSION_MAJOR_NUM;
790
minorVersion = U_ICU_VERSION_MINOR_NUM;
792
else if (sscanf(i->c_str(), "%d.%d", &majorVersion, &minorVersion) != 2)
795
string configVersion;
796
configVersion.printf("%d.%d", majorVersion, minorVersion);
798
if (version != configVersion)
790
801
ReadLockGuard readGuard(icuModules->lock);
793
804
if (icuModules->modules().get(version, icu))
798
807
PathName filename;
799
filename.printf(ucTemplate, majorVersion.c_str(), minorVersion.c_str());
808
filename.printf(ucTemplate, majorVersion, minorVersion);
801
icu = FB_NEW(*getDefaultMemoryPool()) ICU();
810
icu = FB_NEW(*getDefaultMemoryPool()) ICU(majorVersion, minorVersion);
803
812
icu->ucModule = ModuleLoader::loadModule(filename);
804
813
if (!icu->ucModule)
833
symbol.printf("u_init_%s_%s", majorVersion.c_str(), minorVersion.c_str());
834
icu->ucModule->findSymbol(symbol, icu->uInit);
836
symbol.printf("u_versionToString_%s_%s", majorVersion.c_str(), minorVersion.c_str());
837
icu->ucModule->findSymbol(symbol, icu->uVersionToString);
839
symbol.printf("uloc_countAvailable_%s_%s", majorVersion.c_str(), minorVersion.c_str());
840
icu->ucModule->findSymbol(symbol, icu->ulocCountAvailable);
842
symbol.printf("uloc_getAvailable_%s_%s", majorVersion.c_str(), minorVersion.c_str());
843
icu->ucModule->findSymbol(symbol, icu->ulocGetAvailable);
845
symbol.printf("uset_close_%s_%s", majorVersion.c_str(), minorVersion.c_str());
846
icu->ucModule->findSymbol(symbol, icu->usetClose);
848
symbol.printf("uset_getItem_%s_%s", majorVersion.c_str(), minorVersion.c_str());
849
icu->ucModule->findSymbol(symbol, icu->usetGetItem);
851
symbol.printf("uset_getItemCount_%s_%s", majorVersion.c_str(), minorVersion.c_str());
852
icu->ucModule->findSymbol(symbol, icu->usetGetItemCount);
854
symbol.printf("uset_open_%s_%s", majorVersion.c_str(), minorVersion.c_str());
855
icu->ucModule->findSymbol(symbol, icu->usetOpen);
857
symbol.printf("ucol_close_%s_%s", majorVersion.c_str(), minorVersion.c_str());
858
icu->inModule->findSymbol(symbol, icu->ucolClose);
860
symbol.printf("ucol_getContractions_%s_%s", majorVersion.c_str(), minorVersion.c_str());
861
icu->inModule->findSymbol(symbol, icu->ucolGetContractions);
863
symbol.printf("ucol_getSortKey_%s_%s", majorVersion.c_str(), minorVersion.c_str());
864
icu->inModule->findSymbol(symbol, icu->ucolGetSortKey);
866
symbol.printf("ucol_open_%s_%s", majorVersion.c_str(), minorVersion.c_str());
867
icu->inModule->findSymbol(symbol, icu->ucolOpen);
869
symbol.printf("ucol_setAttribute_%s_%s", majorVersion.c_str(), minorVersion.c_str());
870
icu->inModule->findSymbol(symbol, icu->ucolSetAttribute);
872
symbol.printf("ucol_strcoll_%s_%s", majorVersion.c_str(), minorVersion.c_str());
873
icu->inModule->findSymbol(symbol, icu->ucolStrColl);
875
symbol.printf("ucol_getVersion_%s_%s", majorVersion.c_str(), minorVersion.c_str());
876
icu->inModule->findSymbol(symbol, icu->ucolGetVersion);
878
symbol.printf("utrans_open_%s_%s", majorVersion.c_str(), minorVersion.c_str());
879
icu->inModule->findSymbol(symbol, icu->utransOpen);
881
symbol.printf("utrans_close_%s_%s", majorVersion.c_str(), minorVersion.c_str());
882
icu->inModule->findSymbol(symbol, icu->utransClose);
884
symbol.printf("utrans_transUChars_%s_%s", majorVersion.c_str(), minorVersion.c_str());
885
icu->inModule->findSymbol(symbol, icu->utransTransUChars);
840
icu->getEntryPoint("u_init", icu->ucModule, icu->uInit);
841
icu->getEntryPoint("u_versionToString", icu->ucModule, icu->uVersionToString);
842
icu->getEntryPoint("uloc_countAvailable", icu->ucModule, icu->ulocCountAvailable);
843
icu->getEntryPoint("uloc_getAvailable", icu->ucModule, icu->ulocGetAvailable);
844
icu->getEntryPoint("uset_close", icu->ucModule, icu->usetClose);
845
icu->getEntryPoint("uset_getItem", icu->ucModule, icu->usetGetItem);
846
icu->getEntryPoint("uset_getItemCount", icu->ucModule, icu->usetGetItemCount);
847
icu->getEntryPoint("uset_open", icu->ucModule, icu->usetOpen);
849
icu->getEntryPoint("ucol_close", icu->inModule, icu->ucolClose);
850
icu->getEntryPoint("ucol_getContractions", icu->inModule, icu->ucolGetContractions);
851
icu->getEntryPoint("ucol_getSortKey", icu->inModule, icu->ucolGetSortKey);
852
icu->getEntryPoint("ucol_open", icu->inModule, icu->ucolOpen);
853
icu->getEntryPoint("ucol_setAttribute", icu->inModule, icu->ucolSetAttribute);
854
icu->getEntryPoint("ucol_strcoll", icu->inModule, icu->ucolStrColl);
855
icu->getEntryPoint("ucol_getVersion", icu->inModule, icu->ucolGetVersion);
856
icu->getEntryPoint("utrans_open", icu->inModule, icu->utransOpen);
857
icu->getEntryPoint("utrans_close", icu->inModule, icu->utransClose);
858
icu->getEntryPoint("utrans_transUChars", icu->inModule, icu->utransTransUChars);
887
860
if (/*!icu->uInit ||*/ !icu->uVersionToString || !icu->ulocCountAvailable ||
888
861
!icu->ulocGetAvailable || !icu->usetClose || !icu->usetGetItem ||