summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2023-04-12 22:15:04 +0200
committerStephan Bergmann <sbergman@redhat.com>2023-04-13 08:23:59 +0200
commit852af3af0dde3810e323afc3d42d7bd1cd4e67bc (patch)
treeb63286521161b11953b1b04e3f60f3f73f0d250d
parentcbdd54e41a78e6a567d7ff97935721b07461cce5 (diff)
Fix UBSan function-type-mismatch
...as seen with the additions to CppunitTest_i18npool_transliteration made here, > i18npool/source/transliteration/textToPronounce_zh.cxx:175:17: runtime error: call to function get_zh_zhuyin through pointer to incorrect function type 'unsigned short **(*)()' > workdir/CustomTarget/i18npool/indexentry/zh_zhuyin.cxx:1512: note: get_zh_zhuyin defined here > #0 in i18npool::TextToPronounce_zh::TextToPronounce_zh(char const*) at i18npool/source/transliteration/textToPronounce_zh.cxx:175:17 > #1 in i18npool::TextToChuyin_zh_TW::TextToChuyin_zh_TW() at i18npool/source/transliteration/textToPronounce_zh.cxx:149:5 > #2 in TextToChuyin_zh_TW_CreateInstance(com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> const&) at i18npool/source/registerservices/registerservices.cxx:236:1 > #3 in cppu::(anonymous namespace)::OFactoryComponentHelper::createInstanceEveryTime(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&) at cppuhelper/source/factory.cxx:173:24 > #4 in cppu::(anonymous namespace)::OFactoryComponentHelper::createInstanceWithContext(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&) at cppuhelper/source/factory.cxx:230:12 > #5 in non-virtual thunk to cppu::(anonymous namespace)::OFactoryComponentHelper::createInstanceWithContext(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&) at cppuhelper/source/factory.cxx > #6 in cppuhelper::ServiceManager::Data::Implementation::doCreateInstance(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&) at cppuhelper/source/servicemanager.cxx:709:26 > #7 in cppuhelper::ServiceManager::Data::Implementation::createInstance(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, bool) at cppuhelper/source/servicemanager.cxx:675:16 > #8 in cppuhelper::ServiceManager::createInstanceWithContext(rtl::OUString const&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&) at cppuhelper/source/servicemanager.cxx:1006:36 > #9 in non-virtual thunk to cppuhelper::ServiceManager::createInstanceWithContext(rtl::OUString const&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&) at cppuhelper/source/servicemanager.cxx > #10 in i18npool::TransliterationImpl::loadBody(rtl::OUString const&, com::sun::star::uno::Reference<com::sun::star::i18n::XExtendedTransliteration>&) at i18npool/source/transliteration/transliterationImpl.cxx:619:45 > #11 in i18npool::TransliterationImpl::loadModuleByName(std::basic_string_view<char16_t, std::char_traits<char16_t>>, com::sun::star::uno::Reference<com::sun::star::i18n::XExtendedTransliteration>&, com::sun::star::lang::Locale const&) at i18npool/source/transliteration/transliterationImpl.cxx:630:5 > #12 in i18npool::TransliterationImpl::loadModuleByImplName(rtl::OUString const&, com::sun::star::lang::Locale const&) at i18npool/source/transliteration/transliterationImpl.cxx:278:9 > #13 in (anonymous namespace)::Transliteration::testTextToChuyin_zh_TW() at i18npool/qa/cppunit/transliteration.cxx:120:27 For one, there had always been a mismatch between the return type `const sal_uInt16**` generated in i18npool/source/indexentry/genindex_data.cxx since d319c4611e932b286c0bef14387382da0f2e92d2 "INTEGRATION: CWS i18n24 (1.1.2); FILE ADDED" vs. `sal_uInt16**` used in i18npool/source/transliteration/textToPronounce_zh.cxx since f4705bf0a3efeebfe74568abb355ad60621300dd "INTEGRATION: CWS i18n24 (1.8.36); FILE MERGED". And for another (and more severe, as it caused random writes), there had also been a mismatch between the parameters `(sal_Int16 &max_index)` newly generated in i18npool/source/indexentry/genindex_data.cxx since 7696cd3902ca248951205f15930787488368ea26 "INTEGRATION: CWS i18n31 (1.4.60); FILE MERGED" (and correctly used in i18npool/source/indexentry/indexentrysupplier_asian.cxx since 58dcf0ffaf8668827fc2f47445c9d8faf3d29555 "INTEGRATION: CWS i18n31 (1.9.60); FILE MERGED") vs. the original `()` used in i18npool/source/transliteration/textToPronounce_zh.cxx ever since f4705bf0a3efeebfe74568abb355ad60621300dd "INTEGRATION: CWS i18n24 (1.8.36); FILE MERGED". For DISABLE_DYNLOADING, the second (missing max_index parameter) issue appears to have been broken even further with 9db03b879b912d79060ab06f03a54d4a59e6ac65 "i18npool: fix wrong static function symbols", replacing the wrong sal_uInt16** get_zh_zhuyin(); sal_uInt16** get_zh_pinyin(); declarations in i18npool/source/transliteration/textToPronounce_zh.cxx with the even worse declarations sal_uInt16** get_collator_data_zh_zhuyin(); sal_uInt16** get_collator_data_zh_pinyin(); corresponding to function definitions generated by i18npool/source/collator/gencoll_rule.cxx (which also happen to have zero parameters, but non-matching return types, and apparently completely different collation vs. transliteration semantics). Change-Id: Id91b17eeb7fcdd0c711d52a624375356dc47fc32 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150302 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
-rw-r--r--i18npool/CppunitTest_i18npool_transliteration.mk2
-rw-r--r--i18npool/inc/textToPronounce_zh.hxx4
-rw-r--r--i18npool/qa/cppunit/transliteration.cxx224
-rw-r--r--i18npool/source/transliteration/textToPronounce_zh.cxx19
4 files changed, 161 insertions, 88 deletions
diff --git a/i18npool/CppunitTest_i18npool_transliteration.mk b/i18npool/CppunitTest_i18npool_transliteration.mk
index 37dddcda0ae2..6c9f71916fef 100644
--- a/i18npool/CppunitTest_i18npool_transliteration.mk
+++ b/i18npool/CppunitTest_i18npool_transliteration.mk
@@ -27,4 +27,6 @@ $(eval $(call gb_CppunitTest_use_sdk_api,i18npool_transliteration))
$(eval $(call gb_CppunitTest_use_ure,i18npool_transliteration))
+$(call gb_CppunitTest_get_target,i18npool_transliteration): $(call gb_Library_get_target,index_data)
+
# vim: set noet sw=4 ts=4:
diff --git a/i18npool/inc/textToPronounce_zh.hxx b/i18npool/inc/textToPronounce_zh.hxx
index 2ac854abddbd..b34398e608f8 100644
--- a/i18npool/inc/textToPronounce_zh.hxx
+++ b/i18npool/inc/textToPronounce_zh.hxx
@@ -30,14 +30,14 @@ protected:
#ifndef DISABLE_DYNLOADING
oslModule hModule;
#endif
- sal_uInt16 **idx;
+ sal_uInt16 const **idx;
const sal_Unicode* getPronounce(const sal_Unicode ch);
public:
#ifndef DISABLE_DYNLOADING
TextToPronounce_zh(const char* func_name);
#else
- TextToPronounce_zh(sal_uInt16 ** (*function)());
+ TextToPronounce_zh(sal_uInt16 const ** (*function)(sal_Int16 &));
#endif
virtual ~TextToPronounce_zh() override;
diff --git a/i18npool/qa/cppunit/transliteration.cxx b/i18npool/qa/cppunit/transliteration.cxx
index 712a3c02244a..cc8eccfbb5c2 100644
--- a/i18npool/qa/cppunit/transliteration.cxx
+++ b/i18npool/qa/cppunit/transliteration.cxx
@@ -15,6 +15,8 @@
#include <com/sun/star/i18n/Transliteration.hpp>
#include <com/sun/star/i18n/TransliterationModulesNew.hpp>
+#include <com/sun/star/i18n/XExtendedTransliteration.hpp>
+#include <com/sun/star/uno/Reference.hxx>
#include <cppuhelper/bootstrap.hxx>
namespace
@@ -22,96 +24,164 @@ namespace
class Transliteration : public CppUnit::TestFixture
{
public:
- void testLoadModuleNew()
+ void setUp()
{
- auto const trans
+ transliteration_
= css::i18n::Transliteration::create(cppu::defaultBootstrap_InitialComponentContext());
+ }
+
+ void testLoadModuleNew()
+ {
// Verify that loading succeeds without throwing an exception, for each possible
// TransliterationModulesNew value (TODO: there is an upper limit of maxCascade 27 in
// i18npool/inc/transliterationImpl.hxx for the length of the passed
// TransliterationModulesNew value, so pass each one individually rather than all 65 at
// once):
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_UPPERCASE_LOWERCASE }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_LOWERCASE_UPPERCASE }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_HALFWIDTH_FULLWIDTH }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_FULLWIDTH_HALFWIDTH }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_KATAKANA_HIRAGANA }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_HIRAGANA_KATAKANA }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IGNORE_CASE }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IGNORE_KANA }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IGNORE_WIDTH }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreTraditionalKanji_ja_JP },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreTraditionalKana_ja_JP },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreMinusSign_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreIterationMark_ja_JP },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreSeparator_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreZiZu_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreBaFa_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreTiJi_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreHyuByu_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreSeZe_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreIandEfollowedByYa_ja_JP },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreKiKuFollowedBySa_ja_JP },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreSize_ja_JP }, {});
- trans->loadModuleNew(
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_UPPERCASE_LOWERCASE }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_LOWERCASE_UPPERCASE }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_HALFWIDTH_FULLWIDTH }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_FULLWIDTH_HALFWIDTH }, {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_KATAKANA_HIRAGANA },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_HIRAGANA_KATAKANA },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_IGNORE_CASE }, {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_IGNORE_KANA }, {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_IGNORE_WIDTH }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_IgnoreTraditionalKanji_ja_JP }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_IgnoreTraditionalKana_ja_JP }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_IgnoreMinusSign_ja_JP }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_IgnoreIterationMark_ja_JP }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_IgnoreSeparator_ja_JP }, {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreZiZu_ja_JP },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreBaFa_ja_JP },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreTiJi_ja_JP },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreHyuByu_ja_JP },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreSeZe_ja_JP },
+ {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_IgnoreIandEfollowedByYa_ja_JP }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_IgnoreKiKuFollowedBySa_ja_JP }, {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreSize_ja_JP },
+ {});
+ transliteration_->loadModuleNew(
{ css::i18n::TransliterationModulesNew_IgnoreProlongedSoundMark_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreMiddleDot_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreSpace_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_SmallToLarge_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_LargeToSmall_ja_JP }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToTextLower_zh_CN }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToTextUpper_zh_CN }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToTextLower_zh_TW }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToTextUpper_zh_TW }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToTextFormalHangul_ko }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToTextFormalLower_ko }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToTextFormalUpper_ko }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToTextInformalHangul_ko },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToTextInformalLower_ko },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToTextInformalUpper_ko },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharLower_zh_CN }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharUpper_zh_CN }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharLower_zh_TW }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharUpper_zh_TW }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharHangul_ko }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharLower_ko }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharUpper_ko }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharFullwidth }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharKanjiShort_ja_JP },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_TextToNumLower_zh_CN }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_TextToNumUpper_zh_CN }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_TextToNumLower_zh_TW }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_TextToNumUpper_zh_TW }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_TextToNumFormalHangul_ko }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_TextToNumFormalLower_ko }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_TextToNumFormalUpper_ko }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_TextToNumInformalHangul_ko },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_TextToNumInformalLower_ko },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_TextToNumInformalUpper_ko },
- {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_CharToNumLower_zh_CN }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_CharToNumUpper_zh_CN }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_CharToNumLower_zh_TW }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_CharToNumUpper_zh_TW }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_CharToNumHangul_ko }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_CharToNumLower_ko }, {});
- trans->loadModuleNew({ css::i18n::TransliterationModulesNew_CharToNumUpper_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_IgnoreMiddleDot_ja_JP }, {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_IgnoreSpace_ja_JP },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_SmallToLarge_ja_JP },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_LargeToSmall_ja_JP },
+ {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToTextLower_zh_CN }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToTextUpper_zh_CN }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToTextLower_zh_TW }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToTextUpper_zh_TW }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToTextFormalHangul_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToTextFormalLower_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToTextFormalUpper_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToTextInformalHangul_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToTextInformalLower_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToTextInformalUpper_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToCharLower_zh_CN }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToCharUpper_zh_CN }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToCharLower_zh_TW }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToCharUpper_zh_TW }, {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharHangul_ko },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharLower_ko },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharUpper_ko },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_NumToCharFullwidth },
+ {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_NumToCharKanjiShort_ja_JP }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_TextToNumLower_zh_CN }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_TextToNumUpper_zh_CN }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_TextToNumLower_zh_TW }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_TextToNumUpper_zh_TW }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_TextToNumFormalHangul_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_TextToNumFormalLower_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_TextToNumFormalUpper_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_TextToNumInformalHangul_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_TextToNumInformalLower_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_TextToNumInformalUpper_ko }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_CharToNumLower_zh_CN }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_CharToNumUpper_zh_CN }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_CharToNumLower_zh_TW }, {});
+ transliteration_->loadModuleNew(
+ { css::i18n::TransliterationModulesNew_CharToNumUpper_zh_TW }, {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_CharToNumHangul_ko },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_CharToNumLower_ko },
+ {});
+ transliteration_->loadModuleNew({ css::i18n::TransliterationModulesNew_CharToNumUpper_ko },
+ {});
+ }
+
+ void testTextToChuyin_zh_TW()
+ {
+ // Verify that loading succeeds:
+ transliteration_->loadModuleByImplName("TextToChuyin_zh_TW", {});
+ }
+
+ void testTextToPinyin_zh_CN()
+ {
+ // Verify that loading succeeds:
+ transliteration_->loadModuleByImplName("TextToPinyin_zh_CN", {});
}
CPPUNIT_TEST_SUITE(Transliteration);
CPPUNIT_TEST(testLoadModuleNew);
+ CPPUNIT_TEST(testTextToChuyin_zh_TW);
+ CPPUNIT_TEST(testTextToPinyin_zh_CN);
CPPUNIT_TEST_SUITE_END();
+
+private:
+ css::uno::Reference<css::i18n::XExtendedTransliteration> transliteration_;
};
CPPUNIT_TEST_SUITE_REGISTRATION(Transliteration);
diff --git a/i18npool/source/transliteration/textToPronounce_zh.cxx b/i18npool/source/transliteration/textToPronounce_zh.cxx
index 7848c935cfab..8d6b3e3e81a3 100644
--- a/i18npool/source/transliteration/textToPronounce_zh.cxx
+++ b/i18npool/source/transliteration/textToPronounce_zh.cxx
@@ -21,6 +21,7 @@
#include <com/sun/star/i18n/MultipleCharsOutputException.hpp>
#include <com/sun/star/i18n/TransliterationType.hpp>
+#include <o3tl/temporary.hxx>
#include <rtl/ustring.hxx>
#include <rtl/ustrbuf.hxx>
@@ -43,7 +44,7 @@ TextToPronounce_zh::getPronounce(const sal_Unicode ch)
if (idx) {
sal_uInt16 address = idx[0][ch>>8];
if (address != 0xFFFF)
- return reinterpret_cast<sal_Unicode *>(
+ return reinterpret_cast<sal_Unicode const *>(
&idx[2][idx[1][address + (ch & 0xFF)]]);
}
return emptyString;
@@ -126,8 +127,8 @@ TextToPronounce_zh::equals( const OUString & str1, sal_Int32 pos1, sal_Int32 nCo
extern "C" {
-sal_uInt16** get_collator_data_zh_zhuyin();
-sal_uInt16** get_collator_data_zh_pinyin();
+sal_uInt16 const ** get_zh_zhuyin(sal_Int16 & max_index);
+sal_uInt16 const ** get_zh_pinyin(sal_Int16 & max_index);
}
@@ -137,7 +138,7 @@ TextToPinyin_zh_CN::TextToPinyin_zh_CN() :
#ifndef DISABLE_DYNLOADING
TextToPronounce_zh("get_zh_pinyin")
#else
- TextToPronounce_zh(get_collator_data_zh_pinyin)
+ TextToPronounce_zh(get_zh_pinyin)
#endif
{
transliterationName = "ChineseCharacterToPinyin";
@@ -148,7 +149,7 @@ TextToChuyin_zh_TW::TextToChuyin_zh_TW() :
#ifndef DISABLE_DYNLOADING
TextToPronounce_zh("get_zh_zhuyin")
#else
- TextToPronounce_zh(get_collator_data_zh_zhuyin)
+ TextToPronounce_zh(get_zh_zhuyin)
#endif
{
transliterationName = "ChineseCharacterToChuyin";
@@ -170,17 +171,17 @@ TextToPronounce_zh::TextToPronounce_zh(const char* func_name)
&thisModule, lib.pData, SAL_LOADMODULE_DEFAULT );
idx=nullptr;
if (hModule) {
- sal_uInt16** (*function)() = reinterpret_cast<sal_uInt16** (*)()>(osl_getFunctionSymbol(hModule, OUString::createFromAscii(func_name).pData));
+ sal_uInt16 const ** (*function)(sal_Int16 &) = reinterpret_cast<sal_uInt16 const ** (*)(sal_Int16 &)>(osl_getFunctionSymbol(hModule, OUString::createFromAscii(func_name).pData));
if (function)
- idx=function();
+ idx=function(o3tl::temporary(sal_Int16()));
}
}
#else
-TextToPronounce_zh::TextToPronounce_zh(sal_uInt16 ** (*function)())
+TextToPronounce_zh::TextToPronounce_zh(sal_uInt16 const ** (*function)(sal_Int16 &))
{
- idx = function();
+ idx = function(o3tl::temporary(sal_Int16()));
}
#endif