diff options
author | Eike Rathke <erack@redhat.com> | 2013-09-17 01:01:58 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2013-09-17 01:04:14 +0200 |
commit | 3ec486639befae454eebfd5b8f5dbc88aa357404 (patch) | |
tree | a6e7a15df8feadc7f033f5a04210025a8e9bdcd9 /formula/source | |
parent | 24726fe2de005fe9532487907f8867259f61260c (diff) |
introduced putCopyOpCode() to handle copyFrom()
... and added bOverrideKnownBad handling
Change-Id: I1b669771ec1aa0cdfa1c1bef0bcfccfad96fe727
Diffstat (limited to 'formula/source')
-rw-r--r-- | formula/source/core/api/FormulaCompiler.cxx | 63 |
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); } |