formula/source/core/api/FormulaCompiler.cxx | 9 +++++++++ include/formula/FormulaCompiler.hxx | 1 + sc/inc/compiler.hxx | 1 + sc/source/core/tool/compiler.cxx | 22 +++++++++++++++++++++- 4 files changed, 32 insertions(+), 1 deletion(-)
New commits: commit 59d2745d4ab0bb44d474bab56d3f06a8e1dfb788 Author: Eike Rathke <er...@redhat.com> AuthorDate: Thu Aug 29 17:37:03 2024 +0200 Commit: Eike Rathke <er...@redhat.com> CommitDate: Thu Aug 29 20:30:28 2024 +0200 Related: tdf#161599 Accept Add-In CompatibilityName when reading OOXML Must be first "en-US" (preferred) or "en" or any first if no "en-US" nor "en". Change-Id: I1549d6650b19fbb37952bd093692bbbcba1420c2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172603 Tested-by: Jenkins Reviewed-by: Eike Rathke <er...@redhat.com> diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index f4e7620257a0..ecd7f60a28d2 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -1158,6 +1158,11 @@ void FormulaCompiler::loadSymbols(const std::pair<const char*, int>* pSymbols, F // PricingFunctions AddIn or any user supplied AddIn. fillFromAddInCollectionEnglishName( rxMap); } + else if (FormulaGrammar::GRAM_OOXML == eGrammar) + { + // Add specified Add-In compatibility name. + fillFromAddInCollectionExcelName( rxMap); + } } } @@ -1169,6 +1174,10 @@ void FormulaCompiler::fillFromAddInCollectionEnglishName( const NonConstOpCodeMa { } +void FormulaCompiler::fillFromAddInCollectionExcelName( const NonConstOpCodeMapPtr& /*xMap */) const +{ +} + void FormulaCompiler::fillFromAddInMap( const NonConstOpCodeMapPtr& /*xMap*/, FormulaGrammar::Grammar /*_eGrammar */) const { } diff --git a/include/formula/FormulaCompiler.hxx b/include/formula/FormulaCompiler.hxx index f3488408fbb8..2c4d816053d1 100644 --- a/include/formula/FormulaCompiler.hxx +++ b/include/formula/FormulaCompiler.hxx @@ -339,6 +339,7 @@ protected: virtual void fillFromAddInCollectionUpperName( const NonConstOpCodeMapPtr& xMap ) const; virtual void fillFromAddInMap( const NonConstOpCodeMapPtr& xMap, FormulaGrammar::Grammar _eGrammar ) const; virtual void fillFromAddInCollectionEnglishName( const NonConstOpCodeMapPtr& xMap ) const; + virtual void fillFromAddInCollectionExcelName( const NonConstOpCodeMapPtr& xMap ) const; virtual void fillAddInToken(::std::vector< css::sheet::FormulaOpCodeMapEntry >& _rVec, bool _bIsEnglish) const; virtual void SetError(FormulaError nError); diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index 7041360d69ef..d0305bf474e2 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -515,6 +515,7 @@ private: virtual OUString FindAddInFunction( const OUString& rUpperName, bool bLocalFirst ) const override; virtual void fillFromAddInCollectionUpperName( const NonConstOpCodeMapPtr& xMap ) const override; virtual void fillFromAddInCollectionEnglishName( const NonConstOpCodeMapPtr& xMap ) const override; + virtual void fillFromAddInCollectionExcelName( const NonConstOpCodeMapPtr& xMap ) const override; virtual void fillFromAddInMap( const NonConstOpCodeMapPtr& xMap, formula::FormulaGrammar::Grammar _eGrammar ) const override; virtual void fillAddInToken(::std::vector< css::sheet::FormulaOpCodeMapEntry >& _rVec,bool _bIsEnglish) const override; diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 1329a8a90d96..1226f13b4e17 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -187,6 +187,25 @@ void ScCompiler::fillFromAddInCollectionEnglishName( const NonConstOpCodeMapPtr& } } +void ScCompiler::fillFromAddInCollectionExcelName( const NonConstOpCodeMapPtr& xMap ) const +{ + const LanguageTag aDestLang(LANGUAGE_ENGLISH_US); + ScUnoAddInCollection* pColl = ScGlobal::GetAddInCollection(); + tools::Long nCount = pColl->GetFuncCount(); + for (tools::Long i=0; i < nCount; ++i) + { + OUString aExcelName; + const ScUnoAddInFuncData* pFuncData = pColl->GetFuncData(i); + if (pFuncData && pFuncData->GetExcelName( aDestLang, aExcelName, true)) + { + // Note that function names not defined in OOXML but implemented by + // Excel should have the "_xlfn." prefix. We have no way to check + // though what an Add-In actually implements. + xMap->putExternalSoftly( GetCharClassEnglish()->uppercase(aExcelName), pFuncData->GetOriginalName()); + } + } +} + static std::mutex gCharClassMutex; void ScCompiler::DeInit() @@ -4487,7 +4506,8 @@ bool ScCompiler::NextNewToken( bool bInArray ) bool bAsciiNonAlnum; // operators, separators, ... if ( cSymbol[0] < 128 ) { - bMayBeFuncName = rtl::isAsciiAlpha( cSymbol[0] ); + bMayBeFuncName = rtl::isAsciiAlpha(cSymbol[0]) + || (cSymbol[0] == '_' && mxSymbols->isOOXML() && rtl::isAsciiAlpha(cSymbol[1])); if (!bMayBeFuncName && (cSymbol[0] == '_' && cSymbol[1] == '_') && !comphelper::IsFuzzing()) { bMayBeFuncName = officecfg::Office::Common::Misc::ExperimentalMode::get();