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