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();

Reply via email to