diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2023-04-12 22:15:04 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2023-04-13 08:23:59 +0200 |
commit | 852af3af0dde3810e323afc3d42d7bd1cd4e67bc (patch) | |
tree | b63286521161b11953b1b04e3f60f3f73f0d250d | |
parent | cbdd54e41a78e6a567d7ff97935721b07461cce5 (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.mk | 2 | ||||
-rw-r--r-- | i18npool/inc/textToPronounce_zh.hxx | 4 | ||||
-rw-r--r-- | i18npool/qa/cppunit/transliteration.cxx | 224 | ||||
-rw-r--r-- | i18npool/source/transliteration/textToPronounce_zh.cxx | 19 |
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 |