diff options
Diffstat (limited to 'formula')
-rw-r--r-- | formula/source/core/api/FormulaCompiler.cxx | 10 | ||||
-rw-r--r-- | formula/source/core/api/token.cxx | 17 | ||||
-rw-r--r-- | formula/source/core/resource/core_resource.src | 9 |
3 files changed, 30 insertions, 6 deletions
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 457beeefb4b1..526f83f458df 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -1294,8 +1294,7 @@ void FormulaCompiler::Factor() // literal double value and keep function. Anything else // can not be resolved, there exists no "like ISO but week // starts on Sunday" mode in WEEKNUM and for an expression - // we can't determine, so let ISOWEEKNUM generate an error - // for two arguments in these cases. + // we can't determine. if (pc >= 2 && pArr->nIndex == nSepPos + 3 && pArr->pCode[nSepPos+1]->GetType() == svDouble && pArr->pCode[nSepPos+1]->GetDouble() != 1.0 && @@ -1309,10 +1308,9 @@ void FormulaCompiler::Factor() } else { - /* FIXME: introduce (hidden?) compatibility function? */ -#if 0 - pFacToken->NewOpCode( ocWeeknumCompat, FormulaToken::PrivateAccess()); -#endif + // For the remaining two arguments cases use the + // compatibility function. + pFacToken->NewOpCode( ocWeeknumOOo, FormulaToken::PrivateAccess()); } } PutCode( pFacToken ); diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx index 53bc6204a464..2cd8decdd41a 100644 --- a/formula/source/core/api/token.cxx +++ b/formula/source/core/api/token.cxx @@ -1113,6 +1113,7 @@ inline bool MissingConventionODF::isRewriteNeeded( OpCode eOp ) const case ocAddress: case ocLogNormDist: case ocNormDist: + case ocWeeknumOOo: return true; case ocMissing: case ocLog: @@ -1514,6 +1515,22 @@ FormulaTokenArray * FormulaTokenArray::RewriteMissing( const MissingConvention & ( pCur->GetOpCode() == ocCeil ? ocCeil_Math : ocFloor_Math ) ); pNewArr->AddToken( *pToken ); } + else if (pCur->GetOpCode() == ocWeeknumOOo && + rConv.getConvention() == MissingConvention::FORMULA_MISSING_CONVENTION_ODFF) + { + /* XXX TODO FIXME: Remove this special handling (also + * ocWeeknumOOo in MissingConventionODF::isRewriteNeeded() + * above) in 5.3 or later, this still abuses the ODFF + * ISOWEEKNUM function to store the old WEEKNUM (now + * WEEKNUM_OOO) cases that can't be mapped to the new WEEKNUM + * or ISOWEEKNUM, as 5.0 and earlier always stored the old + * WEEKNUM as ISOWEEKNUM. Ugly nasty ... + * Later write ORG.LIBREOFFICE.WEEKNUM_OOO, see + * formula/source/core/resource/core_resource.src + * SC_OPCODE_WEEKNUM_OOO */ + FormulaToken *pToken = new FormulaByteToken( ocIsoWeeknum, pCur->GetByte(), pCur->IsInForceArray()); + pNewArr->AddToken( *pToken ); + } else pNewArr->AddToken( *pCur ); } diff --git a/formula/source/core/resource/core_resource.src b/formula/source/core/resource/core_resource.src index 7b69e055f42a..dcb0b46ccf95 100644 --- a/formula/source/core/resource/core_resource.src +++ b/formula/source/core/resource/core_resource.src @@ -391,6 +391,9 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH_ODFF String SC_OPCODE_BETA_INV_MS { Text = "COM.MICROSOFT.BETA.INV" ; }; String SC_OPCODE_WEEK { Text = "WEEKNUM" ; }; String SC_OPCODE_ISOWEEKNUM { Text = "ISOWEEKNUM" ; }; + /* WEEKNUM_OOO currently (5.1) not written, see + * formula/source/core/api/token.cxx FormulaTokenArray::RewriteMissing() */ + String SC_OPCODE_WEEKNUM_OOO { Text = "ORG.LIBREOFFICE.WEEKNUM_OOO" ; }; String SC_OPCODE_EASTERSUNDAY { Text = "ORG.OPENOFFICE.EASTERSUNDAY" ; }; String SC_OPCODE_GET_DAY_OF_WEEK { Text = "WEEKDAY" ; }; String SC_OPCODE_NETWORKDAYS { Text = "NETWORKDAYS" ; }; @@ -814,6 +817,7 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH_OOXML String SC_OPCODE_BETA_INV_MS { Text = "_xlfn.BETA.INV" ; }; String SC_OPCODE_WEEK { Text = "WEEKNUM" ; }; String SC_OPCODE_ISOWEEKNUM { Text = "_xlfn.ISOWEEKNUM" ; }; + String SC_OPCODE_WEEKNUM_OOO { Text = "_xlfn.ORG.LIBREOFFICE.WEEKNUM_OOO" ; }; String SC_OPCODE_EASTERSUNDAY { Text = "EASTERSUNDAY" ; }; String SC_OPCODE_GET_DAY_OF_WEEK { Text = "WEEKDAY" ; }; String SC_OPCODE_NETWORKDAYS { Text = "NETWORKDAYS" ; }; @@ -1239,6 +1243,7 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH String SC_OPCODE_BETA_INV_MS { Text = "BETA.INV" ; }; String SC_OPCODE_WEEK { Text = "WEEKNUM" ; }; String SC_OPCODE_ISOWEEKNUM { Text = "ISOWEEKNUM" ; }; + String SC_OPCODE_WEEKNUM_OOO { Text = "WEEKNUM_OOO" ; }; String SC_OPCODE_EASTERSUNDAY { Text = "EASTERSUNDAY" ; }; String SC_OPCODE_GET_DAY_OF_WEEK { Text = "WEEKDAY" ; }; String SC_OPCODE_NETWORKDAYS { Text = "NETWORKDAYS" ; }; @@ -2708,6 +2713,10 @@ Resource RID_STRLIST_FUNCTION_NAMES { Text [ en-US ] = "ISOWEEKNUM" ; }; + String SC_OPCODE_WEEKNUM_OOO + { + Text [ en-US ] = "WEEKNUM_OOO" ; + }; String SC_OPCODE_EASTERSUNDAY { Text [ en-US ] = "EASTERSUNDAY" ; |