summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2017-10-04 00:21:59 +0300
committerTor Lillqvist <tml@collabora.com>2017-10-04 00:23:52 +0300
commit6e3e4cd38b56d432c48cd7217885974e3f0519fd (patch)
tree269050c3577d527a0511fb8951b8d8a5595ec5f7 /sc
parent13a27860ae79ee8ac9c96b8beb6d3d7aa56a9d94 (diff)
Indent part of ScInterpreter that for some reason was not indented at all
Change-Id: Ib514d8422a1a881f24fe7a10e8ce538ea997dc6b
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/inc/interpre.hxx1498
1 files changed, 749 insertions, 749 deletions
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 299104fbb8e8..fa257e8c6f04 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -231,761 +231,761 @@ private:
/// Merge global and document specific settings.
void MergeCalcConfig();
-// nMust <= nAct <= nMax ? ok : PushError
-inline bool MustHaveParamCount( short nAct, short nMust );
-inline bool MustHaveParamCount( short nAct, short nMust, short nMax );
-inline bool MustHaveParamCountMin( short nAct, short nMin );
-void PushParameterExpected();
-void PushIllegalParameter();
-void PushIllegalArgument();
-void PushNoValue();
-void PushNA();
-
-// Functions for accessing a document
-
-void ReplaceCell( ScAddress& ); // for TableOp
-bool IsTableOpInRange( const ScRange& );
-sal_uLong GetCellNumberFormat( const ScAddress& rPos, ScRefCellValue& rCell );
-double ConvertStringToValue( const OUString& );
-public:
-static double ScGetGCD(double fx, double fy);
-/** For matrix back calls into the current interpreter.
- Uses rError instead of nGlobalError and rCurFmtType instead of nCurFmtType. */
-double ConvertStringToValue( const OUString&, FormulaError& rError, short& rCurFmtType );
-private:
-double GetCellValue( const ScAddress&, ScRefCellValue& rCell );
-double GetCellValueOrZero( const ScAddress&, ScRefCellValue& rCell );
-double GetValueCellValue( const ScAddress&, double fOrig );
-void GetCellString( svl::SharedString& rStr, ScRefCellValue& rCell );
-static FormulaError GetCellErrCode( const ScRefCellValue& rCell );
-
-bool CreateDoubleArr(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
- SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt8* pCellArr);
-bool CreateStringArr(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
- SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt8* pCellArr);
-bool CreateCellArr(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
- SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt8* pCellArr);
-
-// Stack operations
-
-/** Does substitute with formula::FormulaErrorToken in case nGlobalError is set and the token
- passed is not formula::FormulaErrorToken.
- Increments RefCount of the original token if not substituted. */
-void Push( const formula::FormulaToken& r );
-
-/** Does not substitute with formula::FormulaErrorToken in case nGlobalError is set.
- Used to push RPN tokens or from within Push() or tokens that are already
- explicit formula::FormulaErrorToken. Increments RefCount. */
-void PushWithoutError( const formula::FormulaToken& r );
-
-/** Does substitute with formula::FormulaErrorToken in case nGlobalError is set and the token
- passed is not formula::FormulaErrorToken.
- Increments RefCount of the original token if not substituted.
- ATTENTION! The token had to be allocated with `new' and must not be used
- after this call if no RefCount was set because possibly it gets immediately
- deleted in case of an FormulaError::StackOverflow or if substituted with formula::FormulaErrorToken! */
-void PushTempToken( formula::FormulaToken* );
-
-/** Pushes the token or substitutes with formula::FormulaErrorToken in case
- nGlobalError is set and the token passed is not formula::FormulaErrorToken.
- Increments RefCount of the original token if not substituted. */
-void PushTokenRef( const formula::FormulaConstTokenRef& );
-
-/** Does not substitute with formula::FormulaErrorToken in case nGlobalError is set.
- Used to push tokens from within PushTempToken() or tokens that are already
- explicit formula::FormulaErrorToken. Increments RefCount.
- ATTENTION! The token had to be allocated with `new' and must not be used
- after this call if no RefCount was set because possibly it gets immediately
- decremented again and thus deleted in case of an FormulaError::StackOverflow! */
-void PushTempTokenWithoutError( const formula::FormulaToken* );
-
-/** If nGlobalError is set push formula::FormulaErrorToken.
- If nGlobalError is not set do nothing.
- Used in PushTempToken() and alike to simplify handling.
- @return: <TRUE/> if nGlobalError. */
-bool IfErrorPushError()
-{
- if (nGlobalError != FormulaError::NONE)
+ // nMust <= nAct <= nMax ? ok : PushError
+ inline bool MustHaveParamCount( short nAct, short nMust );
+ inline bool MustHaveParamCount( short nAct, short nMust, short nMax );
+ inline bool MustHaveParamCountMin( short nAct, short nMin );
+ void PushParameterExpected();
+ void PushIllegalParameter();
+ void PushIllegalArgument();
+ void PushNoValue();
+ void PushNA();
+
+ // Functions for accessing a document
+
+ void ReplaceCell( ScAddress& ); // for TableOp
+ bool IsTableOpInRange( const ScRange& );
+ sal_uLong GetCellNumberFormat( const ScAddress& rPos, ScRefCellValue& rCell );
+ double ConvertStringToValue( const OUString& );
+ public:
+ static double ScGetGCD(double fx, double fy);
+ /** For matrix back calls into the current interpreter.
+ Uses rError instead of nGlobalError and rCurFmtType instead of nCurFmtType. */
+ double ConvertStringToValue( const OUString&, FormulaError& rError, short& rCurFmtType );
+ private:
+ double GetCellValue( const ScAddress&, ScRefCellValue& rCell );
+ double GetCellValueOrZero( const ScAddress&, ScRefCellValue& rCell );
+ double GetValueCellValue( const ScAddress&, double fOrig );
+ void GetCellString( svl::SharedString& rStr, ScRefCellValue& rCell );
+ static FormulaError GetCellErrCode( const ScRefCellValue& rCell );
+
+ bool CreateDoubleArr(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
+ SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt8* pCellArr);
+ bool CreateStringArr(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
+ SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt8* pCellArr);
+ bool CreateCellArr(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
+ SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt8* pCellArr);
+
+ // Stack operations
+
+ /** Does substitute with formula::FormulaErrorToken in case nGlobalError is set and the token
+ passed is not formula::FormulaErrorToken.
+ Increments RefCount of the original token if not substituted. */
+ void Push( const formula::FormulaToken& r );
+
+ /** Does not substitute with formula::FormulaErrorToken in case nGlobalError is set.
+ Used to push RPN tokens or from within Push() or tokens that are already
+ explicit formula::FormulaErrorToken. Increments RefCount. */
+ void PushWithoutError( const formula::FormulaToken& r );
+
+ /** Does substitute with formula::FormulaErrorToken in case nGlobalError is set and the token
+ passed is not formula::FormulaErrorToken.
+ Increments RefCount of the original token if not substituted.
+ ATTENTION! The token had to be allocated with `new' and must not be used
+ after this call if no RefCount was set because possibly it gets immediately
+ deleted in case of an FormulaError::StackOverflow or if substituted with formula::FormulaErrorToken! */
+ void PushTempToken( formula::FormulaToken* );
+
+ /** Pushes the token or substitutes with formula::FormulaErrorToken in case
+ nGlobalError is set and the token passed is not formula::FormulaErrorToken.
+ Increments RefCount of the original token if not substituted. */
+ void PushTokenRef( const formula::FormulaConstTokenRef& );
+
+ /** Does not substitute with formula::FormulaErrorToken in case nGlobalError is set.
+ Used to push tokens from within PushTempToken() or tokens that are already
+ explicit formula::FormulaErrorToken. Increments RefCount.
+ ATTENTION! The token had to be allocated with `new' and must not be used
+ after this call if no RefCount was set because possibly it gets immediately
+ decremented again and thus deleted in case of an FormulaError::StackOverflow! */
+ void PushTempTokenWithoutError( const formula::FormulaToken* );
+
+ /** If nGlobalError is set push formula::FormulaErrorToken.
+ If nGlobalError is not set do nothing.
+ Used in PushTempToken() and alike to simplify handling.
+ @return: <TRUE/> if nGlobalError. */
+ bool IfErrorPushError()
{
- PushTempTokenWithoutError( new formula::FormulaErrorToken( nGlobalError));
- return true;
+ if (nGlobalError != FormulaError::NONE)
+ {
+ PushTempTokenWithoutError( new formula::FormulaErrorToken( nGlobalError));
+ return true;
+ }
+ return false;
}
- return false;
-}
-
-/** Obtain cell result / content from address and push as temp token.
-
- @param bDisplayEmptyAsString
- is passed to ScEmptyCell in case of an empty cell result.
-
- @param pRetTypeExpr
- @param pRetIndexExpr
- Obtain number format and type if _both_, type and index pointer,
- are not NULL.
- @param bFinalResult
- If TRUE, only a standard FormulaDoubleToken is pushed.
- If FALSE, PushDouble() is used that may push either a
- FormulaDoubleToken or a FormulaTypedDoubleToken.
- */
-void PushCellResultToken( bool bDisplayEmptyAsString, const ScAddress & rAddress,
- short * pRetTypeExpr, sal_uLong * pRetIndexExpr, bool bFinalResult = false );
-
-formula::FormulaConstTokenRef PopToken();
-void Pop();
-void PopError();
-double PopDouble();
-svl::SharedString PopString();
-void ValidateRef( const ScSingleRefData & rRef );
-void ValidateRef( const ScComplexRefData & rRef );
-void ValidateRef( const ScRefList & rRefList );
-void SingleRefToVars( const ScSingleRefData & rRef, SCCOL & rCol, SCROW & rRow, SCTAB & rTab );
-void PopSingleRef( ScAddress& );
-void PopSingleRef(SCCOL& rCol, SCROW &rRow, SCTAB& rTab);
-void DoubleRefToRange( const ScComplexRefData&, ScRange&, bool bDontCheckForTableOp = false );
-/** If formula::StackVar formula::svDoubleRef pop ScDoubleRefToken and return values of
- ScComplexRefData.
- Else if StackVar svRefList return values of the ScComplexRefData where
- rRefInList is pointing to. rRefInList is incremented. If rRefInList was the
- last element in list pop ScRefListToken and set rRefInList to 0, else
- rParam is incremented (!) to allow usage as in
- while(nParamCount--) PopDoubleRef(aRange,nParamCount,nRefInList);
- */
-void PopDoubleRef( ScRange & rRange, short & rParam, size_t & rRefInList );
-void PopDoubleRef( ScRange&, bool bDontCheckForTableOp = false );
-void DoubleRefToVars( const formula::FormulaToken* p,
- SCCOL& rCol1, SCROW &rRow1, SCTAB& rTab1,
- SCCOL& rCol2, SCROW &rRow2, SCTAB& rTab2 );
-ScDBRangeBase* PopDBDoubleRef();
-void PopDoubleRef(SCCOL& rCol1, SCROW &rRow1, SCTAB& rTab1,
- SCCOL& rCol2, SCROW &rRow2, SCTAB& rTab2 );
-
-void PopExternalSingleRef(sal_uInt16& rFileId, OUString& rTabName, ScSingleRefData& rRef);
-
-/** Guarantees that nGlobalError is set if rToken could not be obtained. */
-void PopExternalSingleRef(ScExternalRefCache::TokenRef& rToken, ScExternalRefCache::CellFormat* pFmt = nullptr);
-
-/** Guarantees that nGlobalError is set if rToken could not be obtained. */
-void PopExternalSingleRef(sal_uInt16& rFileId, OUString& rTabName, ScSingleRefData& rRef,
- ScExternalRefCache::TokenRef& rToken, ScExternalRefCache::CellFormat* pFmt = nullptr);
-
-void PopExternalDoubleRef(sal_uInt16& rFileId, OUString& rTabName, ScComplexRefData& rRef);
-void PopExternalDoubleRef(ScExternalRefCache::TokenArrayRef& rArray);
-void PopExternalDoubleRef(ScMatrixRef& rMat);
-void GetExternalDoubleRef(sal_uInt16 nFileId, const OUString& rTabName, const ScComplexRefData& aData, ScExternalRefCache::TokenArrayRef& rArray);
-bool PopDoubleRefOrSingleRef( ScAddress& rAdr );
-void PopDoubleRefPushMatrix();
-void PopRefListPushMatrixOrRef();
-// If MatrixFormula: convert svDoubleRef to svMatrix, create JumpMatrix.
-// Else convert area reference parameters marked as ForceArray to array.
-// Returns true if JumpMatrix created.
-bool ConvertMatrixParameters();
-// If MatrixFormula: ConvertMatrixJumpConditionToMatrix()
-inline void MatrixJumpConditionToMatrix();
-// For MatrixFormula (preconditions already checked by
-// MatrixJumpConditionToMatrix()): convert svDoubleRef to svMatrix, or if
-// JumpMatrix currently in effect convert also other types to svMatrix so
-// another JumpMatrix will be created by jump commands.
-void ConvertMatrixJumpConditionToMatrix();
-// If MatrixFormula or ForceArray: ConvertMatrixParameters()
-inline bool MatrixParameterConversion();
-ScMatrixRef PopMatrix();
-sc::RangeMatrix PopRangeMatrix();
-void QueryMatrixType(const ScMatrixRef& xMat, short& rRetTypeExpr, sal_uLong& rRetIndexExpr);
-
-formula::FormulaToken* CreateDoubleOrTypedToken( double fVal );
-
-void PushDouble(double nVal);
-void PushInt( int nVal );
-void PushStringBuffer( const sal_Unicode* pString );
-void PushString( const OUString& rStr );
-void PushString( const svl::SharedString& rString );
-void PushSingleRef(SCCOL nCol, SCROW nRow, SCTAB nTab);
-void PushDoubleRef(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
- SCCOL nCol2, SCROW nRow2, SCTAB nTab2);
-void PushExternalSingleRef(sal_uInt16 nFileId, const OUString& rTabName,
- SCCOL nCol, SCROW nRow, SCTAB nTab);
-void PushExternalDoubleRef(sal_uInt16 nFileId, const OUString& rTabName,
- SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
- SCCOL nCol2, SCROW nRow2, SCTAB nTab2);
-void PushSingleRef( const ScRefAddress& rRef );
-void PushDoubleRef( const ScRefAddress& rRef1, const ScRefAddress& rRef2 );
-void PushMatrix( const sc::RangeMatrix& rMat );
-void PushMatrix(const ScMatrixRef& pMat);
-void PushError( FormulaError nError );
-/// Raw stack type without default replacements.
-formula::StackVar GetRawStackType();
-/// Stack type with replacement of defaults, e.g. svMissing and formula::svEmptyCell will result in formula::svDouble.
-formula::StackVar GetStackType();
-// peek StackType of Parameter, Parameter 1 == TOS, 2 == TOS-1, ...
-formula::StackVar GetStackType( sal_uInt8 nParam );
-sal_uInt8 GetByte() { return cPar; }
-// reverse order of stack
-void ReverseStack( sal_uInt8 nParamCount );
-// generates a position-dependent SingleRef out of a DoubleRef
-bool DoubleRefToPosSingleRef( const ScRange& rRange, ScAddress& rAdr );
-double GetDoubleFromMatrix(const ScMatrixRef& pMat);
-double GetDouble();
-double GetDoubleWithDefault(double nDefault);
-bool IsMissing();
-sal_Int32 double_to_int32(double fVal);
-/** if GetDouble() not within int32 limits sets nGlobalError and returns SAL_MAX_INT32 */
-sal_Int32 GetInt32();
-/** if GetDoubleWithDefault() not within int32 limits sets nGlobalError and returns SAL_MAX_INT32 */
-sal_Int32 GetInt32WithDefault( sal_Int32 nDefault );
-/** if GetDouble() not within int16 limits sets nGlobalError and returns SAL_MAX_INT16 */
-sal_Int16 GetInt16();
-/** if GetDouble() not within uint32 limits sets nGlobalError and returns SAL_MAX_UINT32 */
-sal_uInt32 GetUInt32();
-bool GetBool() { return GetDouble() != 0.0; }
-/// returns TRUE if double (or error, check nGlobalError), else FALSE
-bool GetDoubleOrString( double& rValue, svl::SharedString& rString );
-svl::SharedString GetString();
-svl::SharedString GetStringFromMatrix(const ScMatrixRef& pMat);
-svl::SharedString GetStringFromDouble( const double fVal);
-// pop matrix and obtain one element, upper left or according to jump matrix
-ScMatValType GetDoubleOrStringFromMatrix( double& rDouble, svl::SharedString& rString );
-ScMatrixRef CreateMatrixFromDoubleRef( const formula::FormulaToken* pToken,
- SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
- SCCOL nCol2, SCROW nRow2, SCTAB nTab2 );
-inline ScTokenMatrixMap& GetTokenMatrixMap();
-static ScTokenMatrixMap* CreateTokenMatrixMap();
-ScMatrixRef GetMatrix();
-ScMatrixRef GetMatrix( short & rParam, size_t & rInRefList );
-sc::RangeMatrix GetRangeMatrix();
-
-void ScTableOp(); // repeated operations
-
-// common helper functions
-
-void CurFmtToFuncFmt()
- { nFuncFmtType = nCurFmtType; nFuncFmtIndex = nCurFmtIndex; }
-
-/** Check if a double is suitable as string position or length argument.
-
- If fVal is Inf or NaN it is changed to -1, if it is less than 0 it is
- sanitized to 0, if it is greater than some implementation defined max
- string length it is sanitized to that max.
-
- @return TRUE if double value fVal is suitable as string argument and was
- not sanitized.
- FALSE if not and fVal was adapted.
- */
-static inline bool CheckStringPositionArgument( double & fVal );
-
-/** Obtain a double suitable as string position or length argument.
- Returns -1 if the number is Inf or NaN or less than 0 or greater than some
- implementation defined max string length. */
-inline double GetStringPositionArgument();
-
-// Check for String overflow of rResult+rAdd and set error and erase rResult
-// if so. Return true if ok, false if overflow
-inline bool CheckStringResultLen( OUString& rResult, const OUString& rAdd );
-// Set error according to rVal, and set rVal to 0.0 if there was an error.
-inline void TreatDoubleError( double& rVal );
-// Lookup using ScLookupCache, @returns true if found and result address
-bool LookupQueryWithCache( ScAddress & o_rResultPos,
- const ScQueryParam & rParam ) const;
-
-void ScIfJump();
-void ScIfError( bool bNAonly );
-void ScChooseJump();
-
-// Be sure to only call this if pStack[sp-nStackLevel] really contains a
-// ScJumpMatrixToken, no further checks are applied!
-// Returns true if last jump was executed and result matrix pushed.
-bool JumpMatrix( short nStackLevel );
-
-double Compare( ScQueryOp eOp );
-/** @param pOptions
- NULL means case sensitivity document option is to be used!
- */
-sc::RangeMatrix CompareMat( ScQueryOp eOp, sc::CompareOptions* pOptions = nullptr );
-ScMatrixRef QueryMat( const ScMatrixRef& pMat, sc::CompareOptions& rOptions );
-void ScEqual();
-void ScNotEqual();
-void ScLess();
-void ScGreater();
-void ScLessEqual();
-void ScGreaterEqual();
-void ScAnd();
-void ScOr();
-void ScXor();
-void ScNot();
-void ScNeg();
-void ScPercentSign();
-void ScIntersect();
-void ScRangeFunc();
-void ScUnionFunc();
-void ScPi();
-void ScRandom();
-void ScTrue();
-void ScFalse();
-void ScDeg();
-void ScRad();
-void ScSin();
-void ScCos();
-void ScTan();
-void ScCot();
-void ScArcSin();
-void ScArcCos();
-void ScArcTan();
-void ScArcCot();
-void ScSinHyp();
-void ScCosHyp();
-void ScTanHyp();
-void ScCotHyp();
-void ScArcSinHyp();
-void ScArcCosHyp();
-void ScArcTanHyp();
-void ScArcCotHyp();
-void ScCosecant();
-void ScSecant();
-void ScCosecantHyp();
-void ScSecantHyp();
-void ScExp();
-void ScLn();
-void ScLog10();
-void ScSqrt();
-void ScIsEmpty();
-bool IsString();
-void ScIsString();
-void ScIsNonString();
-void ScIsLogical();
-void ScType();
-void ScCell();
-void ScCellExternal();
-void ScIsRef();
-void ScIsValue();
-void ScIsFormula();
-void ScFormula();
-void ScRoman();
-void ScArabic();
-void ScIsNV();
-void ScIsErr();
-void ScIsError();
-bool IsEven();
-void ScIsEven();
-void ScIsOdd();
-void ScN();
-void ScCode();
-void ScTrim();
-void ScUpper();
-void ScProper();
-void ScLower();
-void ScLen();
-void ScT();
-void ScValue();
-void ScNumberValue();
-void ScClean();
-void ScChar();
-void ScJis();
-void ScAsc();
-void ScUnicode();
-void ScUnichar();
-void ScMin( bool bTextAsZero = false );
-void ScMax( bool bTextAsZero = false );
-/** Check for array of references to determine the maximum size of a return
- column vector if in array context. */
-size_t GetRefListArrayMaxSize( short nParamCount );
-/** Switch to array reference list if current TOS is one and create/init or
- update matrix and return true. Else return false. */
-bool SwitchToArrayRefList( ScMatrixRef& xResMat, SCSIZE nMatRows, double fCurrent,
- const std::function<void( SCSIZE i, double fCurrent )>& MatOpFunc, bool bDoMatOp );
-void IterateParameters( ScIterFunc, bool bTextAsZero = false );
-void ScSumSQ();
-void ScSum();
-void ScProduct();
-void ScAverage( bool bTextAsZero = false );
-void ScCount();
-void ScCount2();
-void GetStVarParams( bool bTextAsZero, double(*VarResult)( double fVal, size_t nValCount ) );
-void ScVar( bool bTextAsZero = false );
-void ScVarP( bool bTextAsZero = false );
-void ScStDev( bool bTextAsZero = false );
-void ScStDevP( bool bTextAsZero = false );
-void ScRawSubtract();
-void ScColumns();
-void ScRows();
-void ScSheets();
-void ScColumn();
-void ScRow();
-void ScSheet();
-void ScMatch();
-void IterateParametersIf( ScIterFuncIf );
-void ScCountIf();
-void ScSumIf();
-void ScAverageIf();
-void IterateParametersIfs( double(*ResultFunc)( const sc::ParamIfsResult& rRes ) );
-void ScSumIfs();
-void ScAverageIfs();
-void ScCountIfs();
-void ScCountEmptyCells();
-void ScLookup();
-void ScHLookup();
-void ScVLookup();
-void ScSubTotal();
-
-// If upon call rMissingField==true then the database field parameter may be
-// missing (Xcl DCOUNT() syntax), or may be faked as missing by having the
-// value 0.0 or being exactly the entire database range reference (old SO
-// compatibility). If this was the case then rMissingField is set to true upon
-// return. If rMissingField==false upon call all "missing cases" are considered
-// to be an error.
-std::unique_ptr<ScDBQueryParamBase> GetDBParams( bool& rMissingField );
-
-void DBIterator( ScIterFunc );
-void ScDBSum();
-void ScDBCount();
-void ScDBCount2();
-void ScDBAverage();
-void ScDBGet();
-void ScDBMax();
-void ScDBMin();
-void ScDBProduct();
-void GetDBStVarParams( double& rVal, double& rValCount );
-void ScDBStdDev();
-void ScDBStdDevP();
-void ScDBVar();
-void ScDBVarP();
-void ScIndirect();
-void ScAddressFunc();
-void ScOffset();
-void ScIndex();
-void ScMultiArea();
-void ScAreas();
-void ScCurrency();
-void ScReplace();
-void ScFixed();
-void ScFind();
-void ScExact();
-void ScLeft();
-void ScRight();
-void ScSearch();
-void ScMid();
-void ScText();
-void ScSubstitute();
-void ScRept();
-void ScConcat();
-void ScConcat_MS();
-void ScTextJoin_MS();
-void ScIfs_MS();
-void ScSwitch_MS();
-void ScMinIfs_MS();
-void ScMaxIfs_MS();
-void ScExternal();
-void ScMissing();
-void ScMacro();
-bool SetSbxVariable( SbxVariable* pVar, const ScAddress& );
-FormulaError GetErrorType();
-void ScErrorType();
-void ScErrorType_ODF();
-void ScDBArea();
-void ScColRowNameAuto();
-void ScGetPivotData();
-void ScHyperLink();
-void ScBahtText();
-void ScBitAnd();
-void ScBitOr();
-void ScBitXor();
-void ScBitRshift();
-void ScBitLshift();
-void ScTTT();
-void ScDebugVar();
-
-/** Obtain the date serial number for a given date.
- @param bStrict
- If false, nYear < 100 takes the two-digit year setting into account,
- and rollover of invalid calendar dates takes place, e.g. 1999-02-31 =>
- 1999-03-03.
- If true, the date passed must be a valid Gregorian calendar date. No
- two-digit expanding or rollover is done.
-
- Date must be Gregorian, i.e. >= 1582-10-15.
- */
-double GetDateSerial( sal_Int16 nYear, sal_Int16 nMonth, sal_Int16 nDay, bool bStrict );
-
-void ScGetActDate();
-void ScGetActTime();
-void ScGetYear();
-void ScGetMonth();
-void ScGetDay();
-void ScGetDayOfWeek();
-void ScGetWeekOfYear();
-void ScGetIsoWeekOfYear();
-void ScWeeknumOOo();
-void ScEasterSunday();
-FormulaError GetWeekendAndHolidayMasks( const sal_uInt8 nParamCount, const sal_uInt32 nNullDate,
- ::std::vector<double>& rSortArray, bool bWeekendMask[ 7 ] );
-FormulaError GetWeekendAndHolidayMasks_MS( const sal_uInt8 nParamCount, const sal_uInt32 nNullDate,
- ::std::vector<double>& rSortArray, bool bWeekendMask[ 7 ], bool bWorkdayFunction );
-static inline sal_Int16 GetDayOfWeek( sal_Int32 n );
-void ScNetWorkdays( bool bOOXML_Version );
-void ScWorkday_MS();
-void ScGetHour();
-void ScGetMin();
-void ScGetSec();
-void ScPlusMinus();
-void ScAbs();
-void ScInt();
-void ScEven();
-void ScOdd();
-void ScCeil( bool bODFF );
-void ScCeil_MS();
-void ScCeil_Precise();
-void ScFloor( bool bODFF );
-void ScFloor_MS();
-void ScFloor_Precise();
-void RoundNumber( rtl_math_RoundingMode eMode );
-void ScRound();
-void ScRoundUp();
-void ScRoundDown();
-void ScGetDateValue();
-void ScGetTimeValue();
-void ScArcTan2();
-void ScLog();
-void ScGetDate();
-void ScGetTime();
-void ScGetDiffDate();
-void ScGetDiffDate360();
-void ScGetDateDif();
-void ScPower();
-void ScAmpersand();
-void ScAdd();
-void ScSub();
-void ScMul();
-void ScDiv();
-void ScPow();
-void ScCurrent();
-void ScStyle();
-void ScDde();
-void ScBase();
-void ScDecimal();
-void ScConvertOOo();
-void ScEuroConvert();
-void ScRoundSignificant();
-
-// financial functions
-void ScNPV();
-void ScIRR();
-void ScMIRR();
-void ScISPMT();
-
-static double ScGetBw(double fInterest, double fZzr, double fRmz,
- double fZw, bool bPayInAdvance);
-void ScPV();
-void ScSYD();
-static double ScGetGDA(double fWert, double fRest, double fDauer,
- double fPeriode, double fFactor);
-void ScDDB();
-void ScDB();
-static double ScInterVDB(double fWert,double fRest,double fDauer,double fDauer1,
- double fPeriode,double fFactor);
-void ScVDB();
-void ScPDuration();
-void ScSLN();
-static double ScGetRmz(double fInterest, double fZzr, double fBw,
- double fZw, bool bPayInAdvance);
-void ScPMT();
-void ScRRI();
-static double ScGetZw(double fInterest, double fZzr, double fRmz,
- double fBw, bool bFlag);
-void ScFV();
-void ScNper();
-static bool RateIteration(double fNper, double fPayment, double fPv,
- double fFv, bool bPayType, double& fGuess);
-void ScRate();
-double ScGetCompoundInterest(double fInterest, double fZr, double fZzr, double fBw,
- double fZw, bool bPayInAdvance, double& fRmz);
-void ScIpmt();
-void ScPpmt();
-void ScCumIpmt();
-void ScCumPrinc();
-void ScEffect();
-void ScNominal();
-void ScMod();
-void ScIntercept();
-void ScGCD();
-void ScLCM();
-
-// matrix functions
-void ScMatValue();
-static void MEMat(const ScMatrixRef& mM, SCSIZE n);
-void ScMatDet();
-void ScMatInv();
-void ScMatMult();
-void ScMatTrans();
-void ScEMat();
-void ScMatRef();
-ScMatrixRef MatConcat(const ScMatrixRef& pMat1, const ScMatrixRef& pMat2);
-void ScSumProduct();
-void ScSumX2MY2();
-void ScSumX2DY2();
-void ScSumXMY2();
-void ScGrowth();
-bool CalculateSkew(double& fSum,double& fCount,double& vSum,std::vector<double>& values);
-void CalculateSkewOrSkewp( bool bSkewp );
-void CalculateSlopeIntercept(bool bSlope);
-void CalculateSmallLarge(bool bSmall);
-void CalculatePearsonCovar( bool _bPearson, bool _bStexy, bool _bSample ); //fdo#70000 argument _bSample is ignored if _bPearson == true
-bool CalculateTest( bool _bTemplin
- ,const SCSIZE nC1, const SCSIZE nC2,const SCSIZE nR1,const SCSIZE nR2
- ,const ScMatrixRef& pMat1,const ScMatrixRef& pMat2
- ,double& fT,double& fF);
-void CalculateLookup(bool bHLookup);
-bool FillEntry(ScQueryEntry& rEntry);
-void CalculateAddSub(bool _bSub);
-void CalculateTrendGrowth(bool _bGrowth);
-void CalculateRGPRKP(bool _bRKP);
-void CalculateSumX2MY2SumX2DY2(bool _bSumX2DY2);
-void CalculateMatrixValue(const ScMatrix* pMat,SCSIZE nC,SCSIZE nR);
-bool CheckMatrix(bool _bLOG,sal_uInt8& nCase,SCSIZE& nCX,SCSIZE& nCY,SCSIZE& nRX,SCSIZE& nRY,SCSIZE& M,SCSIZE& N,ScMatrixRef& pMatX,ScMatrixRef& pMatY);
-void ScLinest();
-void ScLogest();
-void ScForecast();
-void ScForecast_Ets( ScETSType eETSType );
-void ScNoName();
-void ScBadName();
-// Statistics:
-static double taylor(const double* pPolynom, sal_uInt16 nMax, double x);
-static double gauss(double x);
+ /** Obtain cell result / content from address and push as temp token.
-public:
-static SC_DLLPUBLIC double phi(double x);
-static SC_DLLPUBLIC double integralPhi(double x);
-static SC_DLLPUBLIC double gaussinv(double x);
-static SC_DLLPUBLIC double GetPercentile( ::std::vector<double> & rArray, double fPercentile );
+ @param bDisplayEmptyAsString
+ is passed to ScEmptyCell in case of an empty cell result.
+ @param pRetTypeExpr
+ @param pRetIndexExpr
+ Obtain number format and type if _both_, type and index pointer,
+ are not NULL.
-private:
-double GetBetaDist(double x, double alpha, double beta); //cumulative distribution function
-double GetBetaDistPDF(double fX, double fA, double fB); //probability density function)
-double GetChiDist(double fChi, double fDF); // for LEGACY.CHIDIST, returns right tail
-double GetChiSqDistCDF(double fX, double fDF); // for CHISQDIST, returns left tail
-static double GetChiSqDistPDF(double fX, double fDF); // probability density function
-double GetFDist(double x, double fF1, double fF2);
-double GetTDist( double T, double fDF, int nType );
-double Fakultaet(double x);
-static double BinomKoeff(double n, double k);
-double GetGamma(double x);
-static double GetLogGamma(double x);
-double GetBeta(double fAlpha, double fBeta);
-static double GetLogBeta(double fAlpha, double fBeta);
-double GetBinomDistPMF(double x, double n, double p); //probability mass function
-double GetHypGeomDist( double x, double n, double M, double N );
-void ScLogGamma();
-void ScGamma();
-void ScPhi();
-void ScGauss();
-void ScStdNormDist();
-void ScStdNormDist_MS();
-void ScFisher();
-void ScFisherInv();
-void ScFact();
-void ScNormDist( int nMinParamCount );
-void ScGammaDist( bool bODFF );
-void ScGammaInv();
-void ScExpDist();
-void ScBinomDist();
-void ScPoissonDist( bool bODFF );
-void ScCombin();
-void ScCombinA();
-void ScPermut();
-void ScPermutationA();
-void ScB();
-void ScHypGeomDist( int nMinParamCount );
-void ScLogNormDist( int nMinParamCount );
-void ScLogNormInv();
-void ScTDist();
-void ScTDist_MS();
-void ScTDist_T( int nTails );
-void ScFDist();
-void ScFDist_LT();
-void ScChiDist( bool bODFF); // for LEGACY.CHIDIST, returns right tail
-void ScChiSqDist(); // returns left tail or density
-void ScChiSqDist_MS();
-void ScChiSqInv(); //invers to CHISQDIST
-void ScWeibull();
-void ScBetaDist();
-void ScBetaDist_MS();
-void ScFInv();
-void ScFInv_LT();
-void ScTInv( int nType );
-void ScChiInv();
-void ScBetaInv();
-void ScCritBinom();
-void ScNegBinomDist();
-void ScNegBinomDist_MS();
-void ScKurt();
-void ScHarMean();
-void ScGeoMean();
-void ScStandard();
-void ScSkew();
-void ScSkewp();
-void ScMedian();
-double GetMedian( ::std::vector<double> & rArray );
-double GetPercentileExclusive( ::std::vector<double> & rArray, double fPercentile );
-void GetNumberSequenceArray( sal_uInt8 nParamCount, ::std::vector<double>& rArray, bool bConvertTextInArray );
-void GetSortArray( sal_uInt8 nParamCount, ::std::vector<double>& rSortArray, ::std::vector<long>* pIndexOrder, bool bConvertTextInArray, bool bAllowEmptyArray );
-static void QuickSort(::std::vector<double>& rSortArray, ::std::vector<long>* pIndexOrder);
-void ScModalValue();
-void ScModalValue_Multi();
-void ScAveDev();
-void ScAggregate();
-void ScDevSq();
-void ScZTest();
-void ScTTest();
-void ScFTest();
-void ScChiTest();
-void ScRank( bool bAverage );
-void ScPercentile( bool bInclusive );
-void ScPercentrank( bool bInclusive );
-static double GetPercentrank( ::std::vector<double> & rArray, double fVal, bool bInclusive );
-void ScLarge();
-void ScSmall();
-void ScFrequency();
-void ScQuartile( bool bInclusive );
-void ScNormInv();
-void ScSNormInv();
-void ScConfidence();
-void ScConfidenceT();
-void ScTrimMean();
-void ScProbability();
-void ScCorrel();
-void ScCovarianceP();
-void ScCovarianceS();
-void ScPearson();
-void ScRSQ();
-void ScSTEYX();
-void ScSlope();
-void ScTrend();
-void ScInfo();
-void ScLenB();
-void ScRightB();
-void ScLeftB();
-void ScMidB();
-void ScReplaceB();
-void ScFindB();
-void ScSearchB();
-
-void ScFilterXML();
-void ScWebservice();
-void ScEncodeURL();
-void ScColor();
-void ScErf();
-void ScErfc();
-
-static const double fMaxGammaArgument;
-
-double GetGammaContFraction(double fA,double fX);
-double GetGammaSeries(double fA,double fX);
-double GetLowRegIGamma(double fA,double fX); // lower regularized incomplete gamma function, GAMMAQ
-double GetUpRegIGamma(double fA,double fX); // upper regularized incomplete gamma function, GAMMAP
-// probability density function; fLambda is "scale" parameter
-double GetGammaDistPDF(double fX, double fAlpha, double fLambda);
-// cumulative distribution function; fLambda is "scale" parameter
-double GetGammaDist(double fX, double fAlpha, double fLambda);
-double GetTInv( double fAlpha, double fSize, int nType );
+ @param bFinalResult
+ If TRUE, only a standard FormulaDoubleToken is pushed.
+ If FALSE, PushDouble() is used that may push either a
+ FormulaDoubleToken or a FormulaTypedDoubleToken.
+ */
+ void PushCellResultToken( bool bDisplayEmptyAsString, const ScAddress & rAddress,
+ short * pRetTypeExpr, sal_uLong * pRetIndexExpr, bool bFinalResult = false );
+
+ formula::FormulaConstTokenRef PopToken();
+ void Pop();
+ void PopError();
+ double PopDouble();
+ svl::SharedString PopString();
+ void ValidateRef( const ScSingleRefData & rRef );
+ void ValidateRef( const ScComplexRefData & rRef );
+ void ValidateRef( const ScRefList & rRefList );
+ void SingleRefToVars( const ScSingleRefData & rRef, SCCOL & rCol, SCROW & rRow, SCTAB & rTab );
+ void PopSingleRef( ScAddress& );
+ void PopSingleRef(SCCOL& rCol, SCROW &rRow, SCTAB& rTab);
+ void DoubleRefToRange( const ScComplexRefData&, ScRange&, bool bDontCheckForTableOp = false );
+ /** If formula::StackVar formula::svDoubleRef pop ScDoubleRefToken and return values of
+ ScComplexRefData.
+ Else if StackVar svRefList return values of the ScComplexRefData where
+ rRefInList is pointing to. rRefInList is incremented. If rRefInList was the
+ last element in list pop ScRefListToken and set rRefInList to 0, else
+ rParam is incremented (!) to allow usage as in
+ while(nParamCount--) PopDoubleRef(aRange,nParamCount,nRefInList);
+ */
+ void PopDoubleRef( ScRange & rRange, short & rParam, size_t & rRefInList );
+ void PopDoubleRef( ScRange&, bool bDontCheckForTableOp = false );
+ void DoubleRefToVars( const formula::FormulaToken* p,
+ SCCOL& rCol1, SCROW &rRow1, SCTAB& rTab1,
+ SCCOL& rCol2, SCROW &rRow2, SCTAB& rTab2 );
+ ScDBRangeBase* PopDBDoubleRef();
+ void PopDoubleRef(SCCOL& rCol1, SCROW &rRow1, SCTAB& rTab1,
+ SCCOL& rCol2, SCROW &rRow2, SCTAB& rTab2 );
+
+ void PopExternalSingleRef(sal_uInt16& rFileId, OUString& rTabName, ScSingleRefData& rRef);
+
+ /** Guarantees that nGlobalError is set if rToken could not be obtained. */
+ void PopExternalSingleRef(ScExternalRefCache::TokenRef& rToken, ScExternalRefCache::CellFormat* pFmt = nullptr);
+
+ /** Guarantees that nGlobalError is set if rToken could not be obtained. */
+ void PopExternalSingleRef(sal_uInt16& rFileId, OUString& rTabName, ScSingleRefData& rRef,
+ ScExternalRefCache::TokenRef& rToken, ScExternalRefCache::CellFormat* pFmt = nullptr);
+
+ void PopExternalDoubleRef(sal_uInt16& rFileId, OUString& rTabName, ScComplexRefData& rRef);
+ void PopExternalDoubleRef(ScExternalRefCache::TokenArrayRef& rArray);
+ void PopExternalDoubleRef(ScMatrixRef& rMat);
+ void GetExternalDoubleRef(sal_uInt16 nFileId, const OUString& rTabName, const ScComplexRefData& aData, ScExternalRefCache::TokenArrayRef& rArray);
+ bool PopDoubleRefOrSingleRef( ScAddress& rAdr );
+ void PopDoubleRefPushMatrix();
+ void PopRefListPushMatrixOrRef();
+ // If MatrixFormula: convert svDoubleRef to svMatrix, create JumpMatrix.
+ // Else convert area reference parameters marked as ForceArray to array.
+ // Returns true if JumpMatrix created.
+ bool ConvertMatrixParameters();
+ // If MatrixFormula: ConvertMatrixJumpConditionToMatrix()
+ inline void MatrixJumpConditionToMatrix();
+ // For MatrixFormula (preconditions already checked by
+ // MatrixJumpConditionToMatrix()): convert svDoubleRef to svMatrix, or if
+ // JumpMatrix currently in effect convert also other types to svMatrix so
+ // another JumpMatrix will be created by jump commands.
+ void ConvertMatrixJumpConditionToMatrix();
+ // If MatrixFormula or ForceArray: ConvertMatrixParameters()
+ inline bool MatrixParameterConversion();
+ ScMatrixRef PopMatrix();
+ sc::RangeMatrix PopRangeMatrix();
+ void QueryMatrixType(const ScMatrixRef& xMat, short& rRetTypeExpr, sal_uLong& rRetIndexExpr);
+
+ formula::FormulaToken* CreateDoubleOrTypedToken( double fVal );
+
+ void PushDouble(double nVal);
+ void PushInt( int nVal );
+ void PushStringBuffer( const sal_Unicode* pString );
+ void PushString( const OUString& rStr );
+ void PushString( const svl::SharedString& rString );
+ void PushSingleRef(SCCOL nCol, SCROW nRow, SCTAB nTab);
+ void PushDoubleRef(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
+ SCCOL nCol2, SCROW nRow2, SCTAB nTab2);
+ void PushExternalSingleRef(sal_uInt16 nFileId, const OUString& rTabName,
+ SCCOL nCol, SCROW nRow, SCTAB nTab);
+ void PushExternalDoubleRef(sal_uInt16 nFileId, const OUString& rTabName,
+ SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
+ SCCOL nCol2, SCROW nRow2, SCTAB nTab2);
+ void PushSingleRef( const ScRefAddress& rRef );
+ void PushDoubleRef( const ScRefAddress& rRef1, const ScRefAddress& rRef2 );
+ void PushMatrix( const sc::RangeMatrix& rMat );
+ void PushMatrix(const ScMatrixRef& pMat);
+ void PushError( FormulaError nError );
+ /// Raw stack type without default replacements.
+ formula::StackVar GetRawStackType();
+ /// Stack type with replacement of defaults, e.g. svMissing and formula::svEmptyCell will result in formula::svDouble.
+ formula::StackVar GetStackType();
+ // peek StackType of Parameter, Parameter 1 == TOS, 2 == TOS-1, ...
+ formula::StackVar GetStackType( sal_uInt8 nParam );
+ sal_uInt8 GetByte() { return cPar; }
+ // reverse order of stack
+ void ReverseStack( sal_uInt8 nParamCount );
+ // generates a position-dependent SingleRef out of a DoubleRef
+ bool DoubleRefToPosSingleRef( const ScRange& rRange, ScAddress& rAdr );
+ double GetDoubleFromMatrix(const ScMatrixRef& pMat);
+ double GetDouble();
+ double GetDoubleWithDefault(double nDefault);
+ bool IsMissing();
+ sal_Int32 double_to_int32(double fVal);
+ /** if GetDouble() not within int32 limits sets nGlobalError and returns SAL_MAX_INT32 */
+ sal_Int32 GetInt32();
+ /** if GetDoubleWithDefault() not within int32 limits sets nGlobalError and returns SAL_MAX_INT32 */
+ sal_Int32 GetInt32WithDefault( sal_Int32 nDefault );
+ /** if GetDouble() not within int16 limits sets nGlobalError and returns SAL_MAX_INT16 */
+ sal_Int16 GetInt16();
+ /** if GetDouble() not within uint32 limits sets nGlobalError and returns SAL_MAX_UINT32 */
+ sal_uInt32 GetUInt32();
+ bool GetBool() { return GetDouble() != 0.0; }
+ /// returns TRUE if double (or error, check nGlobalError), else FALSE
+ bool GetDoubleOrString( double& rValue, svl::SharedString& rString );
+ svl::SharedString GetString();
+ svl::SharedString GetStringFromMatrix(const ScMatrixRef& pMat);
+ svl::SharedString GetStringFromDouble( const double fVal);
+ // pop matrix and obtain one element, upper left or according to jump matrix
+ ScMatValType GetDoubleOrStringFromMatrix( double& rDouble, svl::SharedString& rString );
+ ScMatrixRef CreateMatrixFromDoubleRef( const formula::FormulaToken* pToken,
+ SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
+ SCCOL nCol2, SCROW nRow2, SCTAB nTab2 );
+ inline ScTokenMatrixMap& GetTokenMatrixMap();
+ static ScTokenMatrixMap* CreateTokenMatrixMap();
+ ScMatrixRef GetMatrix();
+ ScMatrixRef GetMatrix( short & rParam, size_t & rInRefList );
+ sc::RangeMatrix GetRangeMatrix();
+
+ void ScTableOp(); // repeated operations
+
+ // common helper functions
+
+ void CurFmtToFuncFmt()
+ { nFuncFmtType = nCurFmtType; nFuncFmtIndex = nCurFmtIndex; }
+
+ /** Check if a double is suitable as string position or length argument.
+
+ If fVal is Inf or NaN it is changed to -1, if it is less than 0 it is
+ sanitized to 0, if it is greater than some implementation defined max
+ string length it is sanitized to that max.
+
+ @return TRUE if double value fVal is suitable as string argument and was
+ not sanitized.
+ FALSE if not and fVal was adapted.
+ */
+ static inline bool CheckStringPositionArgument( double & fVal );
+
+ /** Obtain a double suitable as string position or length argument.
+ Returns -1 if the number is Inf or NaN or less than 0 or greater than some
+ implementation defined max string length. */
+ inline double GetStringPositionArgument();
+
+ // Check for String overflow of rResult+rAdd and set error and erase rResult
+ // if so. Return true if ok, false if overflow
+ inline bool CheckStringResultLen( OUString& rResult, const OUString& rAdd );
+ // Set error according to rVal, and set rVal to 0.0 if there was an error.
+ inline void TreatDoubleError( double& rVal );
+ // Lookup using ScLookupCache, @returns true if found and result address
+ bool LookupQueryWithCache( ScAddress & o_rResultPos,
+ const ScQueryParam & rParam ) const;
+
+ void ScIfJump();
+ void ScIfError( bool bNAonly );
+ void ScChooseJump();
+
+ // Be sure to only call this if pStack[sp-nStackLevel] really contains a
+ // ScJumpMatrixToken, no further checks are applied!
+ // Returns true if last jump was executed and result matrix pushed.
+ bool JumpMatrix( short nStackLevel );
+
+ double Compare( ScQueryOp eOp );
+ /** @param pOptions
+ NULL means case sensitivity document option is to be used!
+ */
+ sc::RangeMatrix CompareMat( ScQueryOp eOp, sc::CompareOptions* pOptions = nullptr );
+ ScMatrixRef QueryMat( const ScMatrixRef& pMat, sc::CompareOptions& rOptions );
+ void ScEqual();
+ void ScNotEqual();
+ void ScLess();
+ void ScGreater();
+ void ScLessEqual();
+ void ScGreaterEqual();
+ void ScAnd();
+ void ScOr();
+ void ScXor();
+ void ScNot();
+ void ScNeg();
+ void ScPercentSign();
+ void ScIntersect();
+ void ScRangeFunc();
+ void ScUnionFunc();
+ void ScPi();
+ void ScRandom();
+ void ScTrue();
+ void ScFalse();
+ void ScDeg();
+ void ScRad();
+ void ScSin();
+ void ScCos();
+ void ScTan();
+ void ScCot();
+ void ScArcSin();
+ void ScArcCos();
+ void ScArcTan();
+ void ScArcCot();
+ void ScSinHyp();
+ void ScCosHyp();
+ void ScTanHyp();
+ void ScCotHyp();
+ void ScArcSinHyp();
+ void ScArcCosHyp();
+ void ScArcTanHyp();
+ void ScArcCotHyp();
+ void ScCosecant();
+ void ScSecant();
+ void ScCosecantHyp();
+ void ScSecantHyp();
+ void ScExp();
+ void ScLn();
+ void ScLog10();
+ void ScSqrt();
+ void ScIsEmpty();
+ bool IsString();
+ void ScIsString();
+ void ScIsNonString();
+ void ScIsLogical();
+ void ScType();
+ void ScCell();
+ void ScCellExternal();
+ void ScIsRef();
+ void ScIsValue();
+ void ScIsFormula();
+ void ScFormula();
+ void ScRoman();
+ void ScArabic();
+ void ScIsNV();
+ void ScIsErr();
+ void ScIsError();
+ bool IsEven();
+ void ScIsEven();
+ void ScIsOdd();
+ void ScN();
+ void ScCode();
+ void ScTrim();
+ void ScUpper();
+ void ScProper();
+ void ScLower();
+ void ScLen();
+ void ScT();
+ void ScValue();
+ void ScNumberValue();
+ void ScClean();
+ void ScChar();
+ void ScJis();
+ void ScAsc();
+ void ScUnicode();
+ void ScUnichar();
+ void ScMin( bool bTextAsZero = false );
+ void ScMax( bool bTextAsZero = false );
+ /** Check for array of references to determine the maximum size of a return
+ column vector if in array context. */
+ size_t GetRefListArrayMaxSize( short nParamCount );
+ /** Switch to array reference list if current TOS is one and create/init or
+ update matrix and return true. Else return false. */
+ bool SwitchToArrayRefList( ScMatrixRef& xResMat, SCSIZE nMatRows, double fCurrent,
+ const std::function<void( SCSIZE i, double fCurrent )>& MatOpFunc, bool bDoMatOp );
+ void IterateParameters( ScIterFunc, bool bTextAsZero = false );
+ void ScSumSQ();
+ void ScSum();
+ void ScProduct();
+ void ScAverage( bool bTextAsZero = false );
+ void ScCount();
+ void ScCount2();
+ void GetStVarParams( bool bTextAsZero, double(*VarResult)( double fVal, size_t nValCount ) );
+ void ScVar( bool bTextAsZero = false );
+ void ScVarP( bool bTextAsZero = false );
+ void ScStDev( bool bTextAsZero = false );
+ void ScStDevP( bool bTextAsZero = false );
+ void ScRawSubtract();
+ void ScColumns();
+ void ScRows();
+ void ScSheets();
+ void ScColumn();
+ void ScRow();
+ void ScSheet();
+ void ScMatch();
+ void IterateParametersIf( ScIterFuncIf );
+ void ScCountIf();
+ void ScSumIf();
+ void ScAverageIf();
+ void IterateParametersIfs( double(*ResultFunc)( const sc::ParamIfsResult& rRes ) );
+ void ScSumIfs();
+ void ScAverageIfs();
+ void ScCountIfs();
+ void ScCountEmptyCells();
+ void ScLookup();
+ void ScHLookup();
+ void ScVLookup();
+ void ScSubTotal();
+
+ // If upon call rMissingField==true then the database field parameter may be
+ // missing (Xcl DCOUNT() syntax), or may be faked as missing by having the
+ // value 0.0 or being exactly the entire database range reference (old SO
+ // compatibility). If this was the case then rMissingField is set to true upon
+ // return. If rMissingField==false upon call all "missing cases" are considered
+ // to be an error.
+ std::unique_ptr<ScDBQueryParamBase> GetDBParams( bool& rMissingField );
+
+ void DBIterator( ScIterFunc );
+ void ScDBSum();
+ void ScDBCount();
+ void ScDBCount2();
+ void ScDBAverage();
+ void ScDBGet();
+ void ScDBMax();
+ void ScDBMin();
+ void ScDBProduct();
+ void GetDBStVarParams( double& rVal, double& rValCount );
+ void ScDBStdDev();
+ void ScDBStdDevP();
+ void ScDBVar();
+ void ScDBVarP();
+ void ScIndirect();
+ void ScAddressFunc();
+ void ScOffset();
+ void ScIndex();
+ void ScMultiArea();
+ void ScAreas();
+ void ScCurrency();
+ void ScReplace();
+ void ScFixed();
+ void ScFind();
+ void ScExact();
+ void ScLeft();
+ void ScRight();
+ void ScSearch();
+ void ScMid();
+ void ScText();
+ void ScSubstitute();
+ void ScRept();
+ void ScConcat();
+ void ScConcat_MS();
+ void ScTextJoin_MS();
+ void ScIfs_MS();
+ void ScSwitch_MS();
+ void ScMinIfs_MS();
+ void ScMaxIfs_MS();
+ void ScExternal();
+ void ScMissing();
+ void ScMacro();
+ bool SetSbxVariable( SbxVariable* pVar, const ScAddress& );
+ FormulaError GetErrorType();
+ void ScErrorType();
+ void ScErrorType_ODF();
+ void ScDBArea();
+ void ScColRowNameAuto();
+ void ScGetPivotData();
+ void ScHyperLink();
+ void ScBahtText();
+ void ScBitAnd();
+ void ScBitOr();
+ void ScBitXor();
+ void ScBitRshift();
+ void ScBitLshift();
+ void ScTTT();
+ void ScDebugVar();
+
+ /** Obtain the date serial number for a given date.
+ @param bStrict
+ If false, nYear < 100 takes the two-digit year setting into account,
+ and rollover of invalid calendar dates takes place, e.g. 1999-02-31 =>
+ 1999-03-03.
+ If true, the date passed must be a valid Gregorian calendar date. No
+ two-digit expanding or rollover is done.
+
+ Date must be Gregorian, i.e. >= 1582-10-15.
+ */
+ double GetDateSerial( sal_Int16 nYear, sal_Int16 nMonth, sal_Int16 nDay, bool bStrict );
+
+ void ScGetActDate();
+ void ScGetActTime();
+ void ScGetYear();
+ void ScGetMonth();
+ void ScGetDay();
+ void ScGetDayOfWeek();
+ void ScGetWeekOfYear();
+ void ScGetIsoWeekOfYear();
+ void ScWeeknumOOo();
+ void ScEasterSunday();
+ FormulaError GetWeekendAndHolidayMasks( const sal_uInt8 nParamCount, const sal_uInt32 nNullDate,
+ ::std::vector<double>& rSortArray, bool bWeekendMask[ 7 ] );
+ FormulaError GetWeekendAndHolidayMasks_MS( const sal_uInt8 nParamCount, const sal_uInt32 nNullDate,
+ ::std::vector<double>& rSortArray, bool bWeekendMask[ 7 ], bool bWorkdayFunction );
+ static inline sal_Int16 GetDayOfWeek( sal_Int32 n );
+ void ScNetWorkdays( bool bOOXML_Version );
+ void ScWorkday_MS();
+ void ScGetHour();
+ void ScGetMin();
+ void ScGetSec();
+ void ScPlusMinus();
+ void ScAbs();
+ void ScInt();
+ void ScEven();
+ void ScOdd();
+ void ScCeil( bool bODFF );
+ void ScCeil_MS();
+ void ScCeil_Precise();
+ void ScFloor( bool bODFF );
+ void ScFloor_MS();
+ void ScFloor_Precise();
+ void RoundNumber( rtl_math_RoundingMode eMode );
+ void ScRound();
+ void ScRoundUp();
+ void ScRoundDown();
+ void ScGetDateValue();
+ void ScGetTimeValue();
+ void ScArcTan2();
+ void ScLog();
+ void ScGetDate();
+ void ScGetTime();
+ void ScGetDiffDate();
+ void ScGetDiffDate360();
+ void ScGetDateDif();
+ void ScPower();
+ void ScAmpersand();
+ void ScAdd();
+ void ScSub();
+ void ScMul();
+ void ScDiv();
+ void ScPow();
+ void ScCurrent();
+ void ScStyle();
+ void ScDde();
+ void ScBase();
+ void ScDecimal();
+ void ScConvertOOo();
+ void ScEuroConvert();
+ void ScRoundSignificant();
+
+ // financial functions
+ void ScNPV();
+ void ScIRR();
+ void ScMIRR();
+ void ScISPMT();
+
+ static double ScGetBw(double fInterest, double fZzr, double fRmz,
+ double fZw, bool bPayInAdvance);
+ void ScPV();
+ void ScSYD();
+ static double ScGetGDA(double fWert, double fRest, double fDauer,
+ double fPeriode, double fFactor);
+ void ScDDB();
+ void ScDB();
+ static double ScInterVDB(double fWert,double fRest,double fDauer,double fDauer1,
+ double fPeriode,double fFactor);
+ void ScVDB();
+ void ScPDuration();
+ void ScSLN();
+ static double ScGetRmz(double fInterest, double fZzr, double fBw,
+ double fZw, bool bPayInAdvance);
+ void ScPMT();
+ void ScRRI();
+ static double ScGetZw(double fInterest, double fZzr, double fRmz,
+ double fBw, bool bFlag);
+ void ScFV();
+ void ScNper();
+ static bool RateIteration(double fNper, double fPayment, double fPv,
+ double fFv, bool bPayType, double& fGuess);
+ void ScRate();
+ double ScGetCompoundInterest(double fInterest, double fZr, double fZzr, double fBw,
+ double fZw, bool bPayInAdvance, double& fRmz);
+ void ScIpmt();
+ void ScPpmt();
+ void ScCumIpmt();
+ void ScCumPrinc();
+ void ScEffect();
+ void ScNominal();
+ void ScMod();
+ void ScIntercept();
+ void ScGCD();
+ void ScLCM();
+
+ // matrix functions
+ void ScMatValue();
+ static void MEMat(const ScMatrixRef& mM, SCSIZE n);
+ void ScMatDet();
+ void ScMatInv();
+ void ScMatMult();
+ void ScMatTrans();
+ void ScEMat();
+ void ScMatRef();
+ ScMatrixRef MatConcat(const ScMatrixRef& pMat1, const ScMatrixRef& pMat2);
+ void ScSumProduct();
+ void ScSumX2MY2();
+ void ScSumX2DY2();
+ void ScSumXMY2();
+ void ScGrowth();
+ bool CalculateSkew(double& fSum,double& fCount,double& vSum,std::vector<double>& values);
+ void CalculateSkewOrSkewp( bool bSkewp );
+ void CalculateSlopeIntercept(bool bSlope);
+ void CalculateSmallLarge(bool bSmall);
+ void CalculatePearsonCovar( bool _bPearson, bool _bStexy, bool _bSample ); //fdo#70000 argument _bSample is ignored if _bPearson == true
+ bool CalculateTest( bool _bTemplin
+ ,const SCSIZE nC1, const SCSIZE nC2,const SCSIZE nR1,const SCSIZE nR2
+ ,const ScMatrixRef& pMat1,const ScMatrixRef& pMat2
+ ,double& fT,double& fF);
+ void CalculateLookup(bool bHLookup);
+ bool FillEntry(ScQueryEntry& rEntry);
+ void CalculateAddSub(bool _bSub);
+ void CalculateTrendGrowth(bool _bGrowth);
+ void CalculateRGPRKP(bool _bRKP);
+ void CalculateSumX2MY2SumX2DY2(bool _bSumX2DY2);
+ void CalculateMatrixValue(const ScMatrix* pMat,SCSIZE nC,SCSIZE nR);
+ bool CheckMatrix(bool _bLOG,sal_uInt8& nCase,SCSIZE& nCX,SCSIZE& nCY,SCSIZE& nRX,SCSIZE& nRY,SCSIZE& M,SCSIZE& N,ScMatrixRef& pMatX,ScMatrixRef& pMatY);
+ void ScLinest();
+ void ScLogest();
+ void ScForecast();
+ void ScForecast_Ets( ScETSType eETSType );
+ void ScNoName();
+ void ScBadName();
+ // Statistics:
+ static double taylor(const double* pPolynom, sal_uInt16 nMax, double x);
+ static double gauss(double x);
+
+ public:
+ static SC_DLLPUBLIC double phi(double x);
+ static SC_DLLPUBLIC double integralPhi(double x);
+ static SC_DLLPUBLIC double gaussinv(double x);
+ static SC_DLLPUBLIC double GetPercentile( ::std::vector<double> & rArray, double fPercentile );
+
+
+ private:
+ double GetBetaDist(double x, double alpha, double beta); //cumulative distribution function
+ double GetBetaDistPDF(double fX, double fA, double fB); //probability density function)
+ double GetChiDist(double fChi, double fDF); // for LEGACY.CHIDIST, returns right tail
+ double GetChiSqDistCDF(double fX, double fDF); // for CHISQDIST, returns left tail
+ static double GetChiSqDistPDF(double fX, double fDF); // probability density function
+ double GetFDist(double x, double fF1, double fF2);
+ double GetTDist( double T, double fDF, int nType );
+ double Fakultaet(double x);
+ static double BinomKoeff(double n, double k);
+ double GetGamma(double x);
+ static double GetLogGamma(double x);
+ double GetBeta(double fAlpha, double fBeta);
+ static double GetLogBeta(double fAlpha, double fBeta);
+ double GetBinomDistPMF(double x, double n, double p); //probability mass function
+ double GetHypGeomDist( double x, double n, double M, double N );
+ void ScLogGamma();
+ void ScGamma();
+ void ScPhi();
+ void ScGauss();
+ void ScStdNormDist();
+ void ScStdNormDist_MS();
+ void ScFisher();
+ void ScFisherInv();
+ void ScFact();
+ void ScNormDist( int nMinParamCount );
+ void ScGammaDist( bool bODFF );
+ void ScGammaInv();
+ void ScExpDist();
+ void ScBinomDist();
+ void ScPoissonDist( bool bODFF );
+ void ScCombin();
+ void ScCombinA();
+ void ScPermut();
+ void ScPermutationA();
+ void ScB();
+ void ScHypGeomDist( int nMinParamCount );
+ void ScLogNormDist( int nMinParamCount );
+ void ScLogNormInv();
+ void ScTDist();
+ void ScTDist_MS();
+ void ScTDist_T( int nTails );
+ void ScFDist();
+ void ScFDist_LT();
+ void ScChiDist( bool bODFF); // for LEGACY.CHIDIST, returns right tail
+ void ScChiSqDist(); // returns left tail or density
+ void ScChiSqDist_MS();
+ void ScChiSqInv(); //invers to CHISQDIST
+ void ScWeibull();
+ void ScBetaDist();
+ void ScBetaDist_MS();
+ void ScFInv();
+ void ScFInv_LT();
+ void ScTInv( int nType );
+ void ScChiInv();
+ void ScBetaInv();
+ void ScCritBinom();
+ void ScNegBinomDist();
+ void ScNegBinomDist_MS();
+ void ScKurt();
+ void ScHarMean();
+ void ScGeoMean();
+ void ScStandard();
+ void ScSkew();
+ void ScSkewp();
+ void ScMedian();
+ double GetMedian( ::std::vector<double> & rArray );
+ double GetPercentileExclusive( ::std::vector<double> & rArray, double fPercentile );
+ void GetNumberSequenceArray( sal_uInt8 nParamCount, ::std::vector<double>& rArray, bool bConvertTextInArray );
+ void GetSortArray( sal_uInt8 nParamCount, ::std::vector<double>& rSortArray, ::std::vector<long>* pIndexOrder, bool bConvertTextInArray, bool bAllowEmptyArray );
+ static void QuickSort(::std::vector<double>& rSortArray, ::std::vector<long>* pIndexOrder);
+ void ScModalValue();
+ void ScModalValue_Multi();
+ void ScAveDev();
+ void ScAggregate();
+ void ScDevSq();
+ void ScZTest();
+ void ScTTest();
+ void ScFTest();
+ void ScChiTest();
+ void ScRank( bool bAverage );
+ void ScPercentile( bool bInclusive );
+ void ScPercentrank( bool bInclusive );
+ static double GetPercentrank( ::std::vector<double> & rArray, double fVal, bool bInclusive );
+ void ScLarge();
+ void ScSmall();
+ void ScFrequency();
+ void ScQuartile( bool bInclusive );
+ void ScNormInv();
+ void ScSNormInv();
+ void ScConfidence();
+ void ScConfidenceT();
+ void ScTrimMean();
+ void ScProbability();
+ void ScCorrel();
+ void ScCovarianceP();
+ void ScCovarianceS();
+ void ScPearson();
+ void ScRSQ();
+ void ScSTEYX();
+ void ScSlope();
+ void ScTrend();
+ void ScInfo();
+ void ScLenB();
+ void ScRightB();
+ void ScLeftB();
+ void ScMidB();
+ void ScReplaceB();
+ void ScFindB();
+ void ScSearchB();
+
+ void ScFilterXML();
+ void ScWebservice();
+ void ScEncodeURL();
+ void ScColor();
+ void ScErf();
+ void ScErfc();
+
+ static const double fMaxGammaArgument;
+
+ double GetGammaContFraction(double fA,double fX);
+ double GetGammaSeries(double fA,double fX);
+ double GetLowRegIGamma(double fA,double fX); // lower regularized incomplete gamma function, GAMMAQ
+ double GetUpRegIGamma(double fA,double fX); // upper regularized incomplete gamma function, GAMMAP
+ // probability density function; fLambda is "scale" parameter
+ double GetGammaDistPDF(double fX, double fAlpha, double fLambda);
+ // cumulative distribution function; fLambda is "scale" parameter
+ double GetGammaDist(double fX, double fAlpha, double fLambda);
+ double GetTInv( double fAlpha, double fSize, int nType );
public:
ScInterpreter( ScFormulaCell* pCell, ScDocument* pDoc,