formula/source/core/api/FormulaCompiler.cxx | 77 ++++++++++++++++++++----- formula/source/core/resource/core_resource.src | 10 ++- include/formula/FormulaCompiler.hxx | 17 +++++ 3 files changed, 86 insertions(+), 18 deletions(-)
New commits: commit 3ec486639befae454eebfd5b8f5dbc88aa357404 Author: Eike Rathke <er...@redhat.com> Date: Tue Sep 17 01:01:58 2013 +0200 introduced putCopyOpCode() to handle copyFrom() ... and added bOverrideKnownBad handling Change-Id: I1b669771ec1aa0cdfa1c1bef0bcfccfad96fe727 diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index c624eee..6389313 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -820,17 +820,68 @@ FormulaCompiler::OpCodeMap::~OpCodeMap() delete mpHashMap; } -void FormulaCompiler::OpCodeMap::copyFrom( const OpCodeMap& r ) +void FormulaCompiler::OpCodeMap::putCopyOpCode( const String& rSymbol, OpCode eOp ) +{ + SAL_WARN_IF( mpTable[eOp].Len() && !rSymbol.Len(), "formula.core", + "OpCodeMap::putCopyOpCode: NOT replacing OpCode " << eOp << " '" << mpTable[eOp] << "' with empty name!"); + if (mpTable[eOp].Len() && !rSymbol.Len()) + mpHashMap->insert( OpCodeHashMap::value_type( mpTable[eOp], eOp)); + else + { + mpTable[eOp] = rSymbol; + mpHashMap->insert( OpCodeHashMap::value_type( rSymbol, eOp)); + } +} + +void FormulaCompiler::OpCodeMap::copyFrom( const OpCodeMap& r, bool bOverrideKnownBad ) { delete mpHashMap; mpHashMap = new OpCodeHashMap( mnSymbols); sal_uInt16 n = r.getSymbolCount(); - for (sal_uInt16 i = 0; i < n; ++i) + SAL_WARN_IF( n != mnSymbols, "formula.core", + "OpCodeMap::copyFrom: unequal size, this: " << mnSymbols << " that: " << n); + if (n > mnSymbols) + n = mnSymbols; + + // OpCode 0 (ocPush) should never be in a map. + SAL_WARN_IF( mpTable[0].Len() || r.mpTable[0].Len(), "formula.core", + "OpCodeMap::copyFrom: OpCode 0 assigned, this: '" + << mpTable[0] << "' that: '" << r.mpTable[0] << "'"); + + // For bOverrideKnownBad when copying from the English core map (ODF 1.1 + // and API) to the native map (UI "use English function names") replace the + // known bad legacy function names with correct ones. + if (bOverrideKnownBad && r.mbCore && + FormulaGrammar::extractFormulaLanguage( meGrammar) == sheet::FormulaLanguage::NATIVE && + FormulaGrammar::extractFormulaLanguage( r.meGrammar) == sheet::FormulaLanguage::ENGLISH) { - OpCode eOp = OpCode(i); - const String& rSymbol = r.getSymbol( eOp); - putOpCode( rSymbol, eOp); + for (sal_uInt16 i = 1; i < n; ++i) + { + String aSymbol; + OpCode eOp = OpCode(i); + switch (eOp) + { + case ocZGZ: + aSymbol = OUString("RRI"); + break; + case ocTableOp: + aSymbol = OUString("MULTIPLE.OPERATIONS"); + break; + default: + aSymbol = r.mpTable[i]; + } + putCopyOpCode( aSymbol, eOp); + } + } + else + { + for (sal_uInt16 i = 1; i < n; ++i) + { + OpCode eOp = OpCode(i); + const String& rSymbol = r.mpTable[i]; + putCopyOpCode( rSymbol, eOp); + } } // TODO: maybe copy the external maps too? @@ -1847,7 +1898,7 @@ void FormulaCompiler::SetNativeSymbols( const OpCodeMapPtr& xMap ) { NonConstOpCodeMapPtr xSymbolsNative; lcl_fillNativeSymbols( xSymbolsNative); - xSymbolsNative->copyFrom(*xMap); + xSymbolsNative->copyFrom( *xMap, true); } diff --git a/include/formula/FormulaCompiler.hxx b/include/formula/FormulaCompiler.hxx index 6e271ca..28bf5f92 100644 --- a/include/formula/FormulaCompiler.hxx +++ b/include/formula/FormulaCompiler.hxx @@ -114,7 +114,14 @@ public: } virtual ~OpCodeMap(); - void copyFrom( const OpCodeMap& r ); + /** Copy mappings from r into this map, effectively replacing this map. + + @param bOverrideKnownBad + If TRUE, override known legacy bad function names with + correct ones if the conditions can be derived from the + current maps. + */ + void copyFrom( const OpCodeMap& r, bool bOverrideKnownBad ); /// Get the symbol String -> OpCode hash map for finds. inline const OpCodeHashMap* getHashMap() const { return mpHashMap; } @@ -180,6 +187,14 @@ public: /** The value used in createSequenceOfAvailableMappings() and thus in XFormulaOpCodeMapper::getMappings() for an unknown symbol. */ static sal_Int32 getOpCodeUnknown(); + + private: + + /** Conditionally put a mapping in copyFrom() context. + + Does NOT check eOp range! + */ + void putCopyOpCode( const String& rSymbol, OpCode eOp ); }; public: commit 24726fe2de005fe9532487907f8867259f61260c Author: Eike Rathke <er...@redhat.com> Date: Mon Sep 16 22:38:40 2013 +0200 FILTERXML and WEBSERVICE were missing ... from RID_STRLIST_FUNCTION_NAMES_ENGLISH Change-Id: Ie8ef677ffb415d2a4dc29f703b80723e20e2a21a diff --git a/formula/source/core/resource/core_resource.src b/formula/source/core/resource/core_resource.src index e6d3474..6b1b1a8 100644 --- a/formula/source/core/resource/core_resource.src +++ b/formula/source/core/resource/core_resource.src @@ -20,7 +20,7 @@ #include "core_resource.hrc" #include "formula/compiler.hrc" -// DO NOT CHANGE! +// DO NOT CHANGE NAMES! Only add functions. // These English names are used internally to store/load ODFF as of ODF v1.2 Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH_ODFF { @@ -362,11 +362,12 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH_ODFF String SC_OPCODE_ERROR_NAME { Text = "#NAME?" ; }; String SC_OPCODE_ERROR_NUM { Text = "#NUM!" ; }; String SC_OPCODE_ERROR_NA { Text = "#N/A" ; }; + /* END defined ERROR.TYPE() values. */ String SC_OPCODE_FILTERXML { Text = "COM.MICROSOFT.FILTERXML";}; String SC_OPCODE_WEBSERVICE { Text = "COM.MICROSOFT.WEBSERVICE"; }; - /* END defined ERROR.TYPE() values. */ }; -// DO NOT CHANGE! + +// DO NOT CHANGE NAMES! Only add functions. // These English names are used internally to store/load ODF v1.0/v1.1 and for // API XFunctionAccess. Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH @@ -710,7 +711,10 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH String SC_OPCODE_ERROR_NUM { Text = "#NUM!" ; }; String SC_OPCODE_ERROR_NA { Text = "#N/A" ; }; /* END defined ERROR.TYPE() values. */ + String SC_OPCODE_FILTERXML { Text = "FILTERXML";}; + String SC_OPCODE_WEBSERVICE { Text = "WEBSERVICE"; }; }; + Resource RID_STRLIST_FUNCTION_NAMES { String SC_OPCODE_IF commit 4fc4a3f2e5f82ed473fc6e9c22aa3fdf9178c6ff Author: Eike Rathke <er...@redhat.com> Date: Mon Sep 16 22:19:39 2013 +0200 better SAL_WARN_IF diagnostics Change-Id: I74fe8e145dda41466f21f20369681d6f1e5274df diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 4917eec..c624eee 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -497,14 +497,12 @@ void FormulaCompiler::OpCodeMap::putOpCode( const String & rStr, const OpCode eO DBG_ASSERT( 0 < eOp && sal_uInt16(eOp) < mnSymbols, "OpCodeMap::putOpCode: OpCode out of range"); if (0 < eOp && sal_uInt16(eOp) < mnSymbols) { - DBG_ASSERT( (mpTable[eOp].Len() == 0) || (mpTable[eOp] == rStr) || - (eOp == ocCurrency) || (eOp == ocSep) || (eOp == ocArrayColSep) || - (eOp == ocArrayRowSep), - OStringBuffer( - RTL_CONSTASCII_STRINGPARAM("OpCodeMap::putOpCode: reusing OpCode ")). - append( sal_Int32( eOp)).append( RTL_CONSTASCII_STRINGPARAM(" (")). - append( OUStringToOString( rStr, RTL_TEXTENCODING_ASCII_US)). - append(')').getStr()); + SAL_WARN_IF( !((mpTable[eOp].Len() == 0) || (mpTable[eOp] == rStr) || + (eOp == ocCurrency) || (eOp == ocSep) || (eOp == ocArrayColSep) || + (eOp == ocArrayRowSep)), "formula.core", + "OpCodeMap::putOpCode: reusing OpCode " << eOp + << ", replacing '" << mpTable[eOp] << "' with '" << rStr << "' in " + << (mbEnglish ? "" : "non-") << "English map 0x" << ::std::hex << meGrammar); mpTable[eOp] = rStr; mpHashMap->insert( OpCodeHashMap::value_type( rStr, eOp)); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits