| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| #ifndef _CALC_HXX |
| #define _CALC_HXX |
| |
| #include <svl/svarray.hxx> |
| #include <unotools/syslocale.hxx> |
| |
| #ifndef __SBX_SBXVALUE //autogen |
| #include <basic/sbxvar.hxx> |
| #endif |
| #include "swdllapi.h" |
| |
| class CharClass; |
| class LocaleDataWrapper; |
| class SwFieldType; |
| class SwDoc; |
| |
| #define TBLSZ 47 // sollte Primzahl sein, wegen HashTable |
| |
| const sal_Unicode cListDelim = '|'; |
| |
| /****************************************************************************** |
| * Calculate Operations |
| ******************************************************************************/ |
| enum SwCalcOper |
| { |
| CALC_NAME, CALC_NUMBER, CALC_ENDCALC, |
| CALC_PLUS='+', CALC_MINUS='-', CALC_MUL='*', |
| CALC_DIV='/', CALC_PRINT=';', CALC_ASSIGN='=', |
| CALC_LP='(', CALC_RP=')', CALC_PHD='%', |
| CALC_POW='^', |
| CALC_LISTOP = cListDelim, |
| CALC_NOT=256, CALC_AND=257, CALC_OR=258, |
| CALC_XOR=259, CALC_EQ=260, CALC_NEQ=261, |
| CALC_LEQ=262, CALC_GEQ=263, CALC_LES=264, |
| CALC_GRE=265, CALC_SUM=266, CALC_MEAN=267, |
| CALC_SQRT=268, CALC_MIN=269, CALC_MIN_IN=270, |
| CALC_MAX=271, CALC_MAX_IN=272, CALC_SIN=273, |
| CALC_COS=274, CALC_TAN=275, CALC_ASIN=276, |
| CALC_ACOS=278, CALC_ATAN=279, CALC_TDIF=280, |
| CALC_ROUND=281, CALC_DATE=282, CALC_MONTH=283, |
| CALC_DAY=284 |
| }; |
| |
| //-- Calculate Operations Strings ----------------------------------------- |
| |
| extern const sal_Char __FAR_DATA sCalc_Add[]; |
| extern const sal_Char __FAR_DATA sCalc_Sub[]; |
| extern const sal_Char __FAR_DATA sCalc_Mul[]; |
| extern const sal_Char __FAR_DATA sCalc_Div[]; |
| extern const sal_Char __FAR_DATA sCalc_Phd[]; |
| extern const sal_Char __FAR_DATA sCalc_Sqrt[]; |
| extern const sal_Char __FAR_DATA sCalc_Pow[]; |
| extern const sal_Char __FAR_DATA sCalc_Or[]; |
| extern const sal_Char __FAR_DATA sCalc_Xor[]; |
| extern const sal_Char __FAR_DATA sCalc_And[]; |
| extern const sal_Char __FAR_DATA sCalc_Not[]; |
| extern const sal_Char __FAR_DATA sCalc_Eq[]; |
| extern const sal_Char __FAR_DATA sCalc_Neq[]; |
| extern const sal_Char __FAR_DATA sCalc_Leq[]; |
| extern const sal_Char __FAR_DATA sCalc_Geq[]; |
| extern const sal_Char __FAR_DATA sCalc_L[]; |
| extern const sal_Char __FAR_DATA sCalc_G[]; |
| extern const sal_Char __FAR_DATA sCalc_Sum[]; |
| extern const sal_Char __FAR_DATA sCalc_Mean[]; |
| extern const sal_Char __FAR_DATA sCalc_Min[]; |
| extern const sal_Char __FAR_DATA sCalc_Max[]; |
| extern const sal_Char __FAR_DATA sCalc_Sin[]; |
| extern const sal_Char __FAR_DATA sCalc_Cos[]; |
| extern const sal_Char __FAR_DATA sCalc_Tan[]; |
| extern const sal_Char __FAR_DATA sCalc_Asin[]; |
| extern const sal_Char __FAR_DATA sCalc_Acos[]; |
| extern const sal_Char __FAR_DATA sCalc_Atan[]; |
| extern const sal_Char __FAR_DATA sCalc_Tdif[]; |
| extern const sal_Char __FAR_DATA sCalc_Round[]; |
| extern const sal_Char __FAR_DATA sCalc_Date[]; |
| |
| /****************************************************************************** |
| * Calculate ErrorCodes |
| ******************************************************************************/ |
| enum SwCalcError |
| { |
| CALC_NOERR=0, |
| CALC_SYNTAX, // Syntax Fehler |
| CALC_ZERODIV, // Division durch Null |
| CALC_BRACK, // Fehlerhafte Klammerung |
| CALC_POWERR, // Ueberlauf in Quadratfunktion |
| CALC_VARNFND, // Variable wurde nicht gefunden |
| CALC_OVERFLOW, // Ueberlauf |
| CALC_WRONGTIME // falsches Zeitformat |
| }; |
| |
| class SwSbxValue : public SbxValue |
| { |
| bool bVoid; |
| public: |
| //JP 03.02.99: immer auf eine Zahl defaulten, damit auch gerechnet wird. |
| // Ansonsten wird daraus ein SbxEMPTY und damit ist nichts |
| // anzufangen. |
| SwSbxValue( long n = 0 ) : bVoid(false) { PutLong( n ); } |
| SwSbxValue( const double& rD ) : bVoid(false) { PutDouble( rD ); } |
| SwSbxValue( const SwSbxValue& rVal ) : |
| SvRefBase( rVal ), |
| SbxValue( rVal ), |
| bVoid(rVal.bVoid) |
| {} |
| virtual ~SwSbxValue(); |
| |
| |
| // Strings sonderbehandeln |
| sal_Bool GetBool() const; |
| // Strings sonderbehandeln BOOLs sonderbehandeln |
| double GetDouble() const; |
| SwSbxValue& MakeDouble(); |
| |
| bool IsVoidValue() {return bVoid;} |
| void SetVoidValue(bool bSet) {bVoid = bSet;} |
| }; |
| |
| /****************************************************************************** |
| * Calculate HashTables fuer VarTable und Operations |
| ******************************************************************************/ |
| struct SwHash |
| { |
| SwHash( const String& rStr ); |
| virtual ~SwHash(); |
| String aStr; |
| SwHash *pNext; |
| }; |
| |
| struct SwCalcExp : public SwHash |
| { |
| SwSbxValue nValue; |
| const SwFieldType* pFldType; |
| |
| SwCalcExp( const String& rStr, const SwSbxValue& rVal, |
| const SwFieldType* pFldType = 0 ); |
| }; |
| |
| SwHash* Find( const String& rSrch, SwHash** ppTable, |
| sal_uInt16 nTblSize, sal_uInt16* pPos = 0 ); |
| |
| void DeleteHashTable( SwHash** ppTable, sal_uInt16 nTblSize ); |
| |
| // falls _CalcOp != 0, dann ist das ein gueltiger Operator |
| struct _CalcOp; |
| _CalcOp* FindOperator( const String& rSearch ); |
| |
| /****************************************************************************** |
| * class SwCalc |
| ******************************************************************************/ |
| class SwCalc |
| { |
| SwHash* VarTable[ TBLSZ ]; |
| String aVarName, sCurrSym; |
| String sCommand; |
| SvPtrarr aRekurStk; |
| SwSbxValue nLastLeft; |
| SwSbxValue nNumberValue; |
| SwCalcExp aErrExpr; |
| xub_StrLen nCommandPos; |
| |
| SwDoc& rDoc; |
| SvtSysLocale m_aSysLocale; |
| const LocaleDataWrapper* pLclData; |
| CharClass* pCharClass; |
| |
| sal_uInt16 nListPor; |
| SwCalcOper eCurrOper; |
| SwCalcOper eCurrListOper; |
| SwCalcError eError; |
| |
| |
| SwCalcOper GetToken(); |
| SwSbxValue Expr(); |
| SwSbxValue Term(); |
| SwSbxValue Prim(); |
| |
| sal_Bool ParseTime( sal_uInt16*, sal_uInt16*, sal_uInt16* ); |
| |
| String GetColumnName( const String& rName ); |
| String GetDBName( const String& rName ); |
| |
| // dont call this methods |
| SwCalc( const SwCalc& ); |
| SwCalc& operator=( const SwCalc& ); |
| |
| public: |
| SwCalc( SwDoc& rD ); |
| ~SwCalc(); |
| |
| SwSbxValue Calculate( const String &rStr ); |
| String GetStrResult( const SwSbxValue& rValue, sal_Bool bRound = sal_True ); |
| String GetStrResult( double, sal_Bool bRound = sal_True ); |
| |
| SwCalcExp* VarInsert( const String& r ); |
| SwCalcExp* VarLook( const String &rStr, sal_uInt16 ins = 0 ); |
| void VarChange( const String& rStr, const SwSbxValue& rValue ); |
| void VarChange( const String& rStr, double ); |
| SwHash** GetVarTable() { return VarTable; } |
| |
| sal_Bool Push( const VoidPtr pPtr ); |
| void Pop( const VoidPtr pPtr ); |
| |
| void SetCalcError( SwCalcError eErr ) { eError = eErr; } |
| sal_Bool IsCalcError() const { return 0 != eError; } |
| |
| static bool Str2Double( const String& rStr, xub_StrLen& rPos, |
| double& rVal, |
| LocaleDataWrapper const*const pData = 0 ); |
| static bool Str2Double( const String& rStr, xub_StrLen& rPos, |
| double& rVal, SwDoc *const pDoc ); |
| |
| SW_DLLPUBLIC static sal_Bool IsValidVarName( const String& rStr, |
| String* pValidName = 0 ); |
| }; |
| |
| #endif |