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 4b0ff8ae2a8b9d3945cd0f23535c7ef354a9b3d4 Author: Eike Rathke <er...@redhat.com> AuthorDate: Thu Aug 29 17:37:03 2024 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Tue Sep 3 09:01: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> Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172732 diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 93886a061b25..867c9ecc6b3a 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 a4bba4f2e08d..53bb6d556c4b 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();