formula/source/core/api/FormulaCompiler.cxx | 10 ++++------ formula/source/core/api/token.cxx | 17 +++++++++++++++++ formula/source/core/resource/core_resource.src | 9 +++++++++ include/formula/compiler.hrc | 3 ++- include/formula/opcode.hxx | 1 + sc/inc/helpids.h | 1 + sc/qa/unit/data/contentCSV/date-time-functions.csv | 2 +- sc/source/core/inc/interpre.hxx | 1 + sc/source/core/tool/interpr2.cxx | 12 ++++++++++++ sc/source/core/tool/interpr4.cxx | 1 + sc/source/filter/excel/xlformula.cxx | 3 ++- 11 files changed, 51 insertions(+), 9 deletions(-)
New commits: commit 902c593196741ffec2d096855369313f6bbe756e Author: Eike Rathke <er...@redhat.com> Date: Tue Jan 5 19:13:54 2016 +0100 tdf#96198 add WEEKNUM_OOO compatibility function, tdf#50950 follow-up The remaining cases when loading old and wrong ISOWEEKNUM that can't be mapped to either new WEEKNUM or ISOWEEKNUM now are mapped to WEEKNUM_OOO(date,mode) with calculations identical to the old and wrong OOo WEEKNUM. These WEEKNUM_OOO cases are still wrongly saved as ISOWEEKNUM so can be read by 5.0 or earlier versions as the old WEEKNUM, which should be changed for 5.3 or later. WEEKNUM_OOO is not offered in the Function Wizard to prevent deliberate usage. Also reverts the interim unit test change to sc/qa/unit/data/contentCSV/date-time-functions.csv that was necessary to catch the error generated by ISOWEEKNUM with two arguments. Change-Id: I874c4c7225900f03b879f2947512ae02270cbd4f diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 457beee..526f83f 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 53bc620..2cd8dec 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 7b69e05..dcb0b46 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" ; diff --git a/include/formula/compiler.hrc b/include/formula/compiler.hrc index 5e8f7b5..a6a5491 100644 --- a/include/formula/compiler.hrc +++ b/include/formula/compiler.hrc @@ -486,7 +486,8 @@ #define SC_OPCODE_FLOOR_MATH 475 #define SC_OPCODE_FLOOR_PRECISE 476 #define SC_OPCODE_RAWSUBTRACT 477 -#define SC_OPCODE_STOP_2_PAR 478 /* last function with two or more parameters' OpCode + 1 */ +#define SC_OPCODE_WEEKNUM_OOO 478 +#define SC_OPCODE_STOP_2_PAR 479 /* last function with two or more parameters' OpCode + 1 */ #define SC_OPCODE_STOP_FUNCTION SC_OPCODE_STOP_2_PAR /* last function's OpCode + 1 */ #define SC_OPCODE_LAST_OPCODE_ID (SC_OPCODE_STOP_FUNCTION - 1) /* last OpCode */ diff --git a/include/formula/opcode.hxx b/include/formula/opcode.hxx index a767dfc..6123733 100644 --- a/include/formula/opcode.hxx +++ b/include/formula/opcode.hxx @@ -451,6 +451,7 @@ enum OpCode : sal_uInt16 // miscellaneous ocWeek = SC_OPCODE_WEEK, ocIsoWeeknum = SC_OPCODE_ISOWEEKNUM, + ocWeeknumOOo = SC_OPCODE_WEEKNUM_OOO, ocGetDayOfWeek = SC_OPCODE_GET_DAY_OF_WEEK, ocNetWorkdays = SC_OPCODE_NETWORKDAYS, ocNetWorkdays_MS = SC_OPCODE_NETWORKDAYS_MS, diff --git a/sc/inc/helpids.h b/sc/inc/helpids.h index a91e940..252940f 100644 --- a/sc/inc/helpids.h +++ b/sc/inc/helpids.h @@ -627,5 +627,6 @@ #define HID_FUNC_FLOOR_MATH "SC_HID_FUNC_FLOOR_MATH" #define HID_FUNC_FLOOR_PRECISE "SC_HID_FUNC_FLOOR_PRECISE" #define HID_FUNC_RAWSUBTRACT "SC_HID_FUNC_RAWSUBTRACT" +#define HID_FUNC_WEEKNUM_OOO "SC_HID_FUNC_WEEKNUM_OOO" /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/qa/unit/data/contentCSV/date-time-functions.csv b/sc/qa/unit/data/contentCSV/date-time-functions.csv index a9e3ddd..09cf42b 100644 --- a/sc/qa/unit/data/contentCSV/date-time-functions.csv +++ b/sc/qa/unit/data/contentCSV/date-time-functions.csv @@ -21,7 +21,7 @@ 4,3,4 52 1,1,52 -Err:504,52 +1,52 52 10,11 52,52 diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx index eefd16a..f6b5bd8 100644 --- a/sc/source/core/inc/interpre.hxx +++ b/sc/source/core/inc/interpre.hxx @@ -620,6 +620,7 @@ void ScGetDay(); void ScGetDayOfWeek(); void ScGetWeekOfYear(); void ScGetIsoWeekOfYear(); +void ScWeeknumOOo(); void ScEasterSunday(); sal_uInt16 GetWeekendAndHolidayMasks( const sal_uInt8 nParamCount, const sal_uInt32 nNullDate, ::std::vector<double>& rSortArray, bool bWeekendMask[ 7 ] ); diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx index 1777230..ef2277a 100644 --- a/sc/source/core/tool/interpr2.cxx +++ b/sc/source/core/tool/interpr2.cxx @@ -205,6 +205,18 @@ void ScInterpreter::ScGetDayOfWeek() } } +void ScInterpreter::ScWeeknumOOo() +{ + if ( MustHaveParamCount( GetByte(), 2 ) ) + { + short nFlag = (short) ::rtl::math::approxFloor(GetDouble()); + + Date aDate = *(pFormatter->GetNullDate()); + aDate += (long)::rtl::math::approxFloor(GetDouble()); + PushInt( (int) aDate.GetWeekOfYear( nFlag == 1 ? SUNDAY : MONDAY )); + } +} + void ScInterpreter::ScGetWeekOfYear() { sal_uInt8 nParamCount = GetByte(); diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index 36047f8..ca54487 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -3701,6 +3701,7 @@ StackVar ScInterpreter::Interpret() case ocGetDayOfWeek : ScGetDayOfWeek(); break; case ocWeek : ScGetWeekOfYear(); break; case ocIsoWeeknum : ScGetIsoWeekOfYear(); break; + case ocWeeknumOOo : ScWeeknumOOo(); break; case ocEasterSunday : ScEasterSunday(); break; case ocNetWorkdays : ScNetWorkdays( false); break; case ocNetWorkdays_MS : ScNetWorkdays( true ); break; diff --git a/sc/source/filter/excel/xlformula.cxx b/sc/source/filter/excel/xlformula.cxx index 550d9e7..998634f 100644 --- a/sc/source/filter/excel/xlformula.cxx +++ b/sc/source/filter/excel/xlformula.cxx @@ -588,7 +588,8 @@ static const XclFunctionInfo saFuncTable_OOoLO[] = { EXC_FUNCENTRY_OOO( ocConvert, 3, 3, 0, "ORG.OPENOFFICE.CONVERT" ), EXC_FUNCENTRY_OOO( ocColor, 3, 4, 0, "ORG.LIBREOFFICE.COLOR" ), - EXC_FUNCENTRY_OOO( ocRawSubtract, 2, MX, 0, "ORG.LIBREOFFICE.RAWSUBTRACT" ) + EXC_FUNCENTRY_OOO( ocRawSubtract, 2, MX, 0, "ORG.LIBREOFFICE.RAWSUBTRACT" ), + EXC_FUNCENTRY_OOO( ocWeeknumOOo, 2, 2, 0, "ORG.LIBREOFFICE.WEEKNUM_OOO" ) }; #undef EXC_FUNCENTRY_OOO _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits