diff options
Diffstat (limited to 'sc/source/core/inc/interpre.hxx')
-rw-r--r-- | sc/source/core/inc/interpre.hxx | 922 |
1 files changed, 0 insertions, 922 deletions
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx deleted file mode 100644 index 7caee7518..000000000 --- a/sc/source/core/inc/interpre.hxx +++ /dev/null @@ -1,922 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef SC_INTERPRE_HXX -#define SC_INTERPRE_HXX - -#include <math.h> -#include <rtl/math.hxx> -#include "formula/errorcodes.hxx" -#include "cell.hxx" -#include "scdll.hxx" -#include "document.hxx" -#include "scmatrix.hxx" -#include "externalrefmgr.hxx" - -#include <math.h> -#include <map> - -class ScDocument; -class SbxVariable; -class ScBaseCell; -class ScFormulaCell; -class SvNumberFormatter; -class ScDBRangeBase; -struct MatrixDoubleOp; -struct ScQueryParam; -struct ScDBQueryParamBase; - -struct ScCompare -{ - double nVal[2]; - String* pVal[2]; - sal_Bool bVal[2]; - sal_Bool bEmpty[2]; - ScCompare( String* p1, String* p2 ) - { - pVal[ 0 ] = p1; - pVal[ 1 ] = p2; - bEmpty[0] = false; - bEmpty[1] = false; - } -}; - -struct ScCompareOptions -{ - ScQueryEntry aQueryEntry; - bool bRegEx; - bool bMatchWholeCell; - bool bIgnoreCase; - - ScCompareOptions( ScDocument* pDoc, const ScQueryEntry& rEntry, bool bReg ); -private: - // Not implemented, prevent usage. - ScCompareOptions(); - ScCompareOptions( const ScCompareOptions & ); - ScCompareOptions& operator=( const ScCompareOptions & ); -}; - -class ScToken; - -#define MAXSTACK (4096 / sizeof(formula::FormulaToken*)) - -class ScTokenStack -{ -public: - DECL_FIXEDMEMPOOL_NEWDEL( ScTokenStack ) - formula::FormulaToken* pPointer[ MAXSTACK ]; -}; - -enum ScIterFunc { - ifSUM, // Add up - ifSUMSQ, // Sums of squares - ifPRODUCT, // Product - ifAVERAGE, // Average - ifCOUNT, // Count Values - ifCOUNT2, // Count Values (not empty) - ifMIN, // Minimum - ifMAX // Maximum -}; - -struct FormulaTokenRef_less -{ - bool operator () ( const formula::FormulaConstTokenRef& r1, const formula::FormulaConstTokenRef& r2 ) const - { return &r1 < &r2; } -}; -typedef ::std::map< const formula::FormulaConstTokenRef, formula::FormulaTokenRef, FormulaTokenRef_less> ScTokenMatrixMap; - -class ScInterpreter -{ - // distibution function objects need the GetxxxDist methods - friend class ScGammaDistFunction; - friend class ScBetaDistFunction; - friend class ScTDistFunction; - friend class ScFDistFunction; - friend class ScChiDistFunction; - friend class ScChiSqDistFunction; - -public: - DECL_FIXEDMEMPOOL_NEWDEL( ScInterpreter ) - - static void GlobalExit(); // aus ScGlobal::Clear() gerufen - - /// Could string be a regular expression? - /// If pDoc!=NULL the document options are taken into account and if - /// RegularExpressions are disabled the function returns sal_False regardless - /// of the string content. - static sal_Bool MayBeRegExp( const String& rStr, const ScDocument* pDoc ); - - /// Fail safe division, returning an errDivisionByZero coded into a double - /// if denominator is 0.0 - static inline double div( const double& fNumerator, const double& fDenominator ); - - ScMatrixRef GetNewMat(SCSIZE nC, SCSIZE nR); - - enum VolatileType { - VOLATILE, - VOLATILE_MACRO, - NOT_VOLATILE - }; - - VolatileType GetVolatileType() const; - -private: - static ScTokenStack* pGlobalStack; - static sal_Bool bGlobalStackInUse; - - formula::FormulaTokenIterator aCode; - ScAddress aPos; - ScTokenArray& rArr; - ScDocument* pDok; - formula::FormulaTokenRef xResult; - ScJumpMatrix* pJumpMatrix; // currently active array condition, if any - ScTokenMatrixMap* pTokenMatrixMap; // map ScToken* to formula::FormulaTokenRef if in array condition - ScFormulaCell* pMyFormulaCell; // the cell of this formula expression - SvNumberFormatter* pFormatter; - - const formula::FormulaToken* - pCur; // current token - String aTempStr; // for GetString() - ScTokenStack* pStackObj; // contains the stacks - formula::FormulaToken** pStack; // the current stack - sal_uInt16 nGlobalError; // global (local to this formula expression) error - sal_uInt16 sp; // stack pointer - sal_uInt16 maxsp; // the maximal used stack pointer - sal_uLong nFuncFmtIndex; // NumberFormatIndex of a function - sal_uLong nCurFmtIndex; // current NumberFormatIndex - sal_uLong nRetFmtIndex; // NumberFormatIndex of an expression, if any - short nFuncFmtType; // NumberFormatType of a function - short nCurFmtType; // current NumberFormatType - short nRetFmtType; // NumberFormatType of an expression - sal_uInt16 mnStringNoValueError; // the error set in ConvertStringToValue() if no value - sal_Bool glSubTotal; // flag for subtotal functions - sal_uInt8 cPar; // current count of parameters - sal_Bool bCalcAsShown; // precision as shown - sal_Bool bMatrixFormula; // formula cell is a matrix formula - - VolatileType meVolaileType; - -//---------------------------------Funktionen in interpre.cxx--------- -// nMust <= nAct <= nMax ? ok : PushError -inline sal_Bool MustHaveParamCount( short nAct, short nMust ); -inline sal_Bool MustHaveParamCount( short nAct, short nMust, short nMax ); -inline sal_Bool MustHaveParamCountMin( short nAct, short nMin ); -void PushParameterExpected(); -void PushIllegalParameter(); -void PushIllegalArgument(); -void PushNoValue(); -void PushNA(); -//------------------------------------------------------------------------- -// Funktionen fuer den Zugriff auf das Document -//------------------------------------------------------------------------- -void ReplaceCell( ScAddress& ); // for TableOp -void ReplaceCell( SCCOL& rCol, SCROW& rRow, SCTAB& rTab ); // for TableOp -sal_Bool IsTableOpInRange( const ScRange& ); -sal_uLong GetCellNumberFormat( const ScAddress&, const ScBaseCell* ); -double ConvertStringToValue( const String& ); -double GetCellValue( const ScAddress&, const ScBaseCell* ); -double GetCellValueOrZero( const ScAddress&, const ScBaseCell* ); -double GetValueCellValue( const ScAddress&, const ScValueCell* ); -ScBaseCell* GetCell( const ScAddress& rPos ) - { return pDok->GetCell( rPos ); } -void GetCellString( String& rStr, const ScBaseCell* pCell ); -inline sal_uInt16 GetCellErrCode( const ScBaseCell* pCell ) - { return pCell ? pCell->GetErrorCode() : 0; } -inline CellType GetCellType( const ScBaseCell* pCell ) - { return pCell ? pCell->GetCellType() : CELLTYPE_NONE; } -/// Really empty or inherited emptiness. -inline sal_Bool HasCellEmptyData( const ScBaseCell* pCell ) - { return pCell ? pCell->HasEmptyData() : sal_True; } -/// This includes inherited emptiness, which usually is regarded as value! -inline sal_Bool HasCellValueData( const ScBaseCell* pCell ) - { return pCell ? pCell->HasValueData() : false; } -/// Not empty and not value. -inline sal_Bool HasCellStringData( const ScBaseCell* pCell ) - { return pCell ? pCell->HasStringData() : false; } - -sal_Bool CreateDoubleArr(SCCOL nCol1, SCROW nRow1, SCTAB nTab1, - SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt8* pCellArr); -sal_Bool CreateStringArr(SCCOL nCol1, SCROW nRow1, SCTAB nTab1, - SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt8* pCellArr); -sal_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( 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( formula::FormulaToken& r ); - -/** Clones the token to be pushed or substitutes with formula::FormulaErrorToken if - nGlobalError is set and the token passed is not formula::FormulaErrorToken. */ -void PushTempToken( const formula::FormulaToken& ); - -/** 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 errStackOverflow or if substituted with formula::FormulaErrorToken! */ -void PushTempToken( formula::FormulaToken* ); - -/** 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 errStackOverflow! */ -void PushTempTokenWithoutError( 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. */ -inline bool IfErrorPushError() -{ - if (nGlobalError) - { - PushTempTokenWithoutError( new formula::FormulaErrorToken( nGlobalError)); - return true; - } - return false; -} - -/** Obtain cell result / content from address and push as temp token. - bDisplayEmptyAsString is passed to ScEmptyCell in case of an empty cell - result. Also obtain number format and type if _both_, type and index - pointer, are not NULL. */ -void PushCellResultToken( bool bDisplayEmptyAsString, const ScAddress & rAddress, - short * pRetTypeExpr, sal_uLong * pRetIndexExpr ); - -formula::FormulaTokenRef PopToken(); -void Pop(); -void PopError(); -double PopDouble(); -const String& 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&, sal_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&, sal_Bool bDontCheckForTableOp = false ); -void DoubleRefToVars( const ScToken* p, - SCCOL& rCol1, SCROW &rRow1, SCTAB& rTab1, - SCCOL& rCol2, SCROW &rRow2, SCTAB& rTab2, - sal_Bool bDontCheckForTableOp = false ); -ScDBRangeBase* PopDBDoubleRef(); -void PopDoubleRef(SCCOL& rCol1, SCROW &rRow1, SCTAB& rTab1, - SCCOL& rCol2, SCROW &rRow2, SCTAB& rTab2, - sal_Bool bDontCheckForTableOp = false ); -void PopExternalSingleRef(sal_uInt16& rFileId, String& rTabName, ScSingleRefData& rRef); -void PopExternalSingleRef(ScExternalRefCache::TokenRef& rToken, ScExternalRefCache::CellFormat* pFmt = NULL); -void PopExternalDoubleRef(sal_uInt16& rFileId, String& rTabName, ScComplexRefData& rRef); -void PopExternalDoubleRef(ScExternalRefCache::TokenArrayRef& rArray); -void PopExternalDoubleRef(ScMatrixRef& rMat); -void GetExternalDoubleRef(sal_uInt16 nFileId, const String& rTabName, const ScComplexRefData& aData, ScExternalRefCache::TokenArrayRef& rArray); -sal_Bool PopDoubleRefOrSingleRef( ScAddress& rAdr ); -void PopDoubleRefPushMatrix(); -// If MatrixFormula: convert formula::svDoubleRef to svMatrix, create JumpMatrix. -// Else convert area reference parameters marked as ForceArray to array. -// Returns sal_True if JumpMatrix created. -bool ConvertMatrixParameters(); -inline void MatrixDoubleRefToMatrix(); // if MatrixFormula: PopDoubleRefPushMatrix -// If MatrixFormula or ForceArray: ConvertMatrixParameters() -inline bool MatrixParameterConversion(); -ScMatrixRef PopMatrix(); -void QueryMatrixType(ScMatrixRef& xMat, short& rRetTypeExpr, sal_uLong& rRetIndexExpr); -//void PushByte(BYTE nVal); -void PushDouble(double nVal); -void PushInt( int nVal ); -void PushStringBuffer( const sal_Unicode* pString ); -void PushString( const String& 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 String& rTabName, - SCCOL nCol, SCROW nRow, SCTAB nTab); -void PushExternalDoubleRef(sal_uInt16 nFileId, const String& rTabName, - SCCOL nCol1, SCROW nRow1, SCTAB nTab1, - SCCOL nCol2, SCROW nRow2, SCTAB nTab2); -void PushMatrix(const ScMatrixRef& pMat); -void PushError( sal_uInt16 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; } -// generiert aus DoubleRef positionsabhaengige SingleRef -sal_Bool DoubleRefToPosSingleRef( const ScRange& rRange, ScAddress& rAdr ); -double GetDoubleFromMatrix(const ScMatrixRef& pMat); -double GetDouble(); -double GetDoubleWithDefault(double nDefault); -sal_Bool IsMissing(); -sal_Bool GetBool() { return GetDouble() != 0.0; } -const String& GetString(); -const String& GetStringFromMatrix(const ScMatrixRef& pMat); -// pop matrix and obtain one element, upper left or according to jump matrix -ScMatValType GetDoubleOrStringFromMatrix( double& rDouble, String& rString ); -ScMatrixRef CreateMatrixFromDoubleRef( const formula::FormulaToken* pToken, - SCCOL nCol1, SCROW nRow1, SCTAB nTab1, - SCCOL nCol2, SCROW nRow2, SCTAB nTab2 ); -inline ScTokenMatrixMap& GetTokenMatrixMap(); -ScTokenMatrixMap* CreateTokenMatrixMap(); -ScMatrixRef GetMatrix(); -void ScTableOp(); // Mehrfachoperationen -void ScErrCell(); // Sonderbehandlung - // Fehlerzelle -//-----------------------------allgemeine Hilfsfunktionen -void SetMaxIterationCount(sal_uInt16 n); -inline void CurFmtToFuncFmt() - { nFuncFmtType = nCurFmtType; nFuncFmtIndex = nCurFmtIndex; } -// Check for String overflow of rResult+rAdd and set error and erase rResult -// if so. Return sal_True if ok, sal_False if overflow -inline sal_Bool CheckStringResultLen( String& rResult, const String& 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 sal_True if found and result address -bool LookupQueryWithCache( ScAddress & o_rResultPos, - const ScQueryParam & rParam ) const; - -//---------------------------------Funktionen in interpr1.cxx--------- -void ScIfJump(); -void ScChoseJump(); - -// 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 ); - -/** @param pOptions - NULL means case sensitivity document option is to be used! - */ -double CompareFunc( const ScCompare& rComp, ScCompareOptions* pOptions = NULL ); -double Compare(); -/** @param pOptions - NULL means case sensitivity document option is to be used! - */ -ScMatrixRef CompareMat( ScCompareOptions* pOptions = NULL ); -ScMatrixRef QueryMat( const ScMatrixRef& pMat, ScCompareOptions& rOptions ); -void ScEqual(); -void ScNotEqual(); -void ScLess(); -void ScGreater(); -void ScLessEqual(); -void ScGreaterEqual(); -void ScAnd(); -void ScOr(); -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 ScExp(); -void ScLn(); -void ScLog10(); -void ScSqrt(); -void ScIsEmpty(); -short IsString(); -void ScIsString(); -void ScIsNonString(); -void ScIsLogical(); -void ScType(); -void ScCell(); -void ScIsRef(); -void ScIsValue(); -void ScIsFormula(); -void ScFormula(); -void ScRoman(); -void ScArabic(); -void ScIsNV(); -void ScIsErr(); -void ScIsError(); -short IsEven(); -void ScIsEven(); -void ScIsOdd(); -void ScN(); -void ScCode(); -void ScTrim(); -void ScUpper(); -void ScPropper(); -void ScLower(); -void ScLen(); -void ScT(); -void ScValue(); -void ScClean(); -void ScChar(); -void ScJis(); -void ScAsc(); -void ScUnicode(); -void ScUnichar(); -void ScMin( sal_Bool bTextAsZero = false ); -void ScMax( sal_Bool bTextAsZero = false ); -double IterateParameters( ScIterFunc, sal_Bool bTextAsZero = false ); -void ScSumSQ(); -void ScSum(); -void ScProduct(); -void ScAverage( sal_Bool bTextAsZero = false ); -void ScCount(); -void ScCount2(); -void GetStVarParams( double& rVal, double& rValCount, sal_Bool bTextAsZero = false ); -void ScVar( sal_Bool bTextAsZero = false ); -void ScVarP( sal_Bool bTextAsZero = false ); -void ScStDev( sal_Bool bTextAsZero = false ); -void ScStDevP( sal_Bool bTextAsZero = false ); -void ScColumns(); -void ScRows(); -void ScTables(); -void ScColumn(); -void ScRow(); -void ScTable(); -void ScMatch(); -void ScCountIf(); -void ScSumIf(); -void ScCountEmptyCells(); -void ScLookup(); -void ScHLookup(); -void ScVLookup(); -void ScSubTotal(); - -// If upon call rMissingField==sal_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 sal_True upon -// return. If rMissingField==sal_False upon call all "missing cases" are considered -// to be an error. -ScDBQueryParamBase* GetDBParams( sal_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 ScExternal(); -void ScMissing(); -void ScMacro(); -sal_Bool SetSbxVariable( SbxVariable* pVar, const ScAddress& ); -sal_Bool SetSbxVariable( SbxVariable* pVar, SCCOL nCol, SCROW nRow, SCTAB nTab ); -void ScErrorType(); -void ScDBArea(); -void ScColRowNameAuto(); -void ScGetPivotData(); -void ScHyperLink(); -void ScBahtText(); -void ScTTT(); - -//----------------Funktionen in interpr2.cxx--------------- - -/** 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. - */ -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 ScEasterSunday(); -void ScGetHour(); -void ScGetMin(); -void ScGetSec(); -void ScPlusMinus(); -void ScAbs(); -void ScInt(); -void ScEven(); -void ScOdd(); -void ScCeil(); -void ScFloor(); -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 ScPower(); -void ScAmpersand(); -void ScAdd(); -void ScSub(); -void ScMul(); -void ScDiv(); -void ScPow(); -void ScCurrent(); -void ScStyle(); -void ScDde(); -void ScBase(); -void ScDecimal(); -void ScConvert(); -void ScEuroConvert(); - -//----------------------- Finanzfunktionen ------------------------------------ -void ScNPV(); -void ScIRR(); -void ScMIRR(); -void ScISPMT(); - -double ScGetBw(double fZins, double fZzr, double fRmz, - double fZw, double fF); -void ScBW(); -void ScDIA(); -double ScGetGDA(double fWert, double fRest, double fDauer, - double fPeriode, double fFaktor); -void ScGDA(); -void ScGDA2(); -double ScInterVDB(double fWert,double fRest,double fDauer,double fDauer1, - double fPeriode,double fFaktor); -void ScVDB(); -void ScLaufz(); -void ScLIA(); -double ScGetRmz(double fZins, double fZzr, double fBw, - double fZw, double fF); -void ScRMZ(); -void ScZGZ(); -double ScGetZw(double fZins, double fZzr, double fRmz, - double fBw, double fF); -void ScZW(); -void ScZZR(); -bool RateIteration(double fNper, double fPayment, double fPv, - double fFv, double fPayType, double& fGuess); -void ScZins(); -double ScGetZinsZ(double fZins, double fZr, double fZzr, double fBw, - double fZw, double fF, double& fRmz); -void ScZinsZ(); -void ScKapz(); -void ScKumZinsZ(); -void ScKumKapZ(); -void ScEffektiv(); -void ScNominal(); -void ScMod(); -void ScBackSolver(); -void ScIntercept(); -//-------------------------Funktionen in interpr5.cxx-------------------------- -double ScGetGCD(double fx, double fy); -void ScGCD(); -void ScLCM(); -//-------------------------- Matrixfunktionen --------------------------------- - -void ScMatValue(); -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 CalculateSlopeIntercept(sal_Bool bSlope); -void CalculateSmallLarge(sal_Bool bSmall); -void CalculatePearsonCovar(sal_Bool _bPearson,sal_Bool _bStexy); -bool CalculateTest( sal_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(sal_Bool HLookup); -bool FillEntry(ScQueryEntry& rEntry); -void CalculateAddSub(sal_Bool _bSub); -void CalculateTrendGrowth(bool _bGrowth); -void CalulateRGPRKP(bool _bRKP); -void CalculateSumX2MY2SumX2DY2(sal_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 ScRGP(); -void ScRKP(); -void ScForecast(); -//------------------------- Functions in interpr3.cxx ------------------------- -void ScNoName(); -void ScBadName(); -// Statistik: -double phi(double x); -double integralPhi(double x); -double taylor(double* pPolynom, sal_uInt16 nMax, double x); -double gauss(double x); -double gaussinv(double x); -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 -double GetChiSqDistPDF(double fX, double fDF); // probability density function -double GetFDist(double x, double fF1, double fF2); -double GetTDist(double T, double fDF); -double Fakultaet(double x); -double BinomKoeff(double n, double k); -double GetGamma(double x); -double GetLogGamma(double x); -double GetBeta(double fAlpha, double fBeta); -double GetLogBeta(double fAlpha, double fBeta); -void ScLogGamma(); -void ScGamma(); -void ScPhi(); -void ScGauss(); -void ScStdNormDist(); -void ScFisher(); -void ScFisherInv(); -void ScFact(); -void ScNormDist(); -void ScGammaDist(); -void ScGammaInv(); -void ScExpDist(); -void ScBinomDist(); -void ScPoissonDist(); -void ScKombin(); -void ScKombin2(); -void ScVariationen(); -void ScVariationen2(); -void ScB(); -void ScHypGeomDist(); -void ScLogNormDist(); -void ScLogNormInv(); -void ScTDist(); -void ScFDist(); -void ScChiDist(); // for LEGACY.CHIDIST, returns right tail -void ScChiSqDist(); // returns left tail or density -void ScChiSqInv(); //invers to CHISQDIST -void ScWeibull(); -void ScBetaDist(); -void ScFInv(); -void ScTInv(); -void ScChiInv(); -void ScBetaInv(); -void ScCritBinom(); -void ScNegBinomDist(); -void ScKurt(); -void ScHarMean(); -void ScGeoMean(); -void ScStandard(); -void ScSkew(); -void ScMedian(); -double GetMedian( ::std::vector<double> & rArray ); -double GetPercentile( ::std::vector<double> & rArray, double fPercentile ); -void GetNumberSequenceArray( sal_uInt8 nParamCount, ::std::vector<double>& rArray ); -void GetSortArray(sal_uInt8 nParamCount, ::std::vector<double>& rSortArray, ::std::vector<long>* pIndexOrder = NULL); -void QuickSort(::std::vector<double>& rSortArray, ::std::vector<long>* pIndexOrder = NULL); -void ScModalValue(); -void ScAveDev(); -void ScDevSq(); -void ScZTest(); -void ScTTest(); -void ScFTest(); -void ScChiTest(); -void ScRank(); -void ScPercentile(); -void ScPercentrank(); -void ScLarge(); -void ScSmall(); -void ScFrequency(); -void ScQuartile(); -void ScNormInv(); -void ScSNormInv(); -void ScConfidence(); -void ScTrimMean(); -void ScProbability(); -void ScCorrel(); -void ScCovar(); -void ScPearson(); -void ScRSQ(); -void ScSTEXY(); -void ScSlope(); -void ScTrend(); -void ScInfo(); - -//------------------------ Functions in interpr6.cxx ------------------------- - -static const double fMaxGammaArgument; // defined in interpr3.cxx - -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); - -public: - ScInterpreter( ScFormulaCell* pCell, ScDocument* pDoc, - const ScAddress&, ScTokenArray& ); - ~ScInterpreter(); - - formula::StackVar Interpret(); - - void SetError(sal_uInt16 nError) - { if (nError && !nGlobalError) nGlobalError = nError; } - - sal_uInt16 GetError() const { return nGlobalError; } - formula::StackVar GetResultType() const { return xResult->GetType(); } - const String& GetStringResult() const { return xResult->GetString(); } - double GetNumResult() const { return xResult->GetDouble(); } - formula::FormulaTokenRef - GetResultToken() const { return xResult; } - short GetRetFormatType() const { return nRetFmtType; } - sal_uLong GetRetFormatIndex() const { return nRetFmtIndex; } -}; - - -inline void ScInterpreter::MatrixDoubleRefToMatrix() -{ - if ( bMatrixFormula && GetStackType() == formula::svDoubleRef ) - { - GetTokenMatrixMap(); // make sure it exists, create if not. - PopDoubleRefPushMatrix(); - } -} - - -inline bool ScInterpreter::MatrixParameterConversion() -{ - if ( (bMatrixFormula || pCur->HasForceArray()) && !pJumpMatrix && sp > 0 ) - return ConvertMatrixParameters(); - return false; -} - - -inline ScTokenMatrixMap& ScInterpreter::GetTokenMatrixMap() -{ - if (!pTokenMatrixMap) - pTokenMatrixMap = CreateTokenMatrixMap(); - return *pTokenMatrixMap; -} - - -inline sal_Bool ScInterpreter::MustHaveParamCount( short nAct, short nMust ) -{ - if ( nAct == nMust ) - return sal_True; - if ( nAct < nMust ) - PushParameterExpected(); - else - PushIllegalParameter(); - return false; -} - - -inline sal_Bool ScInterpreter::MustHaveParamCount( short nAct, short nMust, short nMax ) -{ - if ( nMust <= nAct && nAct <= nMax ) - return sal_True; - if ( nAct < nMust ) - PushParameterExpected(); - else - PushIllegalParameter(); - return false; -} - - -inline sal_Bool ScInterpreter::MustHaveParamCountMin( short nAct, short nMin ) -{ - if ( nAct >= nMin ) - return sal_True; - PushParameterExpected(); - return false; -} - - -inline sal_Bool ScInterpreter::CheckStringResultLen( String& rResult, const String& rAdd ) -{ - if ( (sal_uLong) rResult.Len() + rAdd.Len() > STRING_MAXLEN ) - { - SetError( errStringOverflow ); - rResult.Erase(); - return false; - } - return sal_True; -} - - -inline void ScInterpreter::TreatDoubleError( double& rVal ) -{ - if ( !::rtl::math::isFinite( rVal ) ) - { - sal_uInt16 nErr = GetDoubleErrorValue( rVal ); - if ( nErr ) - SetError( nErr ); - else - SetError( errNoValue ); - rVal = 0.0; - } -} - - -inline double ScInterpreter::div( const double& fNumerator, const double& fDenominator ) -{ - return (fDenominator != 0.0) ? (fNumerator / fDenominator) : - CreateDoubleError( errDivisionByZero); -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |