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