1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #include "analysis.hxx" 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir #include <cppuhelper/factory.hxx> 31*cdf0e10cSrcweir #include <osl/diagnose.h> 32*cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 33*cdf0e10cSrcweir #include <rtl/math.hxx> 34*cdf0e10cSrcweir #include <string.h> 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include <tools/resmgr.hxx> 37*cdf0e10cSrcweir #include <tools/rcid.h> 38*cdf0e10cSrcweir #include "analysis.hrc" 39*cdf0e10cSrcweir #include "bessel.hxx" 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #define ADDIN_SERVICE "com.sun.star.sheet.AddIn" 42*cdf0e10cSrcweir #define MY_SERVICE "com.sun.star.sheet.addin.Analysis" 43*cdf0e10cSrcweir #define MY_IMPLNAME "com.sun.star.sheet.addin.AnalysisImpl" 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir using namespace ::rtl; 46*cdf0e10cSrcweir using namespace ::com::sun::star; 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir //------------------------------------------------------------------ 49*cdf0e10cSrcweir // 50*cdf0e10cSrcweir // entry points for service registration / instantiation 51*cdf0e10cSrcweir // 52*cdf0e10cSrcweir //------------------------------------------------------------------ 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir extern "C" { 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir void SAL_CALL component_getImplementationEnvironment( const sal_Char** ppEnvTypeName, uno_Environment** /*ppEnv*/ ) 58*cdf0e10cSrcweir { 59*cdf0e10cSrcweir *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; 60*cdf0e10cSrcweir } 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir void* SAL_CALL component_getFactory( const sal_Char* pImplName, void* pServiceManager, void* /*pRegistryKey*/ ) 63*cdf0e10cSrcweir { 64*cdf0e10cSrcweir void* pRet = 0; 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir if( pServiceManager && STRING::createFromAscii( pImplName ) == AnalysisAddIn::getImplementationName_Static() ) 67*cdf0e10cSrcweir { 68*cdf0e10cSrcweir REF( lang::XSingleServiceFactory ) xFactory( cppu::createOneInstanceFactory( 69*cdf0e10cSrcweir reinterpret_cast< lang::XMultiServiceFactory* >( pServiceManager ), 70*cdf0e10cSrcweir AnalysisAddIn::getImplementationName_Static(), 71*cdf0e10cSrcweir AnalysisAddIn_CreateInstance, 72*cdf0e10cSrcweir AnalysisAddIn::getSupportedServiceNames_Static() ) ); 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir if( xFactory.is() ) 75*cdf0e10cSrcweir { 76*cdf0e10cSrcweir xFactory->acquire(); 77*cdf0e10cSrcweir pRet = xFactory.get(); 78*cdf0e10cSrcweir } 79*cdf0e10cSrcweir } 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir return pRet; 82*cdf0e10cSrcweir } 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir } // extern C 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir //------------------------------------------------------------------------ 91*cdf0e10cSrcweir // 92*cdf0e10cSrcweir // "normal" service implementation 93*cdf0e10cSrcweir // 94*cdf0e10cSrcweir //------------------------------------------------------------------------ 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir ResMgr& AnalysisAddIn::GetResMgr( void ) THROWDEF_RTE 98*cdf0e10cSrcweir { 99*cdf0e10cSrcweir if( !pResMgr ) 100*cdf0e10cSrcweir { 101*cdf0e10cSrcweir InitData(); // try to get resource manager 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir if( !pResMgr ) 104*cdf0e10cSrcweir THROW_RTE; 105*cdf0e10cSrcweir } 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir return *pResMgr; 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir STRING AnalysisAddIn::GetDisplFuncStr( sal_uInt16 nFuncNum ) THROWDEF_RTE 112*cdf0e10cSrcweir { 113*cdf0e10cSrcweir return String( AnalysisRscStrLoader( RID_ANALYSIS_FUNCTION_NAMES, nFuncNum, GetResMgr() ).GetString() ); 114*cdf0e10cSrcweir } 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir class AnalysisResourcePublisher : public Resource 118*cdf0e10cSrcweir { 119*cdf0e10cSrcweir public: 120*cdf0e10cSrcweir AnalysisResourcePublisher( const AnalysisResId& rId ) : Resource( rId ) {} 121*cdf0e10cSrcweir sal_Bool IsAvailableRes( const ResId& rId ) const { return Resource::IsAvailableRes( rId ); } 122*cdf0e10cSrcweir void FreeResource() { Resource::FreeResource(); } 123*cdf0e10cSrcweir }; 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir class AnalysisFuncRes : public Resource 127*cdf0e10cSrcweir { 128*cdf0e10cSrcweir public: 129*cdf0e10cSrcweir AnalysisFuncRes( ResId& rRes, ResMgr& rResMgr, sal_uInt16 nInd, STRING& rRet ); 130*cdf0e10cSrcweir }; 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir AnalysisFuncRes::AnalysisFuncRes( ResId& rRes, ResMgr& rResMgr, sal_uInt16 nInd, STRING& rRet ) : Resource( rRes ) 134*cdf0e10cSrcweir { 135*cdf0e10cSrcweir rRet = String( AnalysisResId( nInd, rResMgr ) ); 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir FreeResource(); 138*cdf0e10cSrcweir } 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir 141*cdf0e10cSrcweir STRING AnalysisAddIn::GetFuncDescrStr( sal_uInt16 nResId, sal_uInt16 nStrIndex ) THROWDEF_RTE 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir STRING aRet; 144*cdf0e10cSrcweir AnalysisResourcePublisher aResPubl( AnalysisResId( RID_ANALYSIS_FUNCTION_DESCRIPTIONS, GetResMgr() ) ); 145*cdf0e10cSrcweir AnalysisResId aRes( nResId, GetResMgr() ); 146*cdf0e10cSrcweir aRes.SetRT( RSC_RESOURCE ); 147*cdf0e10cSrcweir if( aResPubl.IsAvailableRes( aRes ) ) 148*cdf0e10cSrcweir { 149*cdf0e10cSrcweir AnalysisFuncRes aSubRes( aRes, GetResMgr(), nStrIndex, aRet ); 150*cdf0e10cSrcweir } 151*cdf0e10cSrcweir 152*cdf0e10cSrcweir aResPubl.FreeResource(); 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir return aRet; 155*cdf0e10cSrcweir } 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir 158*cdf0e10cSrcweir void AnalysisAddIn::InitData( void ) 159*cdf0e10cSrcweir { 160*cdf0e10cSrcweir if( pResMgr ) 161*cdf0e10cSrcweir delete pResMgr; 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir OString aModName( "analysis" ); 164*cdf0e10cSrcweir pResMgr = ResMgr::CreateResMgr( ( const sal_Char* ) aModName, 165*cdf0e10cSrcweir aFuncLoc ); 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir if( pFD ) 168*cdf0e10cSrcweir delete pFD; 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir if( pResMgr ) 171*cdf0e10cSrcweir pFD = new FuncDataList( *pResMgr ); 172*cdf0e10cSrcweir else 173*cdf0e10cSrcweir pFD = NULL; 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir if( pDefLocales ) 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir delete pDefLocales; 178*cdf0e10cSrcweir pDefLocales = NULL; 179*cdf0e10cSrcweir } 180*cdf0e10cSrcweir } 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir AnalysisAddIn::AnalysisAddIn( const uno::Reference< lang::XMultiServiceFactory >& xServiceFact ) : 184*cdf0e10cSrcweir pDefLocales( NULL ), 185*cdf0e10cSrcweir pFD( NULL ), 186*cdf0e10cSrcweir pFactDoubles( NULL ), 187*cdf0e10cSrcweir pCDL( NULL ), 188*cdf0e10cSrcweir pResMgr( NULL ), 189*cdf0e10cSrcweir aAnyConv( xServiceFact ) 190*cdf0e10cSrcweir { 191*cdf0e10cSrcweir } 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir AnalysisAddIn::~AnalysisAddIn() 195*cdf0e10cSrcweir { 196*cdf0e10cSrcweir if( pFD ) 197*cdf0e10cSrcweir delete pFD; 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir if( pFactDoubles ) 200*cdf0e10cSrcweir delete[] pFactDoubles; 201*cdf0e10cSrcweir 202*cdf0e10cSrcweir if( pCDL ) 203*cdf0e10cSrcweir delete pCDL; 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir // if( pResMgr ) no delete, because _all_ resource managers are deleted _before_ this dtor is called 206*cdf0e10cSrcweir // delete pResMgr; 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir if( pDefLocales ) 209*cdf0e10cSrcweir delete[] pDefLocales; 210*cdf0e10cSrcweir } 211*cdf0e10cSrcweir 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir sal_Int32 AnalysisAddIn::getDateMode( 214*cdf0e10cSrcweir const uno::Reference< beans::XPropertySet >& xPropSet, 215*cdf0e10cSrcweir const uno::Any& rAny ) throw( uno::RuntimeException, lang::IllegalArgumentException ) 216*cdf0e10cSrcweir { 217*cdf0e10cSrcweir sal_Int32 nMode = aAnyConv.getInt32( xPropSet, rAny, 0 ); 218*cdf0e10cSrcweir if( (nMode < 0) || (nMode > 4) ) 219*cdf0e10cSrcweir throw lang::IllegalArgumentException(); 220*cdf0e10cSrcweir return nMode; 221*cdf0e10cSrcweir } 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir 224*cdf0e10cSrcweir 225*cdf0e10cSrcweir //----------------------------------------------------------------------------- 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir #define MAXFACTDOUBLE 300 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir double AnalysisAddIn::FactDouble( sal_Int32 nNum ) THROWDEF_RTE_IAE 231*cdf0e10cSrcweir { 232*cdf0e10cSrcweir if( nNum < 0 || nNum > MAXFACTDOUBLE ) 233*cdf0e10cSrcweir THROW_IAE; 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir if( !pFactDoubles ) 236*cdf0e10cSrcweir { 237*cdf0e10cSrcweir pFactDoubles = new double[ MAXFACTDOUBLE + 1 ]; 238*cdf0e10cSrcweir 239*cdf0e10cSrcweir pFactDoubles[ 0 ] = 1.0; // by default 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir double fOdd = 1.0; 242*cdf0e10cSrcweir double fEven = 2.0; 243*cdf0e10cSrcweir 244*cdf0e10cSrcweir pFactDoubles[ 1 ] = fOdd; 245*cdf0e10cSrcweir pFactDoubles[ 2 ] = fEven; 246*cdf0e10cSrcweir 247*cdf0e10cSrcweir sal_Bool bOdd = sal_True; 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir for( sal_uInt16 nCnt = 3 ; nCnt <= MAXFACTDOUBLE ; nCnt++ ) 250*cdf0e10cSrcweir { 251*cdf0e10cSrcweir if( bOdd ) 252*cdf0e10cSrcweir { 253*cdf0e10cSrcweir fOdd *= nCnt; 254*cdf0e10cSrcweir pFactDoubles[ nCnt ] = fOdd; 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir else 257*cdf0e10cSrcweir { 258*cdf0e10cSrcweir fEven *= nCnt; 259*cdf0e10cSrcweir pFactDoubles[ nCnt ] = fEven; 260*cdf0e10cSrcweir } 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir bOdd = !bOdd; 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir } 265*cdf0e10cSrcweir } 266*cdf0e10cSrcweir 267*cdf0e10cSrcweir return pFactDoubles[ nNum ]; 268*cdf0e10cSrcweir } 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir 271*cdf0e10cSrcweir STRING AnalysisAddIn::getImplementationName_Static() 272*cdf0e10cSrcweir { 273*cdf0e10cSrcweir return STRFROMASCII( MY_IMPLNAME ); 274*cdf0e10cSrcweir } 275*cdf0e10cSrcweir 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir SEQ( STRING ) AnalysisAddIn::getSupportedServiceNames_Static() 278*cdf0e10cSrcweir { 279*cdf0e10cSrcweir SEQ( STRING ) aRet(2); 280*cdf0e10cSrcweir STRING* pArray = aRet.getArray(); 281*cdf0e10cSrcweir pArray[0] = STRFROMASCII( ADDIN_SERVICE ); 282*cdf0e10cSrcweir pArray[1] = STRFROMASCII( MY_SERVICE ); 283*cdf0e10cSrcweir return aRet; 284*cdf0e10cSrcweir } 285*cdf0e10cSrcweir 286*cdf0e10cSrcweir 287*cdf0e10cSrcweir REF( uno::XInterface ) SAL_CALL AnalysisAddIn_CreateInstance( 288*cdf0e10cSrcweir const uno::Reference< lang::XMultiServiceFactory >& xServiceFact ) 289*cdf0e10cSrcweir { 290*cdf0e10cSrcweir static uno::Reference< uno::XInterface > xInst = (cppu::OWeakObject*) new AnalysisAddIn( xServiceFact ); 291*cdf0e10cSrcweir return xInst; 292*cdf0e10cSrcweir } 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir 295*cdf0e10cSrcweir // XServiceName 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getServiceName() THROWDEF_RTE 298*cdf0e10cSrcweir { 299*cdf0e10cSrcweir // name of specific AddIn service 300*cdf0e10cSrcweir return STRFROMASCII( MY_SERVICE ); 301*cdf0e10cSrcweir } 302*cdf0e10cSrcweir 303*cdf0e10cSrcweir 304*cdf0e10cSrcweir // XServiceInfo 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImplementationName() THROWDEF_RTE 307*cdf0e10cSrcweir { 308*cdf0e10cSrcweir return getImplementationName_Static(); 309*cdf0e10cSrcweir } 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir 312*cdf0e10cSrcweir sal_Bool SAL_CALL AnalysisAddIn::supportsService( const STRING& aName ) THROWDEF_RTE 313*cdf0e10cSrcweir { 314*cdf0e10cSrcweir return aName.compareToAscii( ADDIN_SERVICE ) == 0 || aName.compareToAscii( MY_SERVICE ) == 0; 315*cdf0e10cSrcweir } 316*cdf0e10cSrcweir 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir SEQ( STRING ) SAL_CALL AnalysisAddIn::getSupportedServiceNames() THROWDEF_RTE 319*cdf0e10cSrcweir { 320*cdf0e10cSrcweir return getSupportedServiceNames_Static(); 321*cdf0e10cSrcweir } 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir // XLocalizable 325*cdf0e10cSrcweir 326*cdf0e10cSrcweir void SAL_CALL AnalysisAddIn::setLocale( const lang::Locale& eLocale ) THROWDEF_RTE 327*cdf0e10cSrcweir { 328*cdf0e10cSrcweir aFuncLoc = eLocale; 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir InitData(); // change of locale invalidates resources! 331*cdf0e10cSrcweir } 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir lang::Locale SAL_CALL AnalysisAddIn::getLocale() THROWDEF_RTE 334*cdf0e10cSrcweir { 335*cdf0e10cSrcweir return aFuncLoc; 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir // XAddIn 340*cdf0e10cSrcweir 341*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getProgrammaticFuntionName( const STRING& ) THROWDEF_RTE 342*cdf0e10cSrcweir { 343*cdf0e10cSrcweir // not used by calc 344*cdf0e10cSrcweir // (but should be implemented for other uses of the AddIn service) 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir return STRING(); 347*cdf0e10cSrcweir } 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getDisplayFunctionName( const STRING& aProgrammaticName ) THROWDEF_RTE 351*cdf0e10cSrcweir { 352*cdf0e10cSrcweir STRING aRet; 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir const FuncData* p = pFD->Get( aProgrammaticName ); 355*cdf0e10cSrcweir if( p ) 356*cdf0e10cSrcweir { 357*cdf0e10cSrcweir aRet = GetDisplFuncStr( p->GetUINameID() ); 358*cdf0e10cSrcweir if( p->IsDouble() ) 359*cdf0e10cSrcweir aRet += STRFROMANSI( "_ADD" ); 360*cdf0e10cSrcweir } 361*cdf0e10cSrcweir else 362*cdf0e10cSrcweir { 363*cdf0e10cSrcweir aRet = STRFROMANSI( "UNKNOWNFUNC_" ); 364*cdf0e10cSrcweir aRet += aProgrammaticName; 365*cdf0e10cSrcweir } 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir return aRet; 368*cdf0e10cSrcweir } 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir 371*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getFunctionDescription( const STRING& aProgrammaticName ) THROWDEF_RTE 372*cdf0e10cSrcweir { 373*cdf0e10cSrcweir STRING aRet; 374*cdf0e10cSrcweir 375*cdf0e10cSrcweir const FuncData* p = pFD->Get( aProgrammaticName ); 376*cdf0e10cSrcweir if( p ) 377*cdf0e10cSrcweir aRet = GetFuncDescrStr( p->GetDescrID(), 1 ); 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir return aRet; 380*cdf0e10cSrcweir } 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir 383*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getDisplayArgumentName( const STRING& aName, sal_Int32 nArg ) THROWDEF_RTE 384*cdf0e10cSrcweir { 385*cdf0e10cSrcweir STRING aRet; 386*cdf0e10cSrcweir 387*cdf0e10cSrcweir const FuncData* p = pFD->Get( aName ); 388*cdf0e10cSrcweir if( p && nArg <= 0xFFFF ) 389*cdf0e10cSrcweir { 390*cdf0e10cSrcweir sal_uInt16 nStr = p->GetStrIndex( sal_uInt16( nArg ) ); 391*cdf0e10cSrcweir if( nStr /*&& nStr < 4*/ ) 392*cdf0e10cSrcweir aRet = GetFuncDescrStr( p->GetDescrID(), nStr ); 393*cdf0e10cSrcweir else 394*cdf0e10cSrcweir aRet = STRFROMANSI( "internal" ); 395*cdf0e10cSrcweir } 396*cdf0e10cSrcweir 397*cdf0e10cSrcweir return aRet; 398*cdf0e10cSrcweir } 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getArgumentDescription( const STRING& aName, sal_Int32 nArg ) THROWDEF_RTE 402*cdf0e10cSrcweir { 403*cdf0e10cSrcweir STRING aRet; 404*cdf0e10cSrcweir 405*cdf0e10cSrcweir const FuncData* p = pFD->Get( aName ); 406*cdf0e10cSrcweir if( p && nArg <= 0xFFFF ) 407*cdf0e10cSrcweir { 408*cdf0e10cSrcweir sal_uInt16 nStr = p->GetStrIndex( sal_uInt16( nArg ) ); 409*cdf0e10cSrcweir if( nStr /*&& nStr < 4*/ ) 410*cdf0e10cSrcweir aRet = GetFuncDescrStr( p->GetDescrID(), nStr + 1 ); 411*cdf0e10cSrcweir else 412*cdf0e10cSrcweir aRet = STRFROMANSI( "for internal use only" ); 413*cdf0e10cSrcweir } 414*cdf0e10cSrcweir 415*cdf0e10cSrcweir return aRet; 416*cdf0e10cSrcweir } 417*cdf0e10cSrcweir 418*cdf0e10cSrcweir 419*cdf0e10cSrcweir static const char* pDefCatName = "Add-In"; 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir 422*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getProgrammaticCategoryName( const STRING& aName ) THROWDEF_RTE 423*cdf0e10cSrcweir { 424*cdf0e10cSrcweir // return non-translated strings 425*cdf0e10cSrcweir // return STRFROMASCII( "Add-In" ); 426*cdf0e10cSrcweir const FuncData* p = pFD->Get( aName ); 427*cdf0e10cSrcweir STRING aRet; 428*cdf0e10cSrcweir if( p ) 429*cdf0e10cSrcweir { 430*cdf0e10cSrcweir const sal_Char* pStr; 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir switch( p->GetCategory() ) 433*cdf0e10cSrcweir { 434*cdf0e10cSrcweir case FDCat_DateTime: pStr = "Date&Time"; break; 435*cdf0e10cSrcweir case FDCat_Finance: pStr = "Financial"; break; 436*cdf0e10cSrcweir case FDCat_Inf: pStr = "Information"; break; 437*cdf0e10cSrcweir case FDCat_Math: pStr = "Mathematical"; break; 438*cdf0e10cSrcweir case FDCat_Tech: pStr = "Technical"; break; 439*cdf0e10cSrcweir default: 440*cdf0e10cSrcweir pStr = pDefCatName; break; 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir 443*cdf0e10cSrcweir aRet = STRFROMASCII( pStr ); 444*cdf0e10cSrcweir } 445*cdf0e10cSrcweir else 446*cdf0e10cSrcweir aRet = STRFROMASCII( pDefCatName ); 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir return aRet; 449*cdf0e10cSrcweir } 450*cdf0e10cSrcweir 451*cdf0e10cSrcweir 452*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getDisplayCategoryName( const STRING& aProgrammaticFunctionName ) THROWDEF_RTE 453*cdf0e10cSrcweir { 454*cdf0e10cSrcweir // return translated strings, not used for predefined categories 455*cdf0e10cSrcweir // return STRFROMASCII( "Add-In" ); 456*cdf0e10cSrcweir const FuncData* p = pFD->Get( aProgrammaticFunctionName ); 457*cdf0e10cSrcweir STRING aRet; 458*cdf0e10cSrcweir if( p ) 459*cdf0e10cSrcweir { 460*cdf0e10cSrcweir const sal_Char* pStr; 461*cdf0e10cSrcweir 462*cdf0e10cSrcweir switch( p->GetCategory() ) 463*cdf0e10cSrcweir { 464*cdf0e10cSrcweir case FDCat_DateTime: pStr = "Date&Time"; break; 465*cdf0e10cSrcweir case FDCat_Finance: pStr = "Financial"; break; 466*cdf0e10cSrcweir case FDCat_Inf: pStr = "Information"; break; 467*cdf0e10cSrcweir case FDCat_Math: pStr = "Mathematical"; break; 468*cdf0e10cSrcweir case FDCat_Tech: pStr = "Technical"; break; 469*cdf0e10cSrcweir default: 470*cdf0e10cSrcweir pStr = pDefCatName; break; 471*cdf0e10cSrcweir } 472*cdf0e10cSrcweir 473*cdf0e10cSrcweir aRet = STRFROMASCII( pStr ); 474*cdf0e10cSrcweir } 475*cdf0e10cSrcweir else 476*cdf0e10cSrcweir aRet = STRFROMASCII( pDefCatName ); 477*cdf0e10cSrcweir 478*cdf0e10cSrcweir return aRet; 479*cdf0e10cSrcweir } 480*cdf0e10cSrcweir 481*cdf0e10cSrcweir 482*cdf0e10cSrcweir static const sal_Char* pLang[] = { "de", "en" }; 483*cdf0e10cSrcweir static const sal_Char* pCoun[] = { "DE", "US" }; 484*cdf0e10cSrcweir static const sal_uInt32 nNumOfLoc = sizeof( pLang ) / sizeof( sal_Char* ); 485*cdf0e10cSrcweir 486*cdf0e10cSrcweir 487*cdf0e10cSrcweir void AnalysisAddIn::InitDefLocales( void ) 488*cdf0e10cSrcweir { 489*cdf0e10cSrcweir pDefLocales = new CSS::lang::Locale[ nNumOfLoc ]; 490*cdf0e10cSrcweir 491*cdf0e10cSrcweir for( sal_uInt32 n = 0 ; n < nNumOfLoc ; n++ ) 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir pDefLocales[ n ].Language = STRING::createFromAscii( pLang[ n ] ); 494*cdf0e10cSrcweir pDefLocales[ n ].Country = STRING::createFromAscii( pCoun[ n ] ); 495*cdf0e10cSrcweir } 496*cdf0e10cSrcweir } 497*cdf0e10cSrcweir 498*cdf0e10cSrcweir 499*cdf0e10cSrcweir inline const CSS::lang::Locale& AnalysisAddIn::GetLocale( sal_uInt32 nInd ) 500*cdf0e10cSrcweir { 501*cdf0e10cSrcweir if( !pDefLocales ) 502*cdf0e10cSrcweir InitDefLocales(); 503*cdf0e10cSrcweir 504*cdf0e10cSrcweir if( nInd < sizeof( pLang ) ) 505*cdf0e10cSrcweir return pDefLocales[ nInd ]; 506*cdf0e10cSrcweir else 507*cdf0e10cSrcweir return aFuncLoc; 508*cdf0e10cSrcweir } 509*cdf0e10cSrcweir 510*cdf0e10cSrcweir 511*cdf0e10cSrcweir SEQofLocName SAL_CALL AnalysisAddIn::getCompatibilityNames( const STRING& aProgrammaticName ) THROWDEF_RTE 512*cdf0e10cSrcweir { 513*cdf0e10cSrcweir const FuncData* p = pFD->Get( aProgrammaticName ); 514*cdf0e10cSrcweir 515*cdf0e10cSrcweir if( !p ) 516*cdf0e10cSrcweir return SEQofLocName( 0 ); 517*cdf0e10cSrcweir 518*cdf0e10cSrcweir const StringList& r = p->GetCompNameList(); 519*cdf0e10cSrcweir sal_uInt32 nCount = r.Count(); 520*cdf0e10cSrcweir 521*cdf0e10cSrcweir SEQofLocName aRet( nCount ); 522*cdf0e10cSrcweir 523*cdf0e10cSrcweir CSS::sheet::LocalizedName* pArray = aRet.getArray(); 524*cdf0e10cSrcweir 525*cdf0e10cSrcweir for( sal_uInt32 n = 0 ; n < nCount ; n++ ) 526*cdf0e10cSrcweir { 527*cdf0e10cSrcweir pArray[ n ] = CSS::sheet::LocalizedName( GetLocale( n ), *r.Get( n ) ); 528*cdf0e10cSrcweir } 529*cdf0e10cSrcweir 530*cdf0e10cSrcweir return aRet; 531*cdf0e10cSrcweir } 532*cdf0e10cSrcweir 533*cdf0e10cSrcweir 534*cdf0e10cSrcweir // XAnalysis 535*cdf0e10cSrcweir 536*cdf0e10cSrcweir /*double SAL_CALL AnalysisAddIn::get_Test( constREFXPS&, 537*cdf0e10cSrcweir sal_Int32 nMode, double f1, double f2, double f3 ) THROWDEF_RTE 538*cdf0e10cSrcweir { 539*cdf0e10cSrcweir return _Test( nMode, f1, f2, f3 ); 540*cdf0e10cSrcweir }*/ 541*cdf0e10cSrcweir 542*cdf0e10cSrcweir 543*cdf0e10cSrcweir /** 544*cdf0e10cSrcweir * Workday 545*cdf0e10cSrcweir */ 546*cdf0e10cSrcweir 547*cdf0e10cSrcweir sal_Int32 SAL_CALL AnalysisAddIn::getWorkday( constREFXPS& xOptions, 548*cdf0e10cSrcweir sal_Int32 nDate, sal_Int32 nDays, const ANY& aHDay ) THROWDEF_RTE_IAE 549*cdf0e10cSrcweir { 550*cdf0e10cSrcweir if( !nDays ) 551*cdf0e10cSrcweir return nDate; 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir sal_Int32 nNullDate = GetNullDate( xOptions ); 554*cdf0e10cSrcweir 555*cdf0e10cSrcweir SortedIndividualInt32List aSrtLst; 556*cdf0e10cSrcweir 557*cdf0e10cSrcweir aSrtLst.InsertHolidayList( aAnyConv, xOptions, aHDay, nNullDate, sal_False ); 558*cdf0e10cSrcweir 559*cdf0e10cSrcweir sal_Int32 nActDate = nDate + nNullDate; 560*cdf0e10cSrcweir 561*cdf0e10cSrcweir if( nDays > 0 ) 562*cdf0e10cSrcweir { 563*cdf0e10cSrcweir if( GetDayOfWeek( nActDate ) == 5 ) 564*cdf0e10cSrcweir // when starting on Saturday, assuming we're starting on Sunday to get the jump over the weekend 565*cdf0e10cSrcweir nActDate++; 566*cdf0e10cSrcweir 567*cdf0e10cSrcweir while( nDays ) 568*cdf0e10cSrcweir { 569*cdf0e10cSrcweir nActDate++; 570*cdf0e10cSrcweir 571*cdf0e10cSrcweir if( GetDayOfWeek( nActDate ) < 5 ) 572*cdf0e10cSrcweir { 573*cdf0e10cSrcweir if( !aSrtLst.Find( nActDate ) ) 574*cdf0e10cSrcweir nDays--; 575*cdf0e10cSrcweir } 576*cdf0e10cSrcweir else 577*cdf0e10cSrcweir nActDate++; // jump over weekend 578*cdf0e10cSrcweir } 579*cdf0e10cSrcweir } 580*cdf0e10cSrcweir else 581*cdf0e10cSrcweir { 582*cdf0e10cSrcweir if( GetDayOfWeek( nActDate ) == 6 ) 583*cdf0e10cSrcweir // when starting on Sunday, assuming we're starting on Saturday to get the jump over the weekend 584*cdf0e10cSrcweir nActDate--; 585*cdf0e10cSrcweir 586*cdf0e10cSrcweir while( nDays ) 587*cdf0e10cSrcweir { 588*cdf0e10cSrcweir nActDate--; 589*cdf0e10cSrcweir 590*cdf0e10cSrcweir if( GetDayOfWeek( nActDate ) < 5 ) 591*cdf0e10cSrcweir { 592*cdf0e10cSrcweir if( !aSrtLst.Find( nActDate ) ) 593*cdf0e10cSrcweir nDays++; 594*cdf0e10cSrcweir } 595*cdf0e10cSrcweir else 596*cdf0e10cSrcweir nActDate--; // jump over weekend 597*cdf0e10cSrcweir } 598*cdf0e10cSrcweir } 599*cdf0e10cSrcweir 600*cdf0e10cSrcweir return nActDate - nNullDate; 601*cdf0e10cSrcweir } 602*cdf0e10cSrcweir 603*cdf0e10cSrcweir 604*cdf0e10cSrcweir /** 605*cdf0e10cSrcweir * Yearfrac 606*cdf0e10cSrcweir */ 607*cdf0e10cSrcweir 608*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getYearfrac( constREFXPS& xOpt, 609*cdf0e10cSrcweir sal_Int32 nStartDate, sal_Int32 nEndDate, const ANY& rMode ) THROWDEF_RTE_IAE 610*cdf0e10cSrcweir { 611*cdf0e10cSrcweir double fRet = GetYearFrac( xOpt, nStartDate, nEndDate, getDateMode( xOpt, rMode ) ); 612*cdf0e10cSrcweir RETURN_FINITE( fRet ); 613*cdf0e10cSrcweir } 614*cdf0e10cSrcweir 615*cdf0e10cSrcweir 616*cdf0e10cSrcweir sal_Int32 SAL_CALL AnalysisAddIn::getEdate( constREFXPS& xOpt, sal_Int32 nStartDate, sal_Int32 nMonths ) THROWDEF_RTE_IAE 617*cdf0e10cSrcweir { 618*cdf0e10cSrcweir sal_Int32 nNullDate = GetNullDate( xOpt ); 619*cdf0e10cSrcweir ScaDate aDate( nNullDate, nStartDate, 5 ); 620*cdf0e10cSrcweir aDate.addMonths( nMonths ); 621*cdf0e10cSrcweir return aDate.getDate( nNullDate ); 622*cdf0e10cSrcweir } 623*cdf0e10cSrcweir 624*cdf0e10cSrcweir 625*cdf0e10cSrcweir sal_Int32 SAL_CALL AnalysisAddIn::getWeeknum( constREFXPS& xOpt, sal_Int32 nDate, sal_Int32 nMode ) THROWDEF_RTE_IAE 626*cdf0e10cSrcweir { 627*cdf0e10cSrcweir nDate += GetNullDate( xOpt ); 628*cdf0e10cSrcweir 629*cdf0e10cSrcweir sal_uInt16 nDay, nMonth, nYear; 630*cdf0e10cSrcweir DaysToDate( nDate, nDay, nMonth, nYear ); 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir sal_Int32 nFirstInYear = DateToDays( 1, 1, nYear ); 633*cdf0e10cSrcweir sal_uInt16 nFirstDayInYear = GetDayOfWeek( nFirstInYear ); 634*cdf0e10cSrcweir 635*cdf0e10cSrcweir return ( nDate - nFirstInYear + ( ( nMode == 1 )? ( nFirstDayInYear + 1 ) % 7 : nFirstDayInYear ) ) / 7 + 1; 636*cdf0e10cSrcweir } 637*cdf0e10cSrcweir 638*cdf0e10cSrcweir 639*cdf0e10cSrcweir sal_Int32 SAL_CALL AnalysisAddIn::getEomonth( constREFXPS& xOpt, sal_Int32 nDate, sal_Int32 nMonths ) THROWDEF_RTE_IAE 640*cdf0e10cSrcweir { 641*cdf0e10cSrcweir sal_Int32 nNullDate = GetNullDate( xOpt ); 642*cdf0e10cSrcweir nDate += nNullDate; 643*cdf0e10cSrcweir sal_uInt16 nDay, nMonth, nYear; 644*cdf0e10cSrcweir DaysToDate( nDate, nDay, nMonth, nYear ); 645*cdf0e10cSrcweir 646*cdf0e10cSrcweir sal_Int32 nNewMonth = nMonth + nMonths; 647*cdf0e10cSrcweir 648*cdf0e10cSrcweir if( nNewMonth > 12 ) 649*cdf0e10cSrcweir { 650*cdf0e10cSrcweir nYear = sal::static_int_cast<sal_uInt16>( nYear + ( nNewMonth / 12 ) ); 651*cdf0e10cSrcweir nNewMonth %= 12; 652*cdf0e10cSrcweir } 653*cdf0e10cSrcweir else if( nNewMonth < 1 ) 654*cdf0e10cSrcweir { 655*cdf0e10cSrcweir nNewMonth = -nNewMonth; 656*cdf0e10cSrcweir nYear = sal::static_int_cast<sal_uInt16>( nYear - ( nNewMonth / 12 ) ); 657*cdf0e10cSrcweir nYear--; 658*cdf0e10cSrcweir nNewMonth %= 12; 659*cdf0e10cSrcweir nNewMonth = 12 - nNewMonth; 660*cdf0e10cSrcweir } 661*cdf0e10cSrcweir 662*cdf0e10cSrcweir return DateToDays( DaysInMonth( sal_uInt16( nNewMonth ), nYear ), sal_uInt16( nNewMonth ), nYear ) - nNullDate; 663*cdf0e10cSrcweir } 664*cdf0e10cSrcweir 665*cdf0e10cSrcweir 666*cdf0e10cSrcweir sal_Int32 SAL_CALL AnalysisAddIn::getNetworkdays( constREFXPS& xOpt, 667*cdf0e10cSrcweir sal_Int32 nStartDate, sal_Int32 nEndDate, const ANY& aHDay ) THROWDEF_RTE_IAE 668*cdf0e10cSrcweir { 669*cdf0e10cSrcweir sal_Int32 nNullDate = GetNullDate( xOpt ); 670*cdf0e10cSrcweir 671*cdf0e10cSrcweir SortedIndividualInt32List aSrtLst; 672*cdf0e10cSrcweir 673*cdf0e10cSrcweir aSrtLst.InsertHolidayList( aAnyConv, xOpt, aHDay, nNullDate, sal_False ); 674*cdf0e10cSrcweir 675*cdf0e10cSrcweir sal_Int32 nActDate = nStartDate + nNullDate; 676*cdf0e10cSrcweir sal_Int32 nStopDate = nEndDate + nNullDate; 677*cdf0e10cSrcweir sal_Int32 nCnt = 0; 678*cdf0e10cSrcweir 679*cdf0e10cSrcweir if( nActDate <= nStopDate ) 680*cdf0e10cSrcweir { 681*cdf0e10cSrcweir while( nActDate <= nStopDate ) 682*cdf0e10cSrcweir { 683*cdf0e10cSrcweir if( GetDayOfWeek( nActDate ) < 5 && !aSrtLst.Find( nActDate ) ) 684*cdf0e10cSrcweir nCnt++; 685*cdf0e10cSrcweir 686*cdf0e10cSrcweir nActDate++; 687*cdf0e10cSrcweir } 688*cdf0e10cSrcweir } 689*cdf0e10cSrcweir else 690*cdf0e10cSrcweir { 691*cdf0e10cSrcweir while( nActDate >= nStopDate ) 692*cdf0e10cSrcweir { 693*cdf0e10cSrcweir if( GetDayOfWeek( nActDate ) < 5 && !aSrtLst.Find( nActDate ) ) 694*cdf0e10cSrcweir nCnt--; 695*cdf0e10cSrcweir 696*cdf0e10cSrcweir nActDate--; 697*cdf0e10cSrcweir } 698*cdf0e10cSrcweir } 699*cdf0e10cSrcweir 700*cdf0e10cSrcweir return nCnt; 701*cdf0e10cSrcweir } 702*cdf0e10cSrcweir 703*cdf0e10cSrcweir 704*cdf0e10cSrcweir sal_Int32 SAL_CALL AnalysisAddIn::getIseven( sal_Int32 nVal ) THROWDEF_RTE_IAE 705*cdf0e10cSrcweir { 706*cdf0e10cSrcweir return ( nVal & 0x00000001 )? 0 : 1; 707*cdf0e10cSrcweir } 708*cdf0e10cSrcweir 709*cdf0e10cSrcweir 710*cdf0e10cSrcweir sal_Int32 SAL_CALL AnalysisAddIn::getIsodd( sal_Int32 nVal ) THROWDEF_RTE_IAE 711*cdf0e10cSrcweir { 712*cdf0e10cSrcweir return ( nVal & 0x00000001 )? 1 : 0; 713*cdf0e10cSrcweir } 714*cdf0e10cSrcweir 715*cdf0e10cSrcweir double SAL_CALL 716*cdf0e10cSrcweir AnalysisAddIn::getMultinomial( constREFXPS& xOpt, const SEQSEQ( sal_Int32 )& aVLst, 717*cdf0e10cSrcweir const SEQ( uno::Any )& aOptVLst ) THROWDEF_RTE_IAE 718*cdf0e10cSrcweir { 719*cdf0e10cSrcweir ScaDoubleListGE0 aValList; 720*cdf0e10cSrcweir 721*cdf0e10cSrcweir aValList.Append( aVLst ); 722*cdf0e10cSrcweir aValList.Append( aAnyConv, xOpt, aOptVLst ); 723*cdf0e10cSrcweir 724*cdf0e10cSrcweir if( aValList.Count() == 0 ) 725*cdf0e10cSrcweir return 0.0; 726*cdf0e10cSrcweir 727*cdf0e10cSrcweir sal_Int32 nZ = 0; 728*cdf0e10cSrcweir double fN = 1.0; 729*cdf0e10cSrcweir 730*cdf0e10cSrcweir for( const double *p = aValList.First(); p; p = aValList.Next() ) 731*cdf0e10cSrcweir { 732*cdf0e10cSrcweir double fInt = (*p >= 0.0) ? rtl::math::approxFloor( *p ) : rtl::math::approxCeil( *p ); 733*cdf0e10cSrcweir if ( fInt < 0.0 || fInt > 170.0 ) 734*cdf0e10cSrcweir THROW_IAE; 735*cdf0e10cSrcweir sal_Int32 n = static_cast< sal_Int32 >( fInt ); 736*cdf0e10cSrcweir if( n > 0 ) 737*cdf0e10cSrcweir { 738*cdf0e10cSrcweir nZ += n; 739*cdf0e10cSrcweir fN *= Fak( n ); 740*cdf0e10cSrcweir } 741*cdf0e10cSrcweir } 742*cdf0e10cSrcweir 743*cdf0e10cSrcweir if( nZ > 170 ) 744*cdf0e10cSrcweir THROW_IAE; 745*cdf0e10cSrcweir 746*cdf0e10cSrcweir double fRet = Fak( nZ ) / fN; 747*cdf0e10cSrcweir RETURN_FINITE( fRet ); 748*cdf0e10cSrcweir } 749*cdf0e10cSrcweir 750*cdf0e10cSrcweir 751*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getSeriessum( double fX, double fN, double fM, const SEQSEQ( double )& aCoeffList ) THROWDEF_RTE_IAE 752*cdf0e10cSrcweir { 753*cdf0e10cSrcweir double fRet = 0.0; 754*cdf0e10cSrcweir 755*cdf0e10cSrcweir // #i32269# 0^0 is undefined, Excel returns #NUM! error 756*cdf0e10cSrcweir if( fX == 0.0 && fN == 0 ) 757*cdf0e10cSrcweir THROW_RTE; 758*cdf0e10cSrcweir 759*cdf0e10cSrcweir if( fX != 0.0 ) 760*cdf0e10cSrcweir { 761*cdf0e10cSrcweir sal_Int32 n1, n2; 762*cdf0e10cSrcweir sal_Int32 nE1 = aCoeffList.getLength(); 763*cdf0e10cSrcweir sal_Int32 nE2; 764*cdf0e10cSrcweir //sal_Int32 nZ = 0; 765*cdf0e10cSrcweir 766*cdf0e10cSrcweir for( n1 = 0 ; n1 < nE1 ; n1++ ) 767*cdf0e10cSrcweir { 768*cdf0e10cSrcweir const SEQ( double )& rList = aCoeffList[ n1 ]; 769*cdf0e10cSrcweir nE2 = rList.getLength(); 770*cdf0e10cSrcweir const double* pList = rList.getConstArray(); 771*cdf0e10cSrcweir 772*cdf0e10cSrcweir for( n2 = 0 ; n2 < nE2 ; n2++ ) 773*cdf0e10cSrcweir { 774*cdf0e10cSrcweir fRet += pList[ n2 ] * pow( fX, fN ); 775*cdf0e10cSrcweir 776*cdf0e10cSrcweir fN += fM; 777*cdf0e10cSrcweir } 778*cdf0e10cSrcweir } 779*cdf0e10cSrcweir } 780*cdf0e10cSrcweir 781*cdf0e10cSrcweir RETURN_FINITE( fRet ); 782*cdf0e10cSrcweir } 783*cdf0e10cSrcweir 784*cdf0e10cSrcweir 785*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getQuotient( double fNum, double fDenom ) THROWDEF_RTE_IAE 786*cdf0e10cSrcweir { 787*cdf0e10cSrcweir double fRet; 788*cdf0e10cSrcweir if( (fNum < 0) != (fDenom < 0) ) 789*cdf0e10cSrcweir fRet = ::rtl::math::approxCeil( fNum / fDenom ); 790*cdf0e10cSrcweir else 791*cdf0e10cSrcweir fRet = ::rtl::math::approxFloor( fNum / fDenom ); 792*cdf0e10cSrcweir RETURN_FINITE( fRet ); 793*cdf0e10cSrcweir } 794*cdf0e10cSrcweir 795*cdf0e10cSrcweir 796*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getMround( double fNum, double fMult ) THROWDEF_RTE_IAE 797*cdf0e10cSrcweir { 798*cdf0e10cSrcweir if( fMult == 0.0 ) 799*cdf0e10cSrcweir return fMult; 800*cdf0e10cSrcweir 801*cdf0e10cSrcweir double fRet = fMult * ::rtl::math::round( fNum / fMult ); 802*cdf0e10cSrcweir RETURN_FINITE( fRet ); 803*cdf0e10cSrcweir } 804*cdf0e10cSrcweir 805*cdf0e10cSrcweir 806*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getSqrtpi( double fNum ) THROWDEF_RTE_IAE 807*cdf0e10cSrcweir { 808*cdf0e10cSrcweir double fRet = sqrt( fNum * PI ); 809*cdf0e10cSrcweir RETURN_FINITE( fRet ); 810*cdf0e10cSrcweir } 811*cdf0e10cSrcweir 812*cdf0e10cSrcweir 813*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getRandbetween( double fMin, double fMax ) THROWDEF_RTE_IAE 814*cdf0e10cSrcweir { 815*cdf0e10cSrcweir fMin = ::rtl::math::round( fMin, 0, rtl_math_RoundingMode_Up ); 816*cdf0e10cSrcweir fMax = ::rtl::math::round( fMax, 0, rtl_math_RoundingMode_Up ); 817*cdf0e10cSrcweir if( fMin > fMax ) 818*cdf0e10cSrcweir THROW_IAE; 819*cdf0e10cSrcweir 820*cdf0e10cSrcweir // fMax -> range 821*cdf0e10cSrcweir double fRet = fMax - fMin + 1.0; 822*cdf0e10cSrcweir fRet *= rand(); 823*cdf0e10cSrcweir fRet /= (RAND_MAX + 1.0); 824*cdf0e10cSrcweir fRet += fMin; 825*cdf0e10cSrcweir fRet = floor( fRet ); // simple floor is sufficient here 826*cdf0e10cSrcweir RETURN_FINITE( fRet ); 827*cdf0e10cSrcweir } 828*cdf0e10cSrcweir 829*cdf0e10cSrcweir 830*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getGcd( constREFXPS& xOpt, const SEQSEQ( double )& aVLst, const SEQ( uno::Any )& aOptVLst ) THROWDEF_RTE_IAE 831*cdf0e10cSrcweir { 832*cdf0e10cSrcweir ScaDoubleListGT0 aValList; 833*cdf0e10cSrcweir 834*cdf0e10cSrcweir aValList.Append( aVLst ); 835*cdf0e10cSrcweir aValList.Append( aAnyConv, xOpt, aOptVLst ); 836*cdf0e10cSrcweir 837*cdf0e10cSrcweir if( aValList.Count() == 0 ) 838*cdf0e10cSrcweir return 0.0; 839*cdf0e10cSrcweir 840*cdf0e10cSrcweir const double* p = aValList.First(); 841*cdf0e10cSrcweir double f = *p; 842*cdf0e10cSrcweir 843*cdf0e10cSrcweir p = aValList.Next(); 844*cdf0e10cSrcweir 845*cdf0e10cSrcweir while( p ) 846*cdf0e10cSrcweir { 847*cdf0e10cSrcweir f = GetGcd( *p, f ); 848*cdf0e10cSrcweir p = aValList.Next(); 849*cdf0e10cSrcweir } 850*cdf0e10cSrcweir 851*cdf0e10cSrcweir RETURN_FINITE( f ); 852*cdf0e10cSrcweir } 853*cdf0e10cSrcweir 854*cdf0e10cSrcweir 855*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getLcm( constREFXPS& xOpt, const SEQSEQ( double )& aVLst, const SEQ( uno::Any )& aOptVLst ) THROWDEF_RTE_IAE 856*cdf0e10cSrcweir { 857*cdf0e10cSrcweir ScaDoubleListGE0 aValList; 858*cdf0e10cSrcweir 859*cdf0e10cSrcweir aValList.Append( aVLst ); 860*cdf0e10cSrcweir aValList.Append( aAnyConv, xOpt, aOptVLst ); 861*cdf0e10cSrcweir 862*cdf0e10cSrcweir if( aValList.Count() == 0 ) 863*cdf0e10cSrcweir return 0.0; 864*cdf0e10cSrcweir 865*cdf0e10cSrcweir const double* p = aValList.First(); 866*cdf0e10cSrcweir double f = *p; 867*cdf0e10cSrcweir 868*cdf0e10cSrcweir if( f == 0.0 ) 869*cdf0e10cSrcweir return f; 870*cdf0e10cSrcweir 871*cdf0e10cSrcweir p = aValList.Next(); 872*cdf0e10cSrcweir 873*cdf0e10cSrcweir while( p ) 874*cdf0e10cSrcweir { 875*cdf0e10cSrcweir double fTmp = *p; 876*cdf0e10cSrcweir if( f == 0.0 ) 877*cdf0e10cSrcweir return f; 878*cdf0e10cSrcweir else 879*cdf0e10cSrcweir f = fTmp * f / GetGcd( fTmp, f ); 880*cdf0e10cSrcweir p = aValList.Next(); 881*cdf0e10cSrcweir } 882*cdf0e10cSrcweir 883*cdf0e10cSrcweir RETURN_FINITE( f ); 884*cdf0e10cSrcweir } 885*cdf0e10cSrcweir 886*cdf0e10cSrcweir 887*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getBesseli( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE 888*cdf0e10cSrcweir { 889*cdf0e10cSrcweir double fRet = sca::analysis::BesselI( fNum, nOrder ); 890*cdf0e10cSrcweir RETURN_FINITE( fRet ); 891*cdf0e10cSrcweir } 892*cdf0e10cSrcweir 893*cdf0e10cSrcweir 894*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getBesselj( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE 895*cdf0e10cSrcweir { 896*cdf0e10cSrcweir double fRet = sca::analysis::BesselJ( fNum, nOrder ); 897*cdf0e10cSrcweir RETURN_FINITE( fRet ); 898*cdf0e10cSrcweir } 899*cdf0e10cSrcweir 900*cdf0e10cSrcweir 901*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getBesselk( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE 902*cdf0e10cSrcweir { 903*cdf0e10cSrcweir if( nOrder < 0 || fNum <= 0.0 ) 904*cdf0e10cSrcweir THROW_IAE; 905*cdf0e10cSrcweir 906*cdf0e10cSrcweir double fRet = sca::analysis::BesselK( fNum, nOrder ); 907*cdf0e10cSrcweir RETURN_FINITE( fRet ); 908*cdf0e10cSrcweir } 909*cdf0e10cSrcweir 910*cdf0e10cSrcweir 911*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getBessely( double fNum, sal_Int32 nOrder ) THROWDEF_RTE_IAE_NCE 912*cdf0e10cSrcweir { 913*cdf0e10cSrcweir if( nOrder < 0 || fNum <= 0.0 ) 914*cdf0e10cSrcweir THROW_IAE; 915*cdf0e10cSrcweir 916*cdf0e10cSrcweir // return yn( nOrder, fNum ); 917*cdf0e10cSrcweir double fRet = sca::analysis::BesselY( fNum, nOrder ); 918*cdf0e10cSrcweir RETURN_FINITE( fRet ); 919*cdf0e10cSrcweir } 920*cdf0e10cSrcweir 921*cdf0e10cSrcweir 922*cdf0e10cSrcweir const double SCA_MAX2 = 511.0; // min. val for binary numbers (9 bits + sign) 923*cdf0e10cSrcweir const double SCA_MIN2 = -SCA_MAX2-1.0; // min. val for binary numbers (9 bits + sign) 924*cdf0e10cSrcweir const double SCA_MAX8 = 536870911.0; // max. val for octal numbers (29 bits + sign) 925*cdf0e10cSrcweir const double SCA_MIN8 = -SCA_MAX8-1.0; // min. val for octal numbers (29 bits + sign) 926*cdf0e10cSrcweir const double SCA_MAX16 = 549755813888.0; // max. val for hexadecimal numbers (39 bits + sign) 927*cdf0e10cSrcweir const double SCA_MIN16 = -SCA_MAX16-1.0; // min. val for hexadecimal numbers (39 bits + sign) 928*cdf0e10cSrcweir const sal_Int32 SCA_MAXPLACES = 10; // max. number of places 929*cdf0e10cSrcweir 930*cdf0e10cSrcweir 931*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getBin2Oct( constREFXPS& xOpt, const STRING& aNum, const ANY& rPlaces ) THROWDEF_RTE_IAE 932*cdf0e10cSrcweir { 933*cdf0e10cSrcweir double fVal = ConvertToDec( aNum, 2, SCA_MAXPLACES ); 934*cdf0e10cSrcweir sal_Int32 nPlaces = 0; 935*cdf0e10cSrcweir sal_Bool bUsePlaces = aAnyConv.getInt32( nPlaces, xOpt, rPlaces ); 936*cdf0e10cSrcweir return ConvertFromDec( fVal, SCA_MIN8, SCA_MAX8, 8, nPlaces, SCA_MAXPLACES, bUsePlaces ); 937*cdf0e10cSrcweir } 938*cdf0e10cSrcweir 939*cdf0e10cSrcweir 940*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getBin2Dec( const STRING& aNum ) THROWDEF_RTE_IAE 941*cdf0e10cSrcweir { 942*cdf0e10cSrcweir double fRet = ConvertToDec( aNum, 2, SCA_MAXPLACES ); 943*cdf0e10cSrcweir RETURN_FINITE( fRet ); 944*cdf0e10cSrcweir } 945*cdf0e10cSrcweir 946*cdf0e10cSrcweir 947*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getBin2Hex( constREFXPS& xOpt, const STRING& aNum, const ANY& rPlaces ) THROWDEF_RTE_IAE 948*cdf0e10cSrcweir { 949*cdf0e10cSrcweir double fVal = ConvertToDec( aNum, 2, SCA_MAXPLACES ); 950*cdf0e10cSrcweir sal_Int32 nPlaces = 0; 951*cdf0e10cSrcweir sal_Bool bUsePlaces = aAnyConv.getInt32( nPlaces, xOpt, rPlaces ); 952*cdf0e10cSrcweir return ConvertFromDec( fVal, SCA_MIN16, SCA_MAX16, 16, nPlaces, SCA_MAXPLACES, bUsePlaces ); 953*cdf0e10cSrcweir } 954*cdf0e10cSrcweir 955*cdf0e10cSrcweir 956*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getOct2Bin( constREFXPS& xOpt, const STRING& aNum, const ANY& rPlaces ) THROWDEF_RTE_IAE 957*cdf0e10cSrcweir { 958*cdf0e10cSrcweir double fVal = ConvertToDec( aNum, 8, SCA_MAXPLACES ); 959*cdf0e10cSrcweir sal_Int32 nPlaces = 0; 960*cdf0e10cSrcweir sal_Bool bUsePlaces = aAnyConv.getInt32( nPlaces, xOpt, rPlaces ); 961*cdf0e10cSrcweir return ConvertFromDec( fVal, SCA_MIN2, SCA_MAX2, 2, nPlaces, SCA_MAXPLACES, bUsePlaces ); 962*cdf0e10cSrcweir } 963*cdf0e10cSrcweir 964*cdf0e10cSrcweir 965*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getOct2Dec( const STRING& aNum ) THROWDEF_RTE_IAE 966*cdf0e10cSrcweir { 967*cdf0e10cSrcweir double fRet = ConvertToDec( aNum, 8, SCA_MAXPLACES ); 968*cdf0e10cSrcweir RETURN_FINITE( fRet ); 969*cdf0e10cSrcweir } 970*cdf0e10cSrcweir 971*cdf0e10cSrcweir 972*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getOct2Hex( constREFXPS& xOpt, const STRING& aNum, const ANY& rPlaces ) THROWDEF_RTE_IAE 973*cdf0e10cSrcweir { 974*cdf0e10cSrcweir double fVal = ConvertToDec( aNum, 8, SCA_MAXPLACES ); 975*cdf0e10cSrcweir sal_Int32 nPlaces = 0; 976*cdf0e10cSrcweir sal_Bool bUsePlaces = aAnyConv.getInt32( nPlaces, xOpt, rPlaces ); 977*cdf0e10cSrcweir return ConvertFromDec( fVal, SCA_MIN16, SCA_MAX16, 16, nPlaces, SCA_MAXPLACES, bUsePlaces ); 978*cdf0e10cSrcweir } 979*cdf0e10cSrcweir 980*cdf0e10cSrcweir 981*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getDec2Bin( constREFXPS& xOpt, sal_Int32 nNum, const ANY& rPlaces ) THROWDEF_RTE_IAE 982*cdf0e10cSrcweir { 983*cdf0e10cSrcweir sal_Int32 nPlaces = 0; 984*cdf0e10cSrcweir sal_Bool bUsePlaces = aAnyConv.getInt32( nPlaces, xOpt, rPlaces ); 985*cdf0e10cSrcweir return ConvertFromDec( nNum, SCA_MIN2, SCA_MAX2, 2, nPlaces, SCA_MAXPLACES, bUsePlaces ); 986*cdf0e10cSrcweir } 987*cdf0e10cSrcweir 988*cdf0e10cSrcweir 989*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getDec2Oct( constREFXPS& xOpt, sal_Int32 nNum, const ANY& rPlaces ) THROWDEF_RTE_IAE 990*cdf0e10cSrcweir { 991*cdf0e10cSrcweir sal_Int32 nPlaces = 0; 992*cdf0e10cSrcweir sal_Bool bUsePlaces = aAnyConv.getInt32( nPlaces, xOpt, rPlaces ); 993*cdf0e10cSrcweir return ConvertFromDec( nNum, SCA_MIN8, SCA_MAX8, 8, nPlaces, SCA_MAXPLACES, bUsePlaces ); 994*cdf0e10cSrcweir } 995*cdf0e10cSrcweir 996*cdf0e10cSrcweir 997*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getDec2Hex( constREFXPS& xOpt, double fNum, const ANY& rPlaces ) THROWDEF_RTE_IAE 998*cdf0e10cSrcweir { 999*cdf0e10cSrcweir sal_Int32 nPlaces = 0; 1000*cdf0e10cSrcweir sal_Bool bUsePlaces = aAnyConv.getInt32( nPlaces, xOpt, rPlaces ); 1001*cdf0e10cSrcweir return ConvertFromDec( fNum, SCA_MIN16, SCA_MAX16, 16, nPlaces, SCA_MAXPLACES, bUsePlaces ); 1002*cdf0e10cSrcweir } 1003*cdf0e10cSrcweir 1004*cdf0e10cSrcweir 1005*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getHex2Bin( constREFXPS& xOpt, const STRING& aNum, const ANY& rPlaces ) THROWDEF_RTE_IAE 1006*cdf0e10cSrcweir { 1007*cdf0e10cSrcweir double fVal = ConvertToDec( aNum, 16, SCA_MAXPLACES ); 1008*cdf0e10cSrcweir sal_Int32 nPlaces = 0; 1009*cdf0e10cSrcweir sal_Bool bUsePlaces = aAnyConv.getInt32( nPlaces, xOpt, rPlaces ); 1010*cdf0e10cSrcweir return ConvertFromDec( fVal, SCA_MIN2, SCA_MAX2, 2, nPlaces, SCA_MAXPLACES, bUsePlaces ); 1011*cdf0e10cSrcweir } 1012*cdf0e10cSrcweir 1013*cdf0e10cSrcweir 1014*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getHex2Dec( const STRING& aNum ) THROWDEF_RTE_IAE 1015*cdf0e10cSrcweir { 1016*cdf0e10cSrcweir double fRet = ConvertToDec( aNum, 16, SCA_MAXPLACES ); 1017*cdf0e10cSrcweir RETURN_FINITE( fRet ); 1018*cdf0e10cSrcweir } 1019*cdf0e10cSrcweir 1020*cdf0e10cSrcweir 1021*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getHex2Oct( constREFXPS& xOpt, const STRING& aNum, const ANY& rPlaces ) THROWDEF_RTE_IAE 1022*cdf0e10cSrcweir { 1023*cdf0e10cSrcweir double fVal = ConvertToDec( aNum, 16, SCA_MAXPLACES ); 1024*cdf0e10cSrcweir sal_Int32 nPlaces = 0; 1025*cdf0e10cSrcweir sal_Bool bUsePlaces = aAnyConv.getInt32( nPlaces, xOpt, rPlaces ); 1026*cdf0e10cSrcweir return ConvertFromDec( fVal, SCA_MIN8, SCA_MAX8, 8, nPlaces, SCA_MAXPLACES, bUsePlaces ); 1027*cdf0e10cSrcweir } 1028*cdf0e10cSrcweir 1029*cdf0e10cSrcweir 1030*cdf0e10cSrcweir sal_Int32 SAL_CALL AnalysisAddIn::getDelta( constREFXPS& xOpt, double fNum1, const ANY& rNum2 ) THROWDEF_RTE_IAE 1031*cdf0e10cSrcweir { 1032*cdf0e10cSrcweir return fNum1 == aAnyConv.getDouble( xOpt, rNum2, 0.0 ); 1033*cdf0e10cSrcweir } 1034*cdf0e10cSrcweir 1035*cdf0e10cSrcweir 1036*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getErf( constREFXPS& xOpt, double fLL, const ANY& rUL ) THROWDEF_RTE_IAE 1037*cdf0e10cSrcweir { 1038*cdf0e10cSrcweir double fUL, fRet; 1039*cdf0e10cSrcweir sal_Bool bContainsValue = aAnyConv.getDouble( fUL, xOpt, rUL ); 1040*cdf0e10cSrcweir 1041*cdf0e10cSrcweir fRet = bContainsValue ? (Erf( fUL ) - Erf( fLL )) : Erf( fLL ); 1042*cdf0e10cSrcweir RETURN_FINITE( fRet ); 1043*cdf0e10cSrcweir } 1044*cdf0e10cSrcweir 1045*cdf0e10cSrcweir 1046*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getErfc( double f ) THROWDEF_RTE_IAE 1047*cdf0e10cSrcweir { 1048*cdf0e10cSrcweir double fRet = Erfc( f ); 1049*cdf0e10cSrcweir RETURN_FINITE( fRet ); 1050*cdf0e10cSrcweir } 1051*cdf0e10cSrcweir 1052*cdf0e10cSrcweir 1053*cdf0e10cSrcweir sal_Int32 SAL_CALL AnalysisAddIn::getGestep( constREFXPS& xOpt, double fNum, const ANY& rStep ) THROWDEF_RTE_IAE 1054*cdf0e10cSrcweir { 1055*cdf0e10cSrcweir return fNum >= aAnyConv.getDouble( xOpt, rStep, 0.0 ); 1056*cdf0e10cSrcweir } 1057*cdf0e10cSrcweir 1058*cdf0e10cSrcweir 1059*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getFactdouble( sal_Int32 nNum ) THROWDEF_RTE_IAE 1060*cdf0e10cSrcweir { 1061*cdf0e10cSrcweir double fRet = FactDouble( nNum ); 1062*cdf0e10cSrcweir RETURN_FINITE( fRet ); 1063*cdf0e10cSrcweir } 1064*cdf0e10cSrcweir 1065*cdf0e10cSrcweir 1066*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getImabs( const STRING& aNum ) THROWDEF_RTE_IAE 1067*cdf0e10cSrcweir { 1068*cdf0e10cSrcweir double fRet = Complex( aNum ).Abs(); 1069*cdf0e10cSrcweir RETURN_FINITE( fRet ); 1070*cdf0e10cSrcweir } 1071*cdf0e10cSrcweir 1072*cdf0e10cSrcweir 1073*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getImaginary( const STRING& aNum ) THROWDEF_RTE_IAE 1074*cdf0e10cSrcweir { 1075*cdf0e10cSrcweir double fRet = Complex( aNum ).Imag(); 1076*cdf0e10cSrcweir RETURN_FINITE( fRet ); 1077*cdf0e10cSrcweir } 1078*cdf0e10cSrcweir 1079*cdf0e10cSrcweir 1080*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImpower( const STRING& aNum, double f ) THROWDEF_RTE_IAE 1081*cdf0e10cSrcweir { 1082*cdf0e10cSrcweir Complex z( aNum ); 1083*cdf0e10cSrcweir 1084*cdf0e10cSrcweir z.Power( f ); 1085*cdf0e10cSrcweir 1086*cdf0e10cSrcweir return z.GetString(); 1087*cdf0e10cSrcweir } 1088*cdf0e10cSrcweir 1089*cdf0e10cSrcweir 1090*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getImargument( const STRING& aNum ) THROWDEF_RTE_IAE 1091*cdf0e10cSrcweir { 1092*cdf0e10cSrcweir double fRet = Complex( aNum ).Arg(); 1093*cdf0e10cSrcweir RETURN_FINITE( fRet ); 1094*cdf0e10cSrcweir } 1095*cdf0e10cSrcweir 1096*cdf0e10cSrcweir 1097*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImcos( const STRING& aNum ) THROWDEF_RTE_IAE 1098*cdf0e10cSrcweir { 1099*cdf0e10cSrcweir Complex z( aNum ); 1100*cdf0e10cSrcweir 1101*cdf0e10cSrcweir z.Cos(); 1102*cdf0e10cSrcweir 1103*cdf0e10cSrcweir return z.GetString(); 1104*cdf0e10cSrcweir } 1105*cdf0e10cSrcweir 1106*cdf0e10cSrcweir 1107*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImdiv( const STRING& aDivid, const STRING& aDivis ) THROWDEF_RTE_IAE 1108*cdf0e10cSrcweir { 1109*cdf0e10cSrcweir Complex z( aDivid ); 1110*cdf0e10cSrcweir 1111*cdf0e10cSrcweir z.Div( Complex( aDivis ) ); 1112*cdf0e10cSrcweir 1113*cdf0e10cSrcweir return z.GetString(); 1114*cdf0e10cSrcweir } 1115*cdf0e10cSrcweir 1116*cdf0e10cSrcweir 1117*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImexp( const STRING& aNum ) THROWDEF_RTE_IAE 1118*cdf0e10cSrcweir { 1119*cdf0e10cSrcweir Complex z( aNum ); 1120*cdf0e10cSrcweir 1121*cdf0e10cSrcweir z.Exp(); 1122*cdf0e10cSrcweir 1123*cdf0e10cSrcweir return z.GetString(); 1124*cdf0e10cSrcweir } 1125*cdf0e10cSrcweir 1126*cdf0e10cSrcweir 1127*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImconjugate( const STRING& aNum ) THROWDEF_RTE_IAE 1128*cdf0e10cSrcweir { 1129*cdf0e10cSrcweir Complex z( aNum ); 1130*cdf0e10cSrcweir 1131*cdf0e10cSrcweir z.Conjugate(); 1132*cdf0e10cSrcweir 1133*cdf0e10cSrcweir return z.GetString(); 1134*cdf0e10cSrcweir } 1135*cdf0e10cSrcweir 1136*cdf0e10cSrcweir 1137*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImln( const STRING& aNum ) THROWDEF_RTE_IAE 1138*cdf0e10cSrcweir { 1139*cdf0e10cSrcweir Complex z( aNum ); 1140*cdf0e10cSrcweir 1141*cdf0e10cSrcweir z.Ln(); 1142*cdf0e10cSrcweir 1143*cdf0e10cSrcweir return z.GetString(); 1144*cdf0e10cSrcweir } 1145*cdf0e10cSrcweir 1146*cdf0e10cSrcweir 1147*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImlog10( const STRING& aNum ) THROWDEF_RTE_IAE 1148*cdf0e10cSrcweir { 1149*cdf0e10cSrcweir Complex z( aNum ); 1150*cdf0e10cSrcweir 1151*cdf0e10cSrcweir z.Log10(); 1152*cdf0e10cSrcweir 1153*cdf0e10cSrcweir return z.GetString(); 1154*cdf0e10cSrcweir } 1155*cdf0e10cSrcweir 1156*cdf0e10cSrcweir 1157*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImlog2( const STRING& aNum ) THROWDEF_RTE_IAE 1158*cdf0e10cSrcweir { 1159*cdf0e10cSrcweir Complex z( aNum ); 1160*cdf0e10cSrcweir 1161*cdf0e10cSrcweir z.Log2(); 1162*cdf0e10cSrcweir 1163*cdf0e10cSrcweir return z.GetString(); 1164*cdf0e10cSrcweir } 1165*cdf0e10cSrcweir 1166*cdf0e10cSrcweir 1167*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImproduct( constREFXPS&, const SEQSEQ( STRING )& aNum1, const SEQ( uno::Any )& aNL ) THROWDEF_RTE_IAE 1168*cdf0e10cSrcweir { 1169*cdf0e10cSrcweir ComplexList z_list; 1170*cdf0e10cSrcweir 1171*cdf0e10cSrcweir z_list.Append( aNum1, AH_IgnoreEmpty ); 1172*cdf0e10cSrcweir z_list.Append( aNL, AH_IgnoreEmpty ); 1173*cdf0e10cSrcweir 1174*cdf0e10cSrcweir const Complex* p = z_list.First(); 1175*cdf0e10cSrcweir 1176*cdf0e10cSrcweir if( !p ) 1177*cdf0e10cSrcweir return Complex( 0 ).GetString(); 1178*cdf0e10cSrcweir 1179*cdf0e10cSrcweir Complex z( *p ); 1180*cdf0e10cSrcweir 1181*cdf0e10cSrcweir for( p = z_list.Next() ; p ; p = z_list.Next() ) 1182*cdf0e10cSrcweir z.Mult( *p ); 1183*cdf0e10cSrcweir 1184*cdf0e10cSrcweir return z.GetString(); 1185*cdf0e10cSrcweir } 1186*cdf0e10cSrcweir 1187*cdf0e10cSrcweir 1188*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getImreal( const STRING& aNum ) THROWDEF_RTE_IAE 1189*cdf0e10cSrcweir { 1190*cdf0e10cSrcweir double fRet = Complex( aNum ).Real(); 1191*cdf0e10cSrcweir RETURN_FINITE( fRet ); 1192*cdf0e10cSrcweir } 1193*cdf0e10cSrcweir 1194*cdf0e10cSrcweir 1195*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImsin( const STRING& aNum ) THROWDEF_RTE_IAE 1196*cdf0e10cSrcweir { 1197*cdf0e10cSrcweir Complex z( aNum ); 1198*cdf0e10cSrcweir 1199*cdf0e10cSrcweir z.Sin(); 1200*cdf0e10cSrcweir 1201*cdf0e10cSrcweir return z.GetString(); 1202*cdf0e10cSrcweir } 1203*cdf0e10cSrcweir 1204*cdf0e10cSrcweir 1205*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImsub( const STRING& aNum1, const STRING& aNum2 ) THROWDEF_RTE_IAE 1206*cdf0e10cSrcweir { 1207*cdf0e10cSrcweir Complex z( aNum1 ); 1208*cdf0e10cSrcweir 1209*cdf0e10cSrcweir z.Sub( Complex( aNum2 ) ); 1210*cdf0e10cSrcweir 1211*cdf0e10cSrcweir return z.GetString(); 1212*cdf0e10cSrcweir } 1213*cdf0e10cSrcweir 1214*cdf0e10cSrcweir 1215*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImsum( constREFXPS&, const SEQSEQ( STRING )& aNum1, const SEQ( CSS::uno::Any )& aFollowingPars ) THROWDEF_RTE_IAE 1216*cdf0e10cSrcweir { 1217*cdf0e10cSrcweir ComplexList z_list; 1218*cdf0e10cSrcweir 1219*cdf0e10cSrcweir z_list.Append( aNum1, AH_IgnoreEmpty ); 1220*cdf0e10cSrcweir z_list.Append( aFollowingPars, AH_IgnoreEmpty ); 1221*cdf0e10cSrcweir 1222*cdf0e10cSrcweir const Complex* p = z_list.First(); 1223*cdf0e10cSrcweir 1224*cdf0e10cSrcweir if( !p ) 1225*cdf0e10cSrcweir return Complex( 0 ).GetString(); 1226*cdf0e10cSrcweir 1227*cdf0e10cSrcweir Complex z( *p ); 1228*cdf0e10cSrcweir 1229*cdf0e10cSrcweir for( p = z_list.Next() ; p ; p = z_list.Next() ) 1230*cdf0e10cSrcweir z.Add( *p ); 1231*cdf0e10cSrcweir 1232*cdf0e10cSrcweir return z.GetString(); 1233*cdf0e10cSrcweir } 1234*cdf0e10cSrcweir 1235*cdf0e10cSrcweir 1236*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getImsqrt( const STRING& aNum ) THROWDEF_RTE_IAE 1237*cdf0e10cSrcweir { 1238*cdf0e10cSrcweir Complex z( aNum ); 1239*cdf0e10cSrcweir 1240*cdf0e10cSrcweir // z.Power( 0.5 ); 1241*cdf0e10cSrcweir z.Sqrt(); 1242*cdf0e10cSrcweir 1243*cdf0e10cSrcweir return z.GetString(); 1244*cdf0e10cSrcweir } 1245*cdf0e10cSrcweir 1246*cdf0e10cSrcweir 1247*cdf0e10cSrcweir STRING SAL_CALL AnalysisAddIn::getComplex( double fR, double fI, const ANY& rSuff ) THROWDEF_RTE_IAE 1248*cdf0e10cSrcweir { 1249*cdf0e10cSrcweir sal_Bool bi; 1250*cdf0e10cSrcweir 1251*cdf0e10cSrcweir switch( rSuff.getValueTypeClass() ) 1252*cdf0e10cSrcweir { 1253*cdf0e10cSrcweir case uno::TypeClass_VOID: 1254*cdf0e10cSrcweir bi = sal_True; 1255*cdf0e10cSrcweir break; 1256*cdf0e10cSrcweir case uno::TypeClass_STRING: 1257*cdf0e10cSrcweir { 1258*cdf0e10cSrcweir const STRING* pSuff = ( const STRING* ) rSuff.getValue(); 1259*cdf0e10cSrcweir bi = pSuff->compareToAscii( "i" ) == 0 || pSuff->getLength() == 0; 1260*cdf0e10cSrcweir if( !bi && pSuff->compareToAscii( "j" ) != 0 ) 1261*cdf0e10cSrcweir THROW_IAE; 1262*cdf0e10cSrcweir } 1263*cdf0e10cSrcweir break; 1264*cdf0e10cSrcweir default: 1265*cdf0e10cSrcweir THROW_IAE; 1266*cdf0e10cSrcweir } 1267*cdf0e10cSrcweir 1268*cdf0e10cSrcweir return Complex( fR, fI, bi ? 'i' : 'j' ).GetString(); 1269*cdf0e10cSrcweir } 1270*cdf0e10cSrcweir 1271*cdf0e10cSrcweir 1272*cdf0e10cSrcweir double SAL_CALL AnalysisAddIn::getConvert( double f, const STRING& aFU, const STRING& aTU ) THROWDEF_RTE_IAE 1273*cdf0e10cSrcweir { 1274*cdf0e10cSrcweir if( !pCDL ) 1275*cdf0e10cSrcweir pCDL = new ConvertDataList(); 1276*cdf0e10cSrcweir 1277*cdf0e10cSrcweir double fRet = pCDL->Convert( f, aFU, aTU ); 1278*cdf0e10cSrcweir RETURN_FINITE( fRet ); 1279*cdf0e10cSrcweir } 1280*cdf0e10cSrcweir 1281*cdf0e10cSrcweir 1282