2010-10-14 01:30:41 -05:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2000-09-18 11:15:01 -05:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-10 04:50:35 -05:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 11:15:01 -05:00
|
|
|
*
|
2010-02-12 08:01:35 -06:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2000-09-18 11:15:01 -05:00
|
|
|
*
|
2008-04-10 04:50:35 -05:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 11:15:01 -05:00
|
|
|
*
|
2008-04-10 04:50:35 -05:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 11:15:01 -05:00
|
|
|
*
|
2008-04-10 04:50:35 -05:00
|
|
|
* 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.
|
2000-09-18 11:15:01 -05:00
|
|
|
*
|
2008-04-10 04:50:35 -05:00
|
|
|
* 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).
|
2000-09-18 11:15:01 -05:00
|
|
|
*
|
2008-04-10 04:50:35 -05:00
|
|
|
* 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.
|
2000-09-18 11:15:01 -05:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
#ifndef _CALC_HXX
|
|
|
|
#define _CALC_HXX
|
|
|
|
|
2009-10-15 17:05:16 -05:00
|
|
|
#include <svl/svarray.hxx>
|
2010-10-07 05:27:28 -05:00
|
|
|
#include <unotools/syslocale.hxx>
|
2000-09-18 11:15:01 -05:00
|
|
|
|
|
|
|
#ifndef __SBX_SBXVALUE //autogen
|
2005-04-13 03:41:52 -05:00
|
|
|
#include <basic/sbxvar.hxx>
|
2000-09-18 11:15:01 -05:00
|
|
|
#endif
|
2004-08-23 02:28:29 -05:00
|
|
|
#include "swdllapi.h"
|
|
|
|
|
2000-09-18 11:15:01 -05:00
|
|
|
class CharClass;
|
2000-11-20 02:16:31 -06:00
|
|
|
class LocaleDataWrapper;
|
2000-09-18 11:15:01 -05:00
|
|
|
class SwFieldType;
|
|
|
|
class SwDoc;
|
|
|
|
|
2010-11-15 16:37:49 -06:00
|
|
|
#define TBLSZ 47 // should be a prime, because of hash table
|
2000-09-18 11:15:01 -05:00
|
|
|
|
|
|
|
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,
|
2008-06-16 06:18:16 -05:00
|
|
|
CALC_ROUND=281, CALC_DATE=282, CALC_MONTH=283,
|
|
|
|
CALC_DAY=284
|
2000-09-18 11:15:01 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
//-- Calculate Operations Strings -----------------------------------------
|
|
|
|
|
2010-12-06 04:36:22 -06:00
|
|
|
extern const sal_Char sCalc_Add[];
|
|
|
|
extern const sal_Char sCalc_Sub[];
|
|
|
|
extern const sal_Char sCalc_Mul[];
|
|
|
|
extern const sal_Char sCalc_Div[];
|
|
|
|
extern const sal_Char sCalc_Phd[];
|
|
|
|
extern const sal_Char sCalc_Sqrt[];
|
|
|
|
extern const sal_Char sCalc_Pow[];
|
|
|
|
extern const sal_Char sCalc_Or[];
|
|
|
|
extern const sal_Char sCalc_Xor[];
|
|
|
|
extern const sal_Char sCalc_And[];
|
|
|
|
extern const sal_Char sCalc_Not[];
|
|
|
|
extern const sal_Char sCalc_Eq[];
|
|
|
|
extern const sal_Char sCalc_Neq[];
|
|
|
|
extern const sal_Char sCalc_Leq[];
|
|
|
|
extern const sal_Char sCalc_Geq[];
|
|
|
|
extern const sal_Char sCalc_L[];
|
|
|
|
extern const sal_Char sCalc_G[];
|
|
|
|
extern const sal_Char sCalc_Sum[];
|
|
|
|
extern const sal_Char sCalc_Mean[];
|
|
|
|
extern const sal_Char sCalc_Min[];
|
|
|
|
extern const sal_Char sCalc_Max[];
|
|
|
|
extern const sal_Char sCalc_Sin[];
|
|
|
|
extern const sal_Char sCalc_Cos[];
|
|
|
|
extern const sal_Char sCalc_Tan[];
|
|
|
|
extern const sal_Char sCalc_Asin[];
|
|
|
|
extern const sal_Char sCalc_Acos[];
|
|
|
|
extern const sal_Char sCalc_Atan[];
|
|
|
|
extern const sal_Char sCalc_Tdif[];
|
|
|
|
extern const sal_Char sCalc_Round[];
|
|
|
|
extern const sal_Char sCalc_Date[];
|
2000-09-18 11:15:01 -05:00
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
* Calculate ErrorCodes
|
|
|
|
******************************************************************************/
|
|
|
|
enum SwCalcError
|
|
|
|
{
|
|
|
|
CALC_NOERR=0,
|
2010-11-15 16:37:49 -06:00
|
|
|
CALC_SYNTAX, // syntax error
|
|
|
|
CALC_ZERODIV, // division by zero
|
|
|
|
CALC_BRACK, // faulty brackets
|
|
|
|
CALC_POWERR, // overflow in power function
|
|
|
|
CALC_VARNFND, // variable was not found
|
|
|
|
CALC_OVERFLOW, // overflow
|
|
|
|
CALC_WRONGTIME // wrong time format
|
2000-09-18 11:15:01 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
class SwSbxValue : public SbxValue
|
|
|
|
{
|
2005-10-19 02:21:02 -05:00
|
|
|
bool bVoid;
|
2000-09-18 11:15:01 -05:00
|
|
|
public:
|
2010-11-15 16:37:49 -06:00
|
|
|
// always default to a number. otherwise it will become a SbxEMPTY
|
2005-10-19 02:21:02 -05:00
|
|
|
SwSbxValue( long n = 0 ) : bVoid(false) { PutLong( n ); }
|
|
|
|
SwSbxValue( const double& rD ) : bVoid(false) { PutDouble( rD ); }
|
|
|
|
SwSbxValue( const SwSbxValue& rVal ) :
|
2007-09-27 01:56:41 -05:00
|
|
|
SvRefBase( rVal ),
|
2005-10-19 02:21:02 -05:00
|
|
|
SbxValue( rVal ),
|
|
|
|
bVoid(rVal.bVoid)
|
|
|
|
{}
|
2000-09-18 11:15:01 -05:00
|
|
|
virtual ~SwSbxValue();
|
|
|
|
|
2003-03-27 08:45:43 -06:00
|
|
|
|
2011-01-17 08:06:54 -06:00
|
|
|
sal_Bool GetBool() const;
|
2000-09-18 11:15:01 -05:00
|
|
|
double GetDouble() const;
|
|
|
|
SwSbxValue& MakeDouble();
|
2005-10-19 02:21:02 -05:00
|
|
|
|
|
|
|
bool IsVoidValue() {return bVoid;}
|
2005-11-11 11:47:46 -06:00
|
|
|
void SetVoidValue(bool bSet) {bVoid = bSet;}
|
2000-09-18 11:15:01 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
/******************************************************************************
|
2010-11-15 16:37:49 -06:00
|
|
|
* Calculate HashTables for VarTable und Operations
|
2000-09-18 11:15:01 -05:00
|
|
|
******************************************************************************/
|
|
|
|
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,
|
2011-01-17 08:06:54 -06:00
|
|
|
sal_uInt16 nTblSize, sal_uInt16* pPos = 0 );
|
2000-09-18 11:15:01 -05:00
|
|
|
|
2011-01-17 08:06:54 -06:00
|
|
|
void DeleteHashTable( SwHash** ppTable, sal_uInt16 nTblSize );
|
2000-09-18 11:15:01 -05:00
|
|
|
|
2010-11-15 16:37:49 -06:00
|
|
|
// if _CalcOp != 0, this is a valid operator
|
2000-09-18 11:15:01 -05:00
|
|
|
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;
|
2010-10-07 05:27:28 -05:00
|
|
|
SvtSysLocale m_aSysLocale;
|
2009-09-07 23:57:32 -05:00
|
|
|
const LocaleDataWrapper* pLclData;
|
2000-09-18 11:15:01 -05:00
|
|
|
CharClass* pCharClass;
|
|
|
|
|
2011-01-17 08:06:54 -06:00
|
|
|
sal_uInt16 nListPor;
|
2000-09-18 11:15:01 -05:00
|
|
|
SwCalcOper eCurrOper;
|
|
|
|
SwCalcOper eCurrListOper;
|
|
|
|
SwCalcError eError;
|
|
|
|
|
|
|
|
|
|
|
|
SwCalcOper GetToken();
|
|
|
|
SwSbxValue Expr();
|
|
|
|
SwSbxValue Term();
|
|
|
|
SwSbxValue Prim();
|
|
|
|
|
2011-01-17 08:06:54 -06:00
|
|
|
sal_Bool ParseTime( sal_uInt16*, sal_uInt16*, sal_uInt16* );
|
2000-09-18 11:15:01 -05:00
|
|
|
|
|
|
|
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 );
|
2011-01-17 08:06:54 -06:00
|
|
|
String GetStrResult( const SwSbxValue& rValue, sal_Bool bRound = sal_True );
|
|
|
|
String GetStrResult( double, sal_Bool bRound = sal_True );
|
2000-09-18 11:15:01 -05:00
|
|
|
|
|
|
|
SwCalcExp* VarInsert( const String& r );
|
2011-01-17 08:06:54 -06:00
|
|
|
SwCalcExp* VarLook( const String &rStr, sal_uInt16 ins = 0 );
|
2000-09-18 11:15:01 -05:00
|
|
|
void VarChange( const String& rStr, const SwSbxValue& rValue );
|
|
|
|
void VarChange( const String& rStr, double );
|
|
|
|
SwHash** GetVarTable() { return VarTable; }
|
|
|
|
|
2011-01-17 08:06:54 -06:00
|
|
|
sal_Bool Push( const VoidPtr pPtr );
|
2000-09-18 11:15:01 -05:00
|
|
|
void Pop( const VoidPtr pPtr );
|
|
|
|
|
|
|
|
void SetCalcError( SwCalcError eErr ) { eError = eErr; }
|
2011-01-17 08:06:54 -06:00
|
|
|
sal_Bool IsCalcError() const { return 0 != eError; }
|
2000-09-18 11:15:01 -05:00
|
|
|
|
2010-10-07 05:37:07 -05:00
|
|
|
static bool Str2Double( const String& rStr, xub_StrLen& rPos,
|
2001-02-13 13:32:47 -06:00
|
|
|
double& rVal,
|
2010-10-07 05:37:07 -05:00
|
|
|
LocaleDataWrapper const*const pData = 0 );
|
|
|
|
static bool Str2Double( const String& rStr, xub_StrLen& rPos,
|
|
|
|
double& rVal, SwDoc *const pDoc );
|
2001-02-13 13:32:47 -06:00
|
|
|
|
2011-01-17 08:06:54 -06:00
|
|
|
SW_DLLPUBLIC static sal_Bool IsValidVarName( const String& rStr,
|
2001-02-13 13:32:47 -06:00
|
|
|
String* pValidName = 0 );
|
2000-09-18 11:15:01 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
2010-10-14 01:30:41 -05:00
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|