xref: /trunk/main/scaddins/source/analysis/analysis.cxx (revision 0d05bb74416d9f30cdb10ecb92851cb735650a22)
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