summaryrefslogtreecommitdiff
path: root/formula
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2013-09-17 01:01:58 +0200
committerEike Rathke <erack@redhat.com>2013-09-17 01:04:14 +0200
commit3ec486639befae454eebfd5b8f5dbc88aa357404 (patch)
treea6e7a15df8feadc7f033f5a04210025a8e9bdcd9 /formula
parent24726fe2de005fe9532487907f8867259f61260c (diff)
introduced putCopyOpCode() to handle copyFrom()
... and added bOverrideKnownBad handling Change-Id: I1b669771ec1aa0cdfa1c1bef0bcfccfad96fe727
Diffstat (limited to 'formula')
-rw-r--r--formula/source/core/api/FormulaCompiler.cxx63
1 files changed, 57 insertions, 6 deletions
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx
index c624eeec0f83..638931304937 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);
}