summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--formula/source/core/api/FormulaCompiler.cxx10
-rw-r--r--formula/source/core/api/token.cxx17
-rw-r--r--formula/source/core/resource/core_resource.src9
-rw-r--r--include/formula/compiler.hrc3
-rw-r--r--include/formula/opcode.hxx1
-rw-r--r--sc/inc/helpids.h1
-rw-r--r--sc/qa/unit/data/contentCSV/date-time-functions.csv2
-rw-r--r--sc/source/core/inc/interpre.hxx1
-rw-r--r--sc/source/core/tool/interpr2.cxx12
-rw-r--r--sc/source/core/tool/interpr4.cxx1
-rw-r--r--sc/source/filter/excel/xlformula.cxx3
11 files changed, 51 insertions, 9 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" ;
diff --git a/include/formula/compiler.hrc b/include/formula/compiler.hrc
index 5e8f7b568ce9..a6a54913daa7 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 a767dfcc3a06..61237332fc85 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 a91e94077615..252940fc1dea 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 a9e3ddd1123d..09cf42bfde97 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 eefd16af7b33..f6b5bd89751e 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 1777230b1142..ef2277ada4bd 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 36047f8dc875..ca54487515f6 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 550d9e75db13..998634fd7929 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