xref: /aoo4110/main/sc/source/core/inc/interpre.hxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski #ifndef SC_INTERPRE_HXX
23*b1cdbd2cSJim Jagielski #define SC_INTERPRE_HXX
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski #include <math.h>
26*b1cdbd2cSJim Jagielski #include <rtl/math.hxx>
27*b1cdbd2cSJim Jagielski #include "formula/errorcodes.hxx"
28*b1cdbd2cSJim Jagielski #include "cell.hxx"
29*b1cdbd2cSJim Jagielski #include "scdll.hxx"
30*b1cdbd2cSJim Jagielski #include "document.hxx"
31*b1cdbd2cSJim Jagielski #include "scmatrix.hxx"
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <math.h>
34*b1cdbd2cSJim Jagielski #include <map>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski // STLport definitions
37*b1cdbd2cSJim Jagielski // This works around some issues with Boost
38*b1cdbd2cSJim Jagielski //
39*b1cdbd2cSJim Jagielski #ifdef WNT
40*b1cdbd2cSJim Jagielski #define _STLP_HAS_NATIVE_FLOAT_ABS
41*b1cdbd2cSJim Jagielski #endif
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski // Math policy definitions for Boost
44*b1cdbd2cSJim Jagielski // This header must be included before including any Boost
45*b1cdbd2cSJim Jagielski // math function.
46*b1cdbd2cSJim Jagielski //
47*b1cdbd2cSJim Jagielski #ifndef BOOST_MATH_OVERFLOW_ERROR_POLICY
48*b1cdbd2cSJim Jagielski #define BOOST_MATH_OVERFLOW_ERROR_POLICY errno_on_error
49*b1cdbd2cSJim Jagielski #endif
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski class ScDocument;
52*b1cdbd2cSJim Jagielski class SbxVariable;
53*b1cdbd2cSJim Jagielski class ScBaseCell;
54*b1cdbd2cSJim Jagielski class ScFormulaCell;
55*b1cdbd2cSJim Jagielski class SvNumberFormatter;
56*b1cdbd2cSJim Jagielski class ScDBRangeBase;
57*b1cdbd2cSJim Jagielski struct MatrixDoubleOp;
58*b1cdbd2cSJim Jagielski struct ScQueryParam;
59*b1cdbd2cSJim Jagielski struct ScDBQueryParamBase;
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski struct ScCompare
62*b1cdbd2cSJim Jagielski {
63*b1cdbd2cSJim Jagielski     double  nVal[2];
64*b1cdbd2cSJim Jagielski     String* pVal[2];
65*b1cdbd2cSJim Jagielski     sal_Bool    bVal[2];
66*b1cdbd2cSJim Jagielski     sal_Bool    bEmpty[2];
ScCompareScCompare67*b1cdbd2cSJim Jagielski         ScCompare( String* p1, String* p2 )
68*b1cdbd2cSJim Jagielski         {
69*b1cdbd2cSJim Jagielski             pVal[ 0 ] = p1;
70*b1cdbd2cSJim Jagielski             pVal[ 1 ] = p2;
71*b1cdbd2cSJim Jagielski             bEmpty[0] = sal_False;
72*b1cdbd2cSJim Jagielski             bEmpty[1] = sal_False;
73*b1cdbd2cSJim Jagielski         }
74*b1cdbd2cSJim Jagielski };
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski struct ScCompareOptions
77*b1cdbd2cSJim Jagielski {
78*b1cdbd2cSJim Jagielski     ScQueryEntry        aQueryEntry;
79*b1cdbd2cSJim Jagielski     bool                bRegEx;
80*b1cdbd2cSJim Jagielski     bool                bMatchWholeCell;
81*b1cdbd2cSJim Jagielski     bool                bIgnoreCase;
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski                         ScCompareOptions( ScDocument* pDoc, const ScQueryEntry& rEntry, bool bReg );
84*b1cdbd2cSJim Jagielski private:
85*b1cdbd2cSJim Jagielski                         // Not implemented, prevent usage.
86*b1cdbd2cSJim Jagielski                         ScCompareOptions();
87*b1cdbd2cSJim Jagielski                         ScCompareOptions( const ScCompareOptions & );
88*b1cdbd2cSJim Jagielski      ScCompareOptions&  operator=( const ScCompareOptions & );
89*b1cdbd2cSJim Jagielski };
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski class ScToken;
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski #define MAXSTACK      (4096 / sizeof(formula::FormulaToken*))
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski class ScTokenStack
96*b1cdbd2cSJim Jagielski {
97*b1cdbd2cSJim Jagielski public:
98*b1cdbd2cSJim Jagielski     DECL_FIXEDMEMPOOL_NEWDEL( ScTokenStack )
99*b1cdbd2cSJim Jagielski     formula::FormulaToken* pPointer[ MAXSTACK ];
100*b1cdbd2cSJim Jagielski };
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski enum ScIterFunc
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski     ifSUM,     // Sum
105*b1cdbd2cSJim Jagielski     ifSUMSQ,   // Sum squares
106*b1cdbd2cSJim Jagielski     ifPRODUCT, // Product
107*b1cdbd2cSJim Jagielski     ifAVERAGE, // Average
108*b1cdbd2cSJim Jagielski     ifCOUNT,   // Count
109*b1cdbd2cSJim Jagielski     ifCOUNT2,  // Count non-empty
110*b1cdbd2cSJim Jagielski     ifMIN,     // Minimum
111*b1cdbd2cSJim Jagielski     ifMAX      // Maximum
112*b1cdbd2cSJim Jagielski };
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski enum ScIterFuncIf
115*b1cdbd2cSJim Jagielski {
116*b1cdbd2cSJim Jagielski     ifSUMIF,    // Conditional sum
117*b1cdbd2cSJim Jagielski     ifAVERAGEIF // Conditional average
118*b1cdbd2cSJim Jagielski };
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski enum ScIterFuncIfs
121*b1cdbd2cSJim Jagielski {
122*b1cdbd2cSJim Jagielski     ifSUMIFS,     // Multi-Conditional sum
123*b1cdbd2cSJim Jagielski     ifAVERAGEIFS, // Multi-Conditional average
124*b1cdbd2cSJim Jagielski     ifCOUNTIFS    // Multi-Conditional count
125*b1cdbd2cSJim Jagielski };
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski struct FormulaTokenRef_less
128*b1cdbd2cSJim Jagielski {
operator ()FormulaTokenRef_less129*b1cdbd2cSJim Jagielski     bool operator () ( const formula::FormulaConstTokenRef& r1, const formula::FormulaConstTokenRef& r2 ) const
130*b1cdbd2cSJim Jagielski         { return &r1 < &r2; }
131*b1cdbd2cSJim Jagielski };
132*b1cdbd2cSJim Jagielski typedef ::std::map< const formula::FormulaConstTokenRef, formula::FormulaTokenRef, FormulaTokenRef_less> ScTokenMatrixMap;
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski class ScInterpreter
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski     // distibution function objects need the GetxxxDist methods
137*b1cdbd2cSJim Jagielski     friend class ScGammaDistFunction;
138*b1cdbd2cSJim Jagielski     friend class ScBetaDistFunction;
139*b1cdbd2cSJim Jagielski     friend class ScTDistFunction;
140*b1cdbd2cSJim Jagielski     friend class ScFDistFunction;
141*b1cdbd2cSJim Jagielski     friend class ScChiDistFunction;
142*b1cdbd2cSJim Jagielski     friend class ScChiSqDistFunction;
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski public:
145*b1cdbd2cSJim Jagielski     DECL_FIXEDMEMPOOL_NEWDEL( ScInterpreter )
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski     static void GlobalExit();           // aus ScGlobal::Clear() gerufen
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski     /// Could string be a regular expression?
150*b1cdbd2cSJim Jagielski     /// If pDoc!=NULL the document options are taken into account and if
151*b1cdbd2cSJim Jagielski     /// RegularExpressions are disabled the function returns sal_False regardless
152*b1cdbd2cSJim Jagielski     /// of the string content.
153*b1cdbd2cSJim Jagielski     static sal_Bool MayBeRegExp( const String& rStr, const ScDocument* pDoc );
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski     /// Fail safe division, returning an errDivisionByZero coded into a double
156*b1cdbd2cSJim Jagielski     /// if denominator is 0.0
157*b1cdbd2cSJim Jagielski     static inline double div( const double& fNumerator, const double& fDenominator );
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski     ScMatrixRef GetNewMat(SCSIZE nC, SCSIZE nR);
160*b1cdbd2cSJim Jagielski private:
161*b1cdbd2cSJim Jagielski     static ScTokenStack*    pGlobalStack;
162*b1cdbd2cSJim Jagielski     static sal_Bool         bGlobalStackInUse;
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski     formula::FormulaTokenIterator aCode;
165*b1cdbd2cSJim Jagielski     ScAddress   aPos;
166*b1cdbd2cSJim Jagielski     ScTokenArray& rArr;
167*b1cdbd2cSJim Jagielski     ScDocument* pDok;
168*b1cdbd2cSJim Jagielski     formula::FormulaTokenRef  xResult;
169*b1cdbd2cSJim Jagielski     ScJumpMatrix*   pJumpMatrix;        // currently active array condition, if any
170*b1cdbd2cSJim Jagielski     ScTokenMatrixMap* pTokenMatrixMap;  // map ScToken* to formula::FormulaTokenRef if in array condition
171*b1cdbd2cSJim Jagielski     ScFormulaCell* pMyFormulaCell;      // the cell of this formula expression
172*b1cdbd2cSJim Jagielski     SvNumberFormatter* pFormatter;
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski     const formula::FormulaToken*
175*b1cdbd2cSJim Jagielski                 pCur;                // current token
176*b1cdbd2cSJim Jagielski     ScToken*    pLastStackRefToken;     // i120962: current valid reference token
177*b1cdbd2cSJim Jagielski     bool        bRefFunc;               // i120962: is a reference function
178*b1cdbd2cSJim Jagielski     String      aTempStr;               // for GetString()
179*b1cdbd2cSJim Jagielski     ScTokenStack* pStackObj;            // contains the stacks
180*b1cdbd2cSJim Jagielski     formula::FormulaToken**   pStack;                 // the current stack
181*b1cdbd2cSJim Jagielski     sal_uInt16      nGlobalError;           // global (local to this formula expression) error
182*b1cdbd2cSJim Jagielski     sal_uInt16      sp;                     // stack pointer
183*b1cdbd2cSJim Jagielski     sal_uInt16      maxsp;                  // the maximal used stack pointer
184*b1cdbd2cSJim Jagielski     sal_uLong       nFuncFmtIndex;          // NumberFormatIndex of a function
185*b1cdbd2cSJim Jagielski     sal_uLong       nCurFmtIndex;           // current NumberFormatIndex
186*b1cdbd2cSJim Jagielski     sal_uLong       nRetFmtIndex;           // NumberFormatIndex of an expression, if any
187*b1cdbd2cSJim Jagielski     short       nFuncFmtType;           // NumberFormatType of a function
188*b1cdbd2cSJim Jagielski     short       nCurFmtType;            // current NumberFormatType
189*b1cdbd2cSJim Jagielski     short       nRetFmtType;            // NumberFormatType of an expression
190*b1cdbd2cSJim Jagielski     sal_uInt16      mnStringNoValueError;   // the error set in ConvertStringToValue() if no value
191*b1cdbd2cSJim Jagielski     sal_Bool        glSubTotal;             // flag for subtotal functions
192*b1cdbd2cSJim Jagielski     sal_uInt8        cPar;                   // current count of parameters
193*b1cdbd2cSJim Jagielski     sal_Bool        bCalcAsShown;           // precision as shown
194*b1cdbd2cSJim Jagielski     sal_Bool        bMatrixFormula;         // formula cell is a matrix formula
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski //---------------------------------Funktionen in interpre.cxx---------
197*b1cdbd2cSJim Jagielski // nMust <= nAct <= nMax ? ok : PushError
198*b1cdbd2cSJim Jagielski inline sal_Bool MustHaveParamCount( short nAct, short nMust );
199*b1cdbd2cSJim Jagielski inline sal_Bool MustHaveParamCount( short nAct, short nMust, short nMax );
200*b1cdbd2cSJim Jagielski inline sal_Bool MustHaveParamCountMin( short nAct, short nMin );
201*b1cdbd2cSJim Jagielski void PushParameterExpected();
202*b1cdbd2cSJim Jagielski void PushIllegalParameter();
203*b1cdbd2cSJim Jagielski void PushIllegalArgument();
204*b1cdbd2cSJim Jagielski void PushNoValue();
205*b1cdbd2cSJim Jagielski void PushNA();
206*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
207*b1cdbd2cSJim Jagielski // Funktionen fuer den Zugriff auf das Document
208*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
209*b1cdbd2cSJim Jagielski void ReplaceCell( ScAddress& );     // for TableOp
210*b1cdbd2cSJim Jagielski void ReplaceCell( SCCOL& rCol, SCROW& rRow, SCTAB& rTab );  // for TableOp
211*b1cdbd2cSJim Jagielski sal_Bool IsTableOpInRange( const ScRange& );
212*b1cdbd2cSJim Jagielski sal_uLong GetCellNumberFormat( const ScAddress&, const ScBaseCell* );
213*b1cdbd2cSJim Jagielski double ConvertStringToValue( const String& );
214*b1cdbd2cSJim Jagielski double GetCellValue( const ScAddress&, const ScBaseCell* );
215*b1cdbd2cSJim Jagielski double GetCellValueOrZero( const ScAddress&, const ScBaseCell* );
216*b1cdbd2cSJim Jagielski double GetValueCellValue( const ScAddress&, const ScValueCell* );
GetCell(const ScAddress & rPos)217*b1cdbd2cSJim Jagielski ScBaseCell* GetCell( const ScAddress& rPos )
218*b1cdbd2cSJim Jagielski     { return pDok->GetCell( rPos ); }
219*b1cdbd2cSJim Jagielski void GetCellString( String& rStr, const ScBaseCell* pCell );
GetCellErrCode(const ScBaseCell * pCell)220*b1cdbd2cSJim Jagielski inline sal_uInt16 GetCellErrCode( const ScBaseCell* pCell )
221*b1cdbd2cSJim Jagielski     { return pCell ? pCell->GetErrorCode() : 0; }
GetCellType(const ScBaseCell * pCell)222*b1cdbd2cSJim Jagielski inline CellType GetCellType( const ScBaseCell* pCell )
223*b1cdbd2cSJim Jagielski     { return pCell ? pCell->GetCellType() : CELLTYPE_NONE; }
224*b1cdbd2cSJim Jagielski /// Really empty or inherited emptiness.
HasCellEmptyData(const ScBaseCell * pCell)225*b1cdbd2cSJim Jagielski inline sal_Bool HasCellEmptyData( const ScBaseCell* pCell )
226*b1cdbd2cSJim Jagielski     { return pCell ? pCell->HasEmptyData() : sal_True; }
227*b1cdbd2cSJim Jagielski /// This includes inherited emptiness, which usually is regarded as value!
HasCellValueData(const ScBaseCell * pCell)228*b1cdbd2cSJim Jagielski inline sal_Bool HasCellValueData( const ScBaseCell* pCell )
229*b1cdbd2cSJim Jagielski     { return pCell ? pCell->HasValueData() : sal_False; }
230*b1cdbd2cSJim Jagielski /// Not empty and not value.
HasCellStringData(const ScBaseCell * pCell)231*b1cdbd2cSJim Jagielski inline sal_Bool HasCellStringData( const ScBaseCell* pCell )
232*b1cdbd2cSJim Jagielski     { return pCell ? pCell->HasStringData() : sal_False; }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski sal_Bool CreateDoubleArr(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
235*b1cdbd2cSJim Jagielski                      SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt8* pCellArr);
236*b1cdbd2cSJim Jagielski sal_Bool CreateStringArr(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
237*b1cdbd2cSJim Jagielski                      SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt8* pCellArr);
238*b1cdbd2cSJim Jagielski sal_Bool CreateCellArr(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
239*b1cdbd2cSJim Jagielski                    SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt8* pCellArr);
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
242*b1cdbd2cSJim Jagielski // Stack operations
243*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski /** Does substitute with formula::FormulaErrorToken in case nGlobalError is set and the token
246*b1cdbd2cSJim Jagielski     passed is not formula::FormulaErrorToken.
247*b1cdbd2cSJim Jagielski     Increments RefCount of the original token if not substituted. */
248*b1cdbd2cSJim Jagielski void Push( formula::FormulaToken& r );
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski /** Does not substitute with formula::FormulaErrorToken in case nGlobalError is set.
251*b1cdbd2cSJim Jagielski     Used to push RPN tokens or from within Push() or tokens that are already
252*b1cdbd2cSJim Jagielski     explicit formula::FormulaErrorToken. Increments RefCount. */
253*b1cdbd2cSJim Jagielski void PushWithoutError( formula::FormulaToken& r );
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski /** Clones the token to be pushed or substitutes with formula::FormulaErrorToken if
256*b1cdbd2cSJim Jagielski     nGlobalError is set and the token passed is not formula::FormulaErrorToken. */
257*b1cdbd2cSJim Jagielski void PushTempToken( const formula::FormulaToken& );
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski /** Does substitute with formula::FormulaErrorToken in case nGlobalError is set and the token
260*b1cdbd2cSJim Jagielski     passed is not formula::FormulaErrorToken.
261*b1cdbd2cSJim Jagielski     Increments RefCount of the original token if not substituted.
262*b1cdbd2cSJim Jagielski     ATTENTION! The token had to be allocated with `new' and must not be used
263*b1cdbd2cSJim Jagielski     after this call if no RefCount was set because possibly it gets immediately
264*b1cdbd2cSJim Jagielski     deleted in case of an errStackOverflow or if substituted with formula::FormulaErrorToken! */
265*b1cdbd2cSJim Jagielski void PushTempToken( formula::FormulaToken* );
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski /** Does not substitute with formula::FormulaErrorToken in case nGlobalError is set.
268*b1cdbd2cSJim Jagielski     Used to push tokens from within PushTempToken() or tokens that are already
269*b1cdbd2cSJim Jagielski     explicit formula::FormulaErrorToken. Increments RefCount.
270*b1cdbd2cSJim Jagielski     ATTENTION! The token had to be allocated with `new' and must not be used
271*b1cdbd2cSJim Jagielski     after this call if no RefCount was set because possibly it gets immediately
272*b1cdbd2cSJim Jagielski     decremented again and thus deleted in case of an errStackOverflow! */
273*b1cdbd2cSJim Jagielski void PushTempTokenWithoutError( formula::FormulaToken* );
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski /** If nGlobalError is set push formula::FormulaErrorToken.
276*b1cdbd2cSJim Jagielski     If nGlobalError is not set do nothing.
277*b1cdbd2cSJim Jagielski     Used in PushTempToken() and alike to simplify handling.
278*b1cdbd2cSJim Jagielski     @return: <TRUE/> if nGlobalError. */
IfErrorPushError()279*b1cdbd2cSJim Jagielski inline bool IfErrorPushError()
280*b1cdbd2cSJim Jagielski {
281*b1cdbd2cSJim Jagielski     if (nGlobalError)
282*b1cdbd2cSJim Jagielski     {
283*b1cdbd2cSJim Jagielski         PushTempTokenWithoutError( new formula::FormulaErrorToken( nGlobalError));
284*b1cdbd2cSJim Jagielski         return true;
285*b1cdbd2cSJim Jagielski     }
286*b1cdbd2cSJim Jagielski     return false;
287*b1cdbd2cSJim Jagielski }
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski /** Obtain cell result / content from address and push as temp token.
290*b1cdbd2cSJim Jagielski     bDisplayEmptyAsString is passed to ScEmptyCell in case of an empty cell
291*b1cdbd2cSJim Jagielski     result. Also obtain number format and type if _both_, type and index
292*b1cdbd2cSJim Jagielski     pointer, are not NULL. */
293*b1cdbd2cSJim Jagielski void PushCellResultToken( bool bDisplayEmptyAsString, const ScAddress & rAddress,
294*b1cdbd2cSJim Jagielski         short * pRetTypeExpr, sal_uLong * pRetIndexExpr );
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski formula::FormulaTokenRef PopToken();
297*b1cdbd2cSJim Jagielski void Pop();
298*b1cdbd2cSJim Jagielski void PopError();
299*b1cdbd2cSJim Jagielski double PopDouble();
300*b1cdbd2cSJim Jagielski const String& PopString();
301*b1cdbd2cSJim Jagielski void ValidateRef( const ScSingleRefData & rRef );
302*b1cdbd2cSJim Jagielski void ValidateRef( const ScComplexRefData & rRef );
303*b1cdbd2cSJim Jagielski void ValidateRef( const ScRefList & rRefList );
304*b1cdbd2cSJim Jagielski void SingleRefToVars( const ScSingleRefData & rRef, SCCOL & rCol, SCROW & rRow, SCTAB & rTab );
305*b1cdbd2cSJim Jagielski void PopSingleRef( ScAddress& );
306*b1cdbd2cSJim Jagielski void PopSingleRef(SCCOL& rCol, SCROW &rRow, SCTAB& rTab);
307*b1cdbd2cSJim Jagielski void DoubleRefToRange( const ScComplexRefData&, ScRange&, sal_Bool bDontCheckForTableOp = sal_False );
308*b1cdbd2cSJim Jagielski /** If formula::StackVar formula::svDoubleRef pop ScDoubleRefToken and return values of
309*b1cdbd2cSJim Jagielski     ScComplexRefData.
310*b1cdbd2cSJim Jagielski     Else if StackVar svRefList return values of the ScComplexRefData where
311*b1cdbd2cSJim Jagielski     rRefInList is pointing to. rRefInList is incremented. If rRefInList was the
312*b1cdbd2cSJim Jagielski     last element in list pop ScRefListToken and set rRefInList to 0, else
313*b1cdbd2cSJim Jagielski     rParam is incremented (!) to allow usage as in
314*b1cdbd2cSJim Jagielski     while(nParamCount--) PopDoubleRef(aRange,nParamCount,nRefInList);
315*b1cdbd2cSJim Jagielski   */
316*b1cdbd2cSJim Jagielski void PopDoubleRef( ScRange & rRange, short & rParam, size_t & rRefInList );
317*b1cdbd2cSJim Jagielski void PopDoubleRef( ScRange&, sal_Bool bDontCheckForTableOp = sal_False );
318*b1cdbd2cSJim Jagielski void DoubleRefToVars( const ScToken* p,
319*b1cdbd2cSJim Jagielski         SCCOL& rCol1, SCROW &rRow1, SCTAB& rTab1,
320*b1cdbd2cSJim Jagielski         SCCOL& rCol2, SCROW &rRow2, SCTAB& rTab2,
321*b1cdbd2cSJim Jagielski         sal_Bool bDontCheckForTableOp = sal_False );
322*b1cdbd2cSJim Jagielski ScDBRangeBase* PopDoubleRef();
323*b1cdbd2cSJim Jagielski void PopDoubleRef(SCCOL& rCol1, SCROW &rRow1, SCTAB& rTab1,
324*b1cdbd2cSJim Jagielski                           SCCOL& rCol2, SCROW &rRow2, SCTAB& rTab2,
325*b1cdbd2cSJim Jagielski                           sal_Bool bDontCheckForTableOp = sal_False );
326*b1cdbd2cSJim Jagielski sal_Bool PopDoubleRefOrSingleRef( ScAddress& rAdr );
327*b1cdbd2cSJim Jagielski void PopDoubleRefPushMatrix();
328*b1cdbd2cSJim Jagielski // If MatrixFormula: convert formula::svDoubleRef to svMatrix, create JumpMatrix.
329*b1cdbd2cSJim Jagielski // Else convert area reference parameters marked as ForceArray to array.
330*b1cdbd2cSJim Jagielski // Returns sal_True if JumpMatrix created.
331*b1cdbd2cSJim Jagielski bool ConvertMatrixParameters();
332*b1cdbd2cSJim Jagielski inline void MatrixDoubleRefToMatrix();      // if MatrixFormula: PopDoubleRefPushMatrix
333*b1cdbd2cSJim Jagielski // If MatrixFormula or ForceArray: ConvertMatrixParameters()
334*b1cdbd2cSJim Jagielski inline bool MatrixParameterConversion();
335*b1cdbd2cSJim Jagielski ScMatrixRef PopMatrix();
336*b1cdbd2cSJim Jagielski //void PushByte(sal_uInt8 nVal);
337*b1cdbd2cSJim Jagielski void PushDouble(double nVal);
338*b1cdbd2cSJim Jagielski void PushInt( int nVal );
339*b1cdbd2cSJim Jagielski void PushStringBuffer( const sal_Unicode* pString );
340*b1cdbd2cSJim Jagielski void PushString( const String& rString );
341*b1cdbd2cSJim Jagielski void PushSingleRef(SCCOL nCol, SCROW nRow, SCTAB nTab);
342*b1cdbd2cSJim Jagielski void PushDoubleRef(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
343*b1cdbd2cSJim Jagielski                                  SCCOL nCol2, SCROW nRow2, SCTAB nTab2);
344*b1cdbd2cSJim Jagielski void PushMatrix(ScMatrix* pMat);
345*b1cdbd2cSJim Jagielski void PushError( sal_uInt16 nError );
346*b1cdbd2cSJim Jagielski /// Raw stack type without default replacements.
347*b1cdbd2cSJim Jagielski formula::StackVar GetRawStackType();
348*b1cdbd2cSJim Jagielski /// Stack type with replacement of defaults, e.g. svMissing and formula::svEmptyCell will result in formula::svDouble.
349*b1cdbd2cSJim Jagielski formula::StackVar GetStackType();
350*b1cdbd2cSJim Jagielski // peek StackType of Parameter, Parameter 1 == TOS, 2 == TOS-1, ...
351*b1cdbd2cSJim Jagielski formula::StackVar GetStackType( sal_uInt8 nParam );
GetByte()352*b1cdbd2cSJim Jagielski sal_uInt8 GetByte() { return cPar; }
353*b1cdbd2cSJim Jagielski // generiert aus DoubleRef positionsabhaengige SingleRef
354*b1cdbd2cSJim Jagielski sal_Bool DoubleRefToPosSingleRef( const ScRange& rRange, ScAddress& rAdr );
355*b1cdbd2cSJim Jagielski double GetDouble();
356*b1cdbd2cSJim Jagielski double GetDoubleWithDefault(double nDefault);
357*b1cdbd2cSJim Jagielski sal_Bool IsMissing();
GetBool()358*b1cdbd2cSJim Jagielski sal_Bool GetBool() { return GetDouble() != 0.0; }
359*b1cdbd2cSJim Jagielski const String& GetString();
360*b1cdbd2cSJim Jagielski // pop matrix and obtain one element, upper left or according to jump matrix
361*b1cdbd2cSJim Jagielski ScMatValType GetDoubleOrStringFromMatrix( double& rDouble, String& rString );
362*b1cdbd2cSJim Jagielski ScMatrixRef CreateMatrixFromDoubleRef( const formula::FormulaToken* pToken,
363*b1cdbd2cSJim Jagielski         SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
364*b1cdbd2cSJim Jagielski         SCCOL nCol2, SCROW nRow2, SCTAB nTab2 );
365*b1cdbd2cSJim Jagielski inline ScTokenMatrixMap& GetTokenMatrixMap();
366*b1cdbd2cSJim Jagielski ScTokenMatrixMap* CreateTokenMatrixMap();
367*b1cdbd2cSJim Jagielski ScMatrixRef GetMatrix();
368*b1cdbd2cSJim Jagielski void ScTableOp();                                       // Mehrfachoperationen
369*b1cdbd2cSJim Jagielski void ScErrCell();                                       // Sonderbehandlung
370*b1cdbd2cSJim Jagielski                                                         // Fehlerzelle
371*b1cdbd2cSJim Jagielski //-----------------------------allgemeine Hilfsfunktionen
372*b1cdbd2cSJim Jagielski void SetMaxIterationCount(sal_uInt16 n);
CurFmtToFuncFmt()373*b1cdbd2cSJim Jagielski inline void CurFmtToFuncFmt()
374*b1cdbd2cSJim Jagielski     { nFuncFmtType = nCurFmtType; nFuncFmtIndex = nCurFmtIndex; }
375*b1cdbd2cSJim Jagielski // Check for String overflow of rResult+rAdd and set error and erase rResult
376*b1cdbd2cSJim Jagielski // if so. Return sal_True if ok, sal_False if overflow
377*b1cdbd2cSJim Jagielski inline sal_Bool CheckStringResultLen( String& rResult, const String& rAdd );
378*b1cdbd2cSJim Jagielski // Set error according to rVal, and set rVal to 0.0 if there was an error.
379*b1cdbd2cSJim Jagielski inline void TreatDoubleError( double& rVal );
380*b1cdbd2cSJim Jagielski // Lookup using ScLookupCache, @returns sal_True if found and result address
381*b1cdbd2cSJim Jagielski bool LookupQueryWithCache( ScAddress & o_rResultPos,
382*b1cdbd2cSJim Jagielski         const ScQueryParam & rParam ) const;
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski //---------------------------------Funktionen in interpr1.cxx---------
385*b1cdbd2cSJim Jagielski void ScIfJump();
386*b1cdbd2cSJim Jagielski void ScChoseJump();
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski // Be sure to only call this if pStack[sp-nStackLevel] really contains a
389*b1cdbd2cSJim Jagielski // ScJumpMatrixToken, no further checks are applied!
390*b1cdbd2cSJim Jagielski // Returns true if last jump was executed and result matrix pushed.
391*b1cdbd2cSJim Jagielski bool JumpMatrix( short nStackLevel );
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski /** @param pOptions
394*b1cdbd2cSJim Jagielski         NULL means case sensitivity document option is to be used!
395*b1cdbd2cSJim Jagielski  */
396*b1cdbd2cSJim Jagielski double CompareFunc( const ScCompare& rComp, ScCompareOptions* pOptions = NULL );
397*b1cdbd2cSJim Jagielski double Compare();
398*b1cdbd2cSJim Jagielski /** @param pOptions
399*b1cdbd2cSJim Jagielski         NULL means case sensitivity document option is to be used!
400*b1cdbd2cSJim Jagielski  */
401*b1cdbd2cSJim Jagielski ScMatrixRef CompareMat( ScCompareOptions* pOptions = NULL );
402*b1cdbd2cSJim Jagielski ScMatrixRef QueryMat( ScMatrix* pMat, ScCompareOptions& rOptions );
403*b1cdbd2cSJim Jagielski void ScEqual();
404*b1cdbd2cSJim Jagielski void ScNotEqual();
405*b1cdbd2cSJim Jagielski void ScLess();
406*b1cdbd2cSJim Jagielski void ScGreater();
407*b1cdbd2cSJim Jagielski void ScLessEqual();
408*b1cdbd2cSJim Jagielski void ScGreaterEqual();
409*b1cdbd2cSJim Jagielski void ScAnd();
410*b1cdbd2cSJim Jagielski void ScOr();
411*b1cdbd2cSJim Jagielski void ScXor();
412*b1cdbd2cSJim Jagielski void ScNot();
413*b1cdbd2cSJim Jagielski void ScNeg();
414*b1cdbd2cSJim Jagielski void ScPercentSign();
415*b1cdbd2cSJim Jagielski void ScIntersect();
416*b1cdbd2cSJim Jagielski void ScRangeFunc();
417*b1cdbd2cSJim Jagielski void ScUnionFunc();
418*b1cdbd2cSJim Jagielski void ScPi();
419*b1cdbd2cSJim Jagielski void ScRandom();
420*b1cdbd2cSJim Jagielski void ScTrue();
421*b1cdbd2cSJim Jagielski void ScFalse();
422*b1cdbd2cSJim Jagielski void ScDeg();
423*b1cdbd2cSJim Jagielski void ScRad();
424*b1cdbd2cSJim Jagielski void ScSin();
425*b1cdbd2cSJim Jagielski void ScCos();
426*b1cdbd2cSJim Jagielski void ScTan();
427*b1cdbd2cSJim Jagielski void ScCot();
428*b1cdbd2cSJim Jagielski void ScArcSin();
429*b1cdbd2cSJim Jagielski void ScArcCos();
430*b1cdbd2cSJim Jagielski void ScArcTan();
431*b1cdbd2cSJim Jagielski void ScArcCot();
432*b1cdbd2cSJim Jagielski void ScSinHyp();
433*b1cdbd2cSJim Jagielski void ScCosHyp();
434*b1cdbd2cSJim Jagielski void ScTanHyp();
435*b1cdbd2cSJim Jagielski void ScCotHyp();
436*b1cdbd2cSJim Jagielski void ScArcSinHyp();
437*b1cdbd2cSJim Jagielski void ScArcCosHyp();
438*b1cdbd2cSJim Jagielski void ScArcTanHyp();
439*b1cdbd2cSJim Jagielski void ScArcCotHyp();
440*b1cdbd2cSJim Jagielski void ScCosecant();
441*b1cdbd2cSJim Jagielski void ScSecant();
442*b1cdbd2cSJim Jagielski void ScCosecantHyp();
443*b1cdbd2cSJim Jagielski void ScSecantHyp();
444*b1cdbd2cSJim Jagielski void ScExp();
445*b1cdbd2cSJim Jagielski void ScLn();
446*b1cdbd2cSJim Jagielski void ScLog10();
447*b1cdbd2cSJim Jagielski void ScSqrt();
448*b1cdbd2cSJim Jagielski void ScIsEmpty();
449*b1cdbd2cSJim Jagielski short IsString();
450*b1cdbd2cSJim Jagielski void ScIsString();
451*b1cdbd2cSJim Jagielski void ScIsNonString();
452*b1cdbd2cSJim Jagielski void ScIsLogical();
453*b1cdbd2cSJim Jagielski void ScType();
454*b1cdbd2cSJim Jagielski void ScCell();
455*b1cdbd2cSJim Jagielski void ScIsRef();
456*b1cdbd2cSJim Jagielski void ScIsValue();
457*b1cdbd2cSJim Jagielski void ScIsFormula();
458*b1cdbd2cSJim Jagielski void ScFormula();
459*b1cdbd2cSJim Jagielski void ScRoman();
460*b1cdbd2cSJim Jagielski void ScArabic();
461*b1cdbd2cSJim Jagielski void ScIsNV();
462*b1cdbd2cSJim Jagielski void ScIsErr();
463*b1cdbd2cSJim Jagielski void ScIsError();
464*b1cdbd2cSJim Jagielski short IsEven();
465*b1cdbd2cSJim Jagielski void ScIsEven();
466*b1cdbd2cSJim Jagielski void ScIsOdd();
467*b1cdbd2cSJim Jagielski void ScN();
468*b1cdbd2cSJim Jagielski void ScCode();
469*b1cdbd2cSJim Jagielski void ScTrim();
470*b1cdbd2cSJim Jagielski void ScUpper();
471*b1cdbd2cSJim Jagielski void ScPropper();
472*b1cdbd2cSJim Jagielski void ScLower();
473*b1cdbd2cSJim Jagielski void ScLen();
474*b1cdbd2cSJim Jagielski void ScT();
475*b1cdbd2cSJim Jagielski void ScValue();
476*b1cdbd2cSJim Jagielski void ScClean();
477*b1cdbd2cSJim Jagielski void ScChar();
478*b1cdbd2cSJim Jagielski void ScJis();
479*b1cdbd2cSJim Jagielski void ScAsc();
480*b1cdbd2cSJim Jagielski void ScUnicode();
481*b1cdbd2cSJim Jagielski void ScUnichar();
482*b1cdbd2cSJim Jagielski void ScMin( sal_Bool bTextAsZero = sal_False );
483*b1cdbd2cSJim Jagielski void ScMax( sal_Bool bTextAsZero = sal_False );
484*b1cdbd2cSJim Jagielski double IterateParameters( ScIterFunc, sal_Bool bTextAsZero = sal_False );
485*b1cdbd2cSJim Jagielski void ScSumSQ();
486*b1cdbd2cSJim Jagielski void ScSum();
487*b1cdbd2cSJim Jagielski void ScProduct();
488*b1cdbd2cSJim Jagielski void ScAverage( sal_Bool bTextAsZero = sal_False );
489*b1cdbd2cSJim Jagielski void ScCount();
490*b1cdbd2cSJim Jagielski void ScCount2();
491*b1cdbd2cSJim Jagielski void GetStVarParams( double& rVal, double& rValCount, sal_Bool bTextAsZero = sal_False );
492*b1cdbd2cSJim Jagielski void ScVar( sal_Bool bTextAsZero = sal_False );
493*b1cdbd2cSJim Jagielski void ScVarP( sal_Bool bTextAsZero = sal_False );
494*b1cdbd2cSJim Jagielski void ScStDev( sal_Bool bTextAsZero = sal_False );
495*b1cdbd2cSJim Jagielski void ScStDevP( sal_Bool bTextAsZero = sal_False );
496*b1cdbd2cSJim Jagielski void ScColumns();
497*b1cdbd2cSJim Jagielski void ScRows();
498*b1cdbd2cSJim Jagielski void ScTables();
499*b1cdbd2cSJim Jagielski void ScColumn();
500*b1cdbd2cSJim Jagielski void ScRow();
501*b1cdbd2cSJim Jagielski void ScTable();
502*b1cdbd2cSJim Jagielski void ScMatch();
503*b1cdbd2cSJim Jagielski double IterateParametersIf( ScIterFuncIf );
504*b1cdbd2cSJim Jagielski void ScCountIf();
505*b1cdbd2cSJim Jagielski void ScSumIf();
506*b1cdbd2cSJim Jagielski void ScAverageIf();
507*b1cdbd2cSJim Jagielski double IterateParametersIfs( ScIterFuncIfs );
508*b1cdbd2cSJim Jagielski void ScSumIfs();
509*b1cdbd2cSJim Jagielski void ScAverageIfs();
510*b1cdbd2cSJim Jagielski void ScCountIfs();
511*b1cdbd2cSJim Jagielski void ScCountEmptyCells();
512*b1cdbd2cSJim Jagielski void ScLookup();
513*b1cdbd2cSJim Jagielski void ScHLookup();
514*b1cdbd2cSJim Jagielski void ScVLookup();
515*b1cdbd2cSJim Jagielski void ScSubTotal();
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski // If upon call rMissingField==sal_True then the database field parameter may be
518*b1cdbd2cSJim Jagielski // missing (Xcl DCOUNT() syntax), or may be faked as missing by having the
519*b1cdbd2cSJim Jagielski // value 0.0 or being exactly the entire database range reference (old SO
520*b1cdbd2cSJim Jagielski // compatibility). If this was the case then rMissingField is set to sal_True upon
521*b1cdbd2cSJim Jagielski // return. If rMissingField==sal_False upon call all "missing cases" are considered
522*b1cdbd2cSJim Jagielski // to be an error.
523*b1cdbd2cSJim Jagielski ScDBQueryParamBase* GetDBParams( sal_Bool& rMissingField );
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski void DBIterator( ScIterFunc );
526*b1cdbd2cSJim Jagielski void ScDBSum();
527*b1cdbd2cSJim Jagielski void ScDBCount();
528*b1cdbd2cSJim Jagielski void ScDBCount2();
529*b1cdbd2cSJim Jagielski void ScDBAverage();
530*b1cdbd2cSJim Jagielski void ScDBGet();
531*b1cdbd2cSJim Jagielski void ScDBMax();
532*b1cdbd2cSJim Jagielski void ScDBMin();
533*b1cdbd2cSJim Jagielski void ScDBProduct();
534*b1cdbd2cSJim Jagielski void GetDBStVarParams( double& rVal, double& rValCount );
535*b1cdbd2cSJim Jagielski void ScDBStdDev();
536*b1cdbd2cSJim Jagielski void ScDBStdDevP();
537*b1cdbd2cSJim Jagielski void ScDBVar();
538*b1cdbd2cSJim Jagielski void ScDBVarP();
539*b1cdbd2cSJim Jagielski void ScIndirect();
540*b1cdbd2cSJim Jagielski void ScAddressFunc();
541*b1cdbd2cSJim Jagielski void ScOffset();
542*b1cdbd2cSJim Jagielski void ScIndex();
543*b1cdbd2cSJim Jagielski void ScMultiArea();
544*b1cdbd2cSJim Jagielski void ScAreas();
545*b1cdbd2cSJim Jagielski void ScCurrency();
546*b1cdbd2cSJim Jagielski void ScReplace();
547*b1cdbd2cSJim Jagielski void ScFixed();
548*b1cdbd2cSJim Jagielski void ScFind();
549*b1cdbd2cSJim Jagielski void ScExact();
550*b1cdbd2cSJim Jagielski void ScLeft();
551*b1cdbd2cSJim Jagielski void ScRight();
552*b1cdbd2cSJim Jagielski void ScSearch();
553*b1cdbd2cSJim Jagielski void ScMid();
554*b1cdbd2cSJim Jagielski void ScText();
555*b1cdbd2cSJim Jagielski void ScSubstitute();
556*b1cdbd2cSJim Jagielski void ScRept();
557*b1cdbd2cSJim Jagielski void ScConcat();
558*b1cdbd2cSJim Jagielski void ScExternal();
559*b1cdbd2cSJim Jagielski void ScMissing();
560*b1cdbd2cSJim Jagielski void ScMacro();
561*b1cdbd2cSJim Jagielski sal_Bool SetSbxVariable( SbxVariable* pVar, const ScAddress& );
562*b1cdbd2cSJim Jagielski sal_Bool SetSbxVariable( SbxVariable* pVar, SCCOL nCol, SCROW nRow, SCTAB nTab );
563*b1cdbd2cSJim Jagielski void ScErrorType();
564*b1cdbd2cSJim Jagielski void ScDBArea();
565*b1cdbd2cSJim Jagielski void ScColRowNameAuto();
566*b1cdbd2cSJim Jagielski void ScExternalRef();
567*b1cdbd2cSJim Jagielski void ScGetPivotData();
568*b1cdbd2cSJim Jagielski void ScHyperLink();
569*b1cdbd2cSJim Jagielski void ScBahtText();
570*b1cdbd2cSJim Jagielski void ScTTT();
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski //----------------Funktionen in interpr2.cxx---------------
573*b1cdbd2cSJim Jagielski 
574*b1cdbd2cSJim Jagielski /** Obtain the date serial number for a given date.
575*b1cdbd2cSJim Jagielski     @param bStrict
576*b1cdbd2cSJim Jagielski         If sal_False, nYear < 100 takes the two-digit year setting into account,
577*b1cdbd2cSJim Jagielski         and rollover of invalid calendar dates takes place, e.g. 1999-02-31 =>
578*b1cdbd2cSJim Jagielski         1999-03-03.
579*b1cdbd2cSJim Jagielski         If sal_True, the date passed must be a valid Gregorian calendar date. No
580*b1cdbd2cSJim Jagielski         two-digit expanding or rollover is done.
581*b1cdbd2cSJim Jagielski  */
582*b1cdbd2cSJim Jagielski double GetDateSerial( sal_Int16 nYear, sal_Int16 nMonth, sal_Int16 nDay, bool bStrict );
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski void ScGetActDate();
585*b1cdbd2cSJim Jagielski void ScGetActTime();
586*b1cdbd2cSJim Jagielski void ScGetYear();
587*b1cdbd2cSJim Jagielski void ScGetMonth();
588*b1cdbd2cSJim Jagielski void ScGetDay();
589*b1cdbd2cSJim Jagielski void ScGetDayOfWeek();
590*b1cdbd2cSJim Jagielski void ScGetWeekOfYear();
591*b1cdbd2cSJim Jagielski void ScEasterSunday();
592*b1cdbd2cSJim Jagielski void ScGetHour();
593*b1cdbd2cSJim Jagielski void ScGetMin();
594*b1cdbd2cSJim Jagielski void ScGetSec();
595*b1cdbd2cSJim Jagielski void ScPlusMinus();
596*b1cdbd2cSJim Jagielski void ScAbs();
597*b1cdbd2cSJim Jagielski void ScInt();
598*b1cdbd2cSJim Jagielski void ScEven();
599*b1cdbd2cSJim Jagielski void ScOdd();
600*b1cdbd2cSJim Jagielski void ScCeil();
601*b1cdbd2cSJim Jagielski void ScFloor();
602*b1cdbd2cSJim Jagielski void RoundNumber( rtl_math_RoundingMode eMode );
603*b1cdbd2cSJim Jagielski void ScRound();
604*b1cdbd2cSJim Jagielski void ScRoundUp();
605*b1cdbd2cSJim Jagielski void ScRoundDown();
606*b1cdbd2cSJim Jagielski void ScGetDateValue();
607*b1cdbd2cSJim Jagielski void ScGetTimeValue();
608*b1cdbd2cSJim Jagielski void ScArcTan2();
609*b1cdbd2cSJim Jagielski void ScLog();
610*b1cdbd2cSJim Jagielski void ScGetDate();
611*b1cdbd2cSJim Jagielski void ScGetTime();
612*b1cdbd2cSJim Jagielski void ScGetDiffDate();
613*b1cdbd2cSJim Jagielski void ScGetDiffDate360();
614*b1cdbd2cSJim Jagielski void ScCurrent();
615*b1cdbd2cSJim Jagielski void ScStyle();
616*b1cdbd2cSJim Jagielski void ScDde();
617*b1cdbd2cSJim Jagielski void ScBase();
618*b1cdbd2cSJim Jagielski void ScDecimal();
619*b1cdbd2cSJim Jagielski void ScConvert();
620*b1cdbd2cSJim Jagielski void ScEuroConvert();
621*b1cdbd2cSJim Jagielski 
622*b1cdbd2cSJim Jagielski //----------------------- Finanzfunktionen ------------------------------------
623*b1cdbd2cSJim Jagielski void ScNPV();
624*b1cdbd2cSJim Jagielski void ScIRR();
625*b1cdbd2cSJim Jagielski void ScMIRR();
626*b1cdbd2cSJim Jagielski void ScISPMT();
627*b1cdbd2cSJim Jagielski 
628*b1cdbd2cSJim Jagielski double ScGetBw(double fZins, double fZzr, double fRmz,
629*b1cdbd2cSJim Jagielski                       double fZw, double fF);
630*b1cdbd2cSJim Jagielski void ScBW();
631*b1cdbd2cSJim Jagielski void ScDIA();
632*b1cdbd2cSJim Jagielski double ScGetGDA(double fWert, double fRest, double fDauer,
633*b1cdbd2cSJim Jagielski                        double fPeriode, double fFaktor);
634*b1cdbd2cSJim Jagielski void ScGDA();
635*b1cdbd2cSJim Jagielski void ScGDA2();
636*b1cdbd2cSJim Jagielski double ScInterVDB(double fWert,double fRest,double fDauer,double fDauer1,
637*b1cdbd2cSJim Jagielski                 double fPeriode,double fFaktor);
638*b1cdbd2cSJim Jagielski void ScVDB();
639*b1cdbd2cSJim Jagielski void ScLaufz();
640*b1cdbd2cSJim Jagielski void ScLIA();
641*b1cdbd2cSJim Jagielski double ScGetRmz(double fZins, double fZzr, double fBw,
642*b1cdbd2cSJim Jagielski                        double fZw, double fF);
643*b1cdbd2cSJim Jagielski void ScRMZ();
644*b1cdbd2cSJim Jagielski void ScZGZ();
645*b1cdbd2cSJim Jagielski double ScGetZw(double fZins, double fZzr, double fRmz,
646*b1cdbd2cSJim Jagielski                       double fBw, double fF);
647*b1cdbd2cSJim Jagielski void ScZW();
648*b1cdbd2cSJim Jagielski void ScZZR();
649*b1cdbd2cSJim Jagielski bool RateIteration(double fNper, double fPayment, double fPv,
650*b1cdbd2cSJim Jagielski                                 double fFv, double fPayType, double& fGuess);
651*b1cdbd2cSJim Jagielski void ScZins();
652*b1cdbd2cSJim Jagielski double ScGetZinsZ(double fZins, double fZr, double fZzr, double fBw,
653*b1cdbd2cSJim Jagielski                          double fZw, double fF, double& fRmz);
654*b1cdbd2cSJim Jagielski void ScZinsZ();
655*b1cdbd2cSJim Jagielski void ScKapz();
656*b1cdbd2cSJim Jagielski void ScKumZinsZ();
657*b1cdbd2cSJim Jagielski void ScKumKapZ();
658*b1cdbd2cSJim Jagielski void ScEffektiv();
659*b1cdbd2cSJim Jagielski void ScNominal();
660*b1cdbd2cSJim Jagielski void ScMod();
661*b1cdbd2cSJim Jagielski void ScBackSolver();
662*b1cdbd2cSJim Jagielski void ScIntercept();
663*b1cdbd2cSJim Jagielski //-------------------------Funktionen in interpr5.cxx--------------------------
664*b1cdbd2cSJim Jagielski double ScGetGCD(double fx, double fy);
665*b1cdbd2cSJim Jagielski void ScGCD();
666*b1cdbd2cSJim Jagielski void ScLCM();
667*b1cdbd2cSJim Jagielski void ScPower();
668*b1cdbd2cSJim Jagielski void ScAmpersand();
669*b1cdbd2cSJim Jagielski void ScAdd();
670*b1cdbd2cSJim Jagielski void ScSub();
671*b1cdbd2cSJim Jagielski void ScMul();
672*b1cdbd2cSJim Jagielski void ScDiv();
673*b1cdbd2cSJim Jagielski void ScPow();
674*b1cdbd2cSJim Jagielski //-------------------------- Matrixfunktionen ---------------------------------
675*b1cdbd2cSJim Jagielski 
676*b1cdbd2cSJim Jagielski void ScMatValue();
677*b1cdbd2cSJim Jagielski void MEMat(ScMatrix* mM, SCSIZE n);
678*b1cdbd2cSJim Jagielski void ScMatDet();
679*b1cdbd2cSJim Jagielski void ScMatInv();
680*b1cdbd2cSJim Jagielski void ScMatMult();
681*b1cdbd2cSJim Jagielski void ScMatTrans();
682*b1cdbd2cSJim Jagielski void ScEMat();
683*b1cdbd2cSJim Jagielski void ScMatRef();
684*b1cdbd2cSJim Jagielski ScMatrixRef MatConcat(ScMatrix* pMat1, ScMatrix* pMat2);
685*b1cdbd2cSJim Jagielski void ScSumProduct();
686*b1cdbd2cSJim Jagielski void ScSumX2MY2();
687*b1cdbd2cSJim Jagielski void ScSumX2DY2();
688*b1cdbd2cSJim Jagielski void ScSumXMY2();
689*b1cdbd2cSJim Jagielski void ScGrowth();
690*b1cdbd2cSJim Jagielski bool CalculateSkew(double& fSum,double& fCount,double& vSum,std::vector<double>& values);
691*b1cdbd2cSJim Jagielski void CalculateSlopeIntercept(sal_Bool bSlope);
692*b1cdbd2cSJim Jagielski void CalculateSmallLarge(sal_Bool bSmall);
693*b1cdbd2cSJim Jagielski void CalculatePearsonCovar(sal_Bool _bPearson,sal_Bool _bStexy);
694*b1cdbd2cSJim Jagielski bool CalculateTest( sal_Bool _bTemplin
695*b1cdbd2cSJim Jagielski                    ,const SCSIZE nC1, const SCSIZE nC2,const SCSIZE nR1,const SCSIZE nR2
696*b1cdbd2cSJim Jagielski                    ,const ScMatrixRef& pMat1,const ScMatrixRef& pMat2
697*b1cdbd2cSJim Jagielski                    ,double& fT,double& fF);
698*b1cdbd2cSJim Jagielski void CalculateLookup(sal_Bool HLookup);
699*b1cdbd2cSJim Jagielski bool FillEntry(ScQueryEntry& rEntry);
700*b1cdbd2cSJim Jagielski void CalculateAddSub(sal_Bool _bSub);
701*b1cdbd2cSJim Jagielski void CalculateTrendGrowth(bool _bGrowth);
702*b1cdbd2cSJim Jagielski void CalulateRGPRKP(bool _bRKP);
703*b1cdbd2cSJim Jagielski void CalculateSumX2MY2SumX2DY2(sal_Bool _bSumX2DY2);
704*b1cdbd2cSJim Jagielski void CalculateMatrixValue(const ScMatrix* pMat,SCSIZE nC,SCSIZE nR);
705*b1cdbd2cSJim Jagielski bool CheckMatrix(bool _bLOG,sal_uInt8& nCase,SCSIZE& nCX,SCSIZE& nCY,SCSIZE& nRX,SCSIZE& nRY,SCSIZE& M,SCSIZE& N,ScMatrixRef& pMatX,ScMatrixRef& pMatY);
706*b1cdbd2cSJim Jagielski void ScRGP();
707*b1cdbd2cSJim Jagielski void ScRKP();
708*b1cdbd2cSJim Jagielski void ScForecast();
709*b1cdbd2cSJim Jagielski //------------------------- Functions in interpr3.cxx -------------------------
710*b1cdbd2cSJim Jagielski void ScNoName();
711*b1cdbd2cSJim Jagielski void ScBadName();
712*b1cdbd2cSJim Jagielski // Statistik:
713*b1cdbd2cSJim Jagielski double phi(double x);
714*b1cdbd2cSJim Jagielski double integralPhi(double x);
715*b1cdbd2cSJim Jagielski double taylor(double* pPolynom, sal_uInt16 nMax, double x);
716*b1cdbd2cSJim Jagielski double gauss(double x);
717*b1cdbd2cSJim Jagielski double gaussinv(double x);
718*b1cdbd2cSJim Jagielski double GetBetaDist(double x, double alpha, double beta);  //cumulative distribution function
719*b1cdbd2cSJim Jagielski double GetBetaDistPDF(double fX, double fA, double fB); //probability density function)
720*b1cdbd2cSJim Jagielski double GetChiDist(double fChi, double fDF);     // for LEGACY.CHIDIST, returns right tail
721*b1cdbd2cSJim Jagielski double GetChiSqDistCDF(double fX, double fDF);  // for CHISQDIST, returns left tail
722*b1cdbd2cSJim Jagielski double GetChiSqDistPDF(double fX, double fDF);  // probability density function
723*b1cdbd2cSJim Jagielski double GetFDist(double x, double fF1, double fF2);
724*b1cdbd2cSJim Jagielski double GetTDist(double T, double fDF);
725*b1cdbd2cSJim Jagielski double Fakultaet(double x);
726*b1cdbd2cSJim Jagielski double BinomKoeff(double n, double k);
727*b1cdbd2cSJim Jagielski double GetGamma(double x);
728*b1cdbd2cSJim Jagielski double GetLogGamma(double x);
729*b1cdbd2cSJim Jagielski double GetBeta(double fAlpha, double fBeta);
730*b1cdbd2cSJim Jagielski double GetLogBeta(double fAlpha, double fBeta);
731*b1cdbd2cSJim Jagielski double GetBinomDistPMF(double x, double n, double p); //probability mass function
732*b1cdbd2cSJim Jagielski void ScLogGamma();
733*b1cdbd2cSJim Jagielski void ScGamma();
734*b1cdbd2cSJim Jagielski void ScPhi();
735*b1cdbd2cSJim Jagielski void ScGauss();
736*b1cdbd2cSJim Jagielski void ScStdNormDist();
737*b1cdbd2cSJim Jagielski void ScFisher();
738*b1cdbd2cSJim Jagielski void ScFisherInv();
739*b1cdbd2cSJim Jagielski void ScFact();
740*b1cdbd2cSJim Jagielski void ScNormDist();
741*b1cdbd2cSJim Jagielski void ScGammaDist();
742*b1cdbd2cSJim Jagielski void ScGammaInv();
743*b1cdbd2cSJim Jagielski void ScExpDist();
744*b1cdbd2cSJim Jagielski void ScBinomDist();
745*b1cdbd2cSJim Jagielski void ScPoissonDist();
746*b1cdbd2cSJim Jagielski void ScKombin();
747*b1cdbd2cSJim Jagielski void ScKombin2();
748*b1cdbd2cSJim Jagielski void ScVariationen();
749*b1cdbd2cSJim Jagielski void ScVariationen2();
750*b1cdbd2cSJim Jagielski void ScB();
751*b1cdbd2cSJim Jagielski void ScHypGeomDist();
752*b1cdbd2cSJim Jagielski void ScLogNormDist();
753*b1cdbd2cSJim Jagielski void ScLogNormInv();
754*b1cdbd2cSJim Jagielski void ScTDist();
755*b1cdbd2cSJim Jagielski void ScFDist();
756*b1cdbd2cSJim Jagielski void ScChiDist();   // for LEGACY.CHIDIST, returns right tail
757*b1cdbd2cSJim Jagielski void ScChiSqDist(); // returns left tail or density
758*b1cdbd2cSJim Jagielski void ScChiSqInv(); //invers to CHISQDIST
759*b1cdbd2cSJim Jagielski void ScWeibull();
760*b1cdbd2cSJim Jagielski void ScBetaDist();
761*b1cdbd2cSJim Jagielski void ScFInv();
762*b1cdbd2cSJim Jagielski void ScTInv();
763*b1cdbd2cSJim Jagielski void ScChiInv();
764*b1cdbd2cSJim Jagielski void ScBetaInv();
765*b1cdbd2cSJim Jagielski void ScCritBinom();
766*b1cdbd2cSJim Jagielski void ScNegBinomDist();
767*b1cdbd2cSJim Jagielski void ScKurt();
768*b1cdbd2cSJim Jagielski void ScHarMean();
769*b1cdbd2cSJim Jagielski void ScGeoMean();
770*b1cdbd2cSJim Jagielski void ScStandard();
771*b1cdbd2cSJim Jagielski void ScSkew();
772*b1cdbd2cSJim Jagielski void ScMedian();
773*b1cdbd2cSJim Jagielski double GetMedian( ::std::vector<double> & rArray );
774*b1cdbd2cSJim Jagielski double GetPercentile( ::std::vector<double> & rArray, double fPercentile );
775*b1cdbd2cSJim Jagielski void GetNumberSequenceArray( sal_uInt8 nParamCount, ::std::vector<double>& rArray );
776*b1cdbd2cSJim Jagielski void GetSortArray(sal_uInt8 nParamCount, ::std::vector<double>& rSortArray, ::std::vector<long>* pIndexOrder = NULL);
777*b1cdbd2cSJim Jagielski void QuickSort(::std::vector<double>& rSortArray, ::std::vector<long>* pIndexOrder = NULL);
778*b1cdbd2cSJim Jagielski void ScModalValue();
779*b1cdbd2cSJim Jagielski void ScAveDev();
780*b1cdbd2cSJim Jagielski void ScDevSq();
781*b1cdbd2cSJim Jagielski void ScZTest();
782*b1cdbd2cSJim Jagielski void ScTTest();
783*b1cdbd2cSJim Jagielski void ScFTest();
784*b1cdbd2cSJim Jagielski void ScChiTest();
785*b1cdbd2cSJim Jagielski void ScRank();
786*b1cdbd2cSJim Jagielski void ScPercentile();
787*b1cdbd2cSJim Jagielski void ScPercentrank();
788*b1cdbd2cSJim Jagielski void ScLarge();
789*b1cdbd2cSJim Jagielski void ScSmall();
790*b1cdbd2cSJim Jagielski void ScFrequency();
791*b1cdbd2cSJim Jagielski void ScQuartile();
792*b1cdbd2cSJim Jagielski void ScNormInv();
793*b1cdbd2cSJim Jagielski void ScSNormInv();
794*b1cdbd2cSJim Jagielski void ScConfidence();
795*b1cdbd2cSJim Jagielski void ScTrimMean();
796*b1cdbd2cSJim Jagielski void ScProbability();
797*b1cdbd2cSJim Jagielski void ScCorrel();
798*b1cdbd2cSJim Jagielski void ScCovar();
799*b1cdbd2cSJim Jagielski void ScPearson();
800*b1cdbd2cSJim Jagielski void ScRSQ();
801*b1cdbd2cSJim Jagielski void ScSTEXY();
802*b1cdbd2cSJim Jagielski void ScSlope();
803*b1cdbd2cSJim Jagielski void ScTrend();
804*b1cdbd2cSJim Jagielski void ScInfo();
805*b1cdbd2cSJim Jagielski void ScLenB();
806*b1cdbd2cSJim Jagielski void ScRightB();
807*b1cdbd2cSJim Jagielski void ScLeftB();
808*b1cdbd2cSJim Jagielski void ScMidB();
809*b1cdbd2cSJim Jagielski 
810*b1cdbd2cSJim Jagielski //------------------------ Functions in interpr6.cxx -------------------------
811*b1cdbd2cSJim Jagielski 
812*b1cdbd2cSJim Jagielski static const double fMaxGammaArgument;  // defined in interpr3.cxx
813*b1cdbd2cSJim Jagielski 
814*b1cdbd2cSJim Jagielski double GetGammaContFraction(double fA,double fX);
815*b1cdbd2cSJim Jagielski double GetGammaSeries(double fA,double fX);
816*b1cdbd2cSJim Jagielski double GetLowRegIGamma(double fA,double fX);    // lower regularized incomplete gamma function, GAMMAQ
817*b1cdbd2cSJim Jagielski double GetUpRegIGamma(double fA,double fX);     // upper regularized incomplete gamma function, GAMMAP
818*b1cdbd2cSJim Jagielski // probability density function; fLambda is "scale" parameter
819*b1cdbd2cSJim Jagielski double GetGammaDistPDF(double fX, double fAlpha, double fLambda);
820*b1cdbd2cSJim Jagielski // cumulative distribution function; fLambda is "scale" parameter
821*b1cdbd2cSJim Jagielski double GetGammaDist(double fX, double fAlpha, double fLambda);
822*b1cdbd2cSJim Jagielski 
823*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
824*b1cdbd2cSJim Jagielski public:
825*b1cdbd2cSJim Jagielski     ScInterpreter( ScFormulaCell* pCell, ScDocument* pDoc,
826*b1cdbd2cSJim Jagielski                     const ScAddress&, ScTokenArray& );
827*b1cdbd2cSJim Jagielski     ~ScInterpreter();
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski     formula::StackVar Interpret();
830*b1cdbd2cSJim Jagielski 
SetError(sal_uInt16 nError)831*b1cdbd2cSJim Jagielski     void SetError(sal_uInt16 nError)
832*b1cdbd2cSJim Jagielski             { if (nError && !nGlobalError) nGlobalError = nError; }
833*b1cdbd2cSJim Jagielski 
GetError() const834*b1cdbd2cSJim Jagielski     sal_uInt16 GetError()                           const   { return nGlobalError; }
GetResultType() const835*b1cdbd2cSJim Jagielski     formula::StackVar  GetResultType()              const   { return xResult->GetType(); }
GetStringResult() const836*b1cdbd2cSJim Jagielski     const String&   GetStringResult()               const   { return xResult->GetString(); }
GetNumResult() const837*b1cdbd2cSJim Jagielski     double          GetNumResult()                  const   { return xResult->GetDouble(); }
838*b1cdbd2cSJim Jagielski     formula::FormulaTokenRef
GetResultToken() const839*b1cdbd2cSJim Jagielski                     GetResultToken()                const   { return xResult; }
GetRetFormatType() const840*b1cdbd2cSJim Jagielski     short           GetRetFormatType()              const   { return nRetFmtType; }
GetRetFormatIndex() const841*b1cdbd2cSJim Jagielski     sal_uLong       GetRetFormatIndex()             const   { return nRetFmtIndex; }
GetLastStackRefToken()842*b1cdbd2cSJim Jagielski     ScToken*        GetLastStackRefToken() { return pLastStackRefToken; }
IsReferenceFunc()843*b1cdbd2cSJim Jagielski     bool            IsReferenceFunc() { return bRefFunc; }
844*b1cdbd2cSJim Jagielski };
845*b1cdbd2cSJim Jagielski 
846*b1cdbd2cSJim Jagielski 
MatrixDoubleRefToMatrix()847*b1cdbd2cSJim Jagielski inline void ScInterpreter::MatrixDoubleRefToMatrix()
848*b1cdbd2cSJim Jagielski {
849*b1cdbd2cSJim Jagielski     if ( bMatrixFormula && GetStackType() == formula::svDoubleRef )
850*b1cdbd2cSJim Jagielski     {
851*b1cdbd2cSJim Jagielski         GetTokenMatrixMap();    // make sure it exists, create if not.
852*b1cdbd2cSJim Jagielski         PopDoubleRefPushMatrix();
853*b1cdbd2cSJim Jagielski     }
854*b1cdbd2cSJim Jagielski }
855*b1cdbd2cSJim Jagielski 
856*b1cdbd2cSJim Jagielski 
MatrixParameterConversion()857*b1cdbd2cSJim Jagielski inline bool ScInterpreter::MatrixParameterConversion()
858*b1cdbd2cSJim Jagielski {
859*b1cdbd2cSJim Jagielski     if ( (bMatrixFormula || pCur->HasForceArray()) && !pJumpMatrix && sp > 0 )
860*b1cdbd2cSJim Jagielski         return ConvertMatrixParameters();
861*b1cdbd2cSJim Jagielski     return false;
862*b1cdbd2cSJim Jagielski }
863*b1cdbd2cSJim Jagielski 
864*b1cdbd2cSJim Jagielski 
GetTokenMatrixMap()865*b1cdbd2cSJim Jagielski inline ScTokenMatrixMap& ScInterpreter::GetTokenMatrixMap()
866*b1cdbd2cSJim Jagielski {
867*b1cdbd2cSJim Jagielski     if (!pTokenMatrixMap)
868*b1cdbd2cSJim Jagielski         pTokenMatrixMap = CreateTokenMatrixMap();
869*b1cdbd2cSJim Jagielski     return *pTokenMatrixMap;
870*b1cdbd2cSJim Jagielski }
871*b1cdbd2cSJim Jagielski 
872*b1cdbd2cSJim Jagielski 
MustHaveParamCount(short nAct,short nMust)873*b1cdbd2cSJim Jagielski inline sal_Bool ScInterpreter::MustHaveParamCount( short nAct, short nMust )
874*b1cdbd2cSJim Jagielski {
875*b1cdbd2cSJim Jagielski     if ( nAct == nMust )
876*b1cdbd2cSJim Jagielski         return sal_True;
877*b1cdbd2cSJim Jagielski     if ( nAct < nMust )
878*b1cdbd2cSJim Jagielski         PushParameterExpected();
879*b1cdbd2cSJim Jagielski     else
880*b1cdbd2cSJim Jagielski         PushIllegalParameter();
881*b1cdbd2cSJim Jagielski     return sal_False;
882*b1cdbd2cSJim Jagielski }
883*b1cdbd2cSJim Jagielski 
884*b1cdbd2cSJim Jagielski 
MustHaveParamCount(short nAct,short nMust,short nMax)885*b1cdbd2cSJim Jagielski inline sal_Bool ScInterpreter::MustHaveParamCount( short nAct, short nMust, short nMax )
886*b1cdbd2cSJim Jagielski {
887*b1cdbd2cSJim Jagielski     if ( nMust <= nAct && nAct <= nMax )
888*b1cdbd2cSJim Jagielski         return sal_True;
889*b1cdbd2cSJim Jagielski     if ( nAct < nMust )
890*b1cdbd2cSJim Jagielski         PushParameterExpected();
891*b1cdbd2cSJim Jagielski     else
892*b1cdbd2cSJim Jagielski         PushIllegalParameter();
893*b1cdbd2cSJim Jagielski     return sal_False;
894*b1cdbd2cSJim Jagielski }
895*b1cdbd2cSJim Jagielski 
896*b1cdbd2cSJim Jagielski 
MustHaveParamCountMin(short nAct,short nMin)897*b1cdbd2cSJim Jagielski inline sal_Bool ScInterpreter::MustHaveParamCountMin( short nAct, short nMin )
898*b1cdbd2cSJim Jagielski {
899*b1cdbd2cSJim Jagielski     if ( nAct >= nMin )
900*b1cdbd2cSJim Jagielski         return sal_True;
901*b1cdbd2cSJim Jagielski     PushParameterExpected();
902*b1cdbd2cSJim Jagielski     return sal_False;
903*b1cdbd2cSJim Jagielski }
904*b1cdbd2cSJim Jagielski 
905*b1cdbd2cSJim Jagielski 
CheckStringResultLen(String & rResult,const String & rAdd)906*b1cdbd2cSJim Jagielski inline sal_Bool ScInterpreter::CheckStringResultLen( String& rResult, const String& rAdd )
907*b1cdbd2cSJim Jagielski {
908*b1cdbd2cSJim Jagielski     if ( (sal_uLong) rResult.Len() + rAdd.Len() > STRING_MAXLEN )
909*b1cdbd2cSJim Jagielski     {
910*b1cdbd2cSJim Jagielski         SetError( errStringOverflow );
911*b1cdbd2cSJim Jagielski         rResult.Erase();
912*b1cdbd2cSJim Jagielski         return sal_False;
913*b1cdbd2cSJim Jagielski     }
914*b1cdbd2cSJim Jagielski     return sal_True;
915*b1cdbd2cSJim Jagielski }
916*b1cdbd2cSJim Jagielski 
917*b1cdbd2cSJim Jagielski 
TreatDoubleError(double & rVal)918*b1cdbd2cSJim Jagielski inline void ScInterpreter::TreatDoubleError( double& rVal )
919*b1cdbd2cSJim Jagielski {
920*b1cdbd2cSJim Jagielski     if ( !::rtl::math::isFinite( rVal ) )
921*b1cdbd2cSJim Jagielski     {
922*b1cdbd2cSJim Jagielski         sal_uInt16 nErr = GetDoubleErrorValue( rVal );
923*b1cdbd2cSJim Jagielski         if ( nErr )
924*b1cdbd2cSJim Jagielski             SetError( nErr );
925*b1cdbd2cSJim Jagielski         else
926*b1cdbd2cSJim Jagielski             SetError( errNoValue );
927*b1cdbd2cSJim Jagielski         rVal = 0.0;
928*b1cdbd2cSJim Jagielski     }
929*b1cdbd2cSJim Jagielski }
930*b1cdbd2cSJim Jagielski 
931*b1cdbd2cSJim Jagielski 
932*b1cdbd2cSJim Jagielski // static
div(const double & fNumerator,const double & fDenominator)933*b1cdbd2cSJim Jagielski inline double ScInterpreter::div( const double& fNumerator, const double& fDenominator )
934*b1cdbd2cSJim Jagielski {
935*b1cdbd2cSJim Jagielski     return (fDenominator != 0.0) ? (fNumerator / fDenominator) :
936*b1cdbd2cSJim Jagielski         CreateDoubleError( errDivisionByZero);
937*b1cdbd2cSJim Jagielski }
938*b1cdbd2cSJim Jagielski 
939*b1cdbd2cSJim Jagielski #endif
940