diff options
Diffstat (limited to 'scaddins/source/analysis/analysishelper.cxx')
-rw-r--r-- | scaddins/source/analysis/analysishelper.cxx | 2846 |
1 files changed, 0 insertions, 2846 deletions
diff --git a/scaddins/source/analysis/analysishelper.cxx b/scaddins/source/analysis/analysishelper.cxx deleted file mode 100644 index c37d71b56..000000000 --- a/scaddins/source/analysis/analysishelper.cxx +++ /dev/null @@ -1,2846 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include <com/sun/star/util/XNumberFormatTypes.hpp> - -#include <string.h> -#include <stdio.h> -#include <tools/resary.hxx> -#include <rtl/math.hxx> -#include <sal/macros.h> -#include "analysishelper.hxx" -#include "analysis.hrc" - -using namespace ::rtl; -using namespace ::com::sun::star; - - - -#define UNIQUE sal_False // function name does not exist in Calc -#define DOUBLE sal_True // function name exists in Calc - -#define STDPAR sal_False // all parameters are described -#define INTPAR sal_True // first parameter is internal - -#define FUNCDATA( FUNCNAME, DBL, OPT, NUMOFPAR, CAT ) \ - { "get" #FUNCNAME, ANALYSIS_FUNCNAME_##FUNCNAME, ANALYSIS_##FUNCNAME, DBL, OPT, ANALYSIS_DEFFUNCNAME_##FUNCNAME, NUMOFPAR, CAT } - -const FuncDataBase pFuncDatas[] = -{ - // UNIQUE or INTPAR or - // function name DOUBLE STDPAR # of param category - FUNCDATA( Workday, UNIQUE, INTPAR, 3, FDCat_DateTime ), - FUNCDATA( Yearfrac, UNIQUE, INTPAR, 3, FDCat_DateTime ), - FUNCDATA( Edate, UNIQUE, INTPAR, 2, FDCat_DateTime ), - FUNCDATA( Weeknum, DOUBLE, INTPAR, 2, FDCat_DateTime ), - FUNCDATA( Eomonth, UNIQUE, INTPAR, 2, FDCat_DateTime ), - FUNCDATA( Networkdays, UNIQUE, INTPAR, 3, FDCat_DateTime ), - FUNCDATA( Iseven, DOUBLE, STDPAR, 1, FDCat_Inf ), - FUNCDATA( Isodd, DOUBLE, STDPAR, 1, FDCat_Inf ), - FUNCDATA( Multinomial, UNIQUE, STDPAR, 1, FDCat_Math ), - FUNCDATA( Seriessum, UNIQUE, STDPAR, 4, FDCat_Math ), - FUNCDATA( Quotient, UNIQUE, STDPAR, 2, FDCat_Math ), - FUNCDATA( Mround, UNIQUE, STDPAR, 2, FDCat_Math ), - FUNCDATA( Sqrtpi, UNIQUE, STDPAR, 1, FDCat_Math ), - FUNCDATA( Randbetween, UNIQUE, STDPAR, 2, FDCat_Math ), - FUNCDATA( Gcd, DOUBLE, INTPAR, 1, FDCat_Math ), - FUNCDATA( Lcm, DOUBLE, INTPAR, 1, FDCat_Math ), - FUNCDATA( Besseli, UNIQUE, STDPAR, 2, FDCat_Tech ), - FUNCDATA( Besselj, UNIQUE, STDPAR, 2, FDCat_Tech ), - FUNCDATA( Besselk, UNIQUE, STDPAR, 2, FDCat_Tech ), - FUNCDATA( Bessely, UNIQUE, STDPAR, 2, FDCat_Tech ), - FUNCDATA( Bin2Oct, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Bin2Dec, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Bin2Hex, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Oct2Bin, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Oct2Dec, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Oct2Hex, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Dec2Bin, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Dec2Hex, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Dec2Oct, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Hex2Bin, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Hex2Dec, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Hex2Oct, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Delta, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Erf, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Erfc, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Gestep, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Factdouble, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Imabs, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Imaginary, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Impower, UNIQUE, STDPAR, 2, FDCat_Tech ), - FUNCDATA( Imargument, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Imcos, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Imdiv, UNIQUE, STDPAR, 2, FDCat_Tech ), - FUNCDATA( Imexp, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Imconjugate, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Imln, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Imlog10, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Imlog2, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Improduct, UNIQUE, INTPAR, 2, FDCat_Tech ), - FUNCDATA( Imreal, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Imsin, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Imsub, UNIQUE, STDPAR, 2, FDCat_Tech ), - FUNCDATA( Imsqrt, UNIQUE, STDPAR, 1, FDCat_Tech ), - FUNCDATA( Imsum, UNIQUE, INTPAR, 1, FDCat_Tech ), - FUNCDATA( Complex, UNIQUE, STDPAR, 3, FDCat_Tech ), - FUNCDATA( Convert, DOUBLE, STDPAR, 3, FDCat_Tech ), - FUNCDATA( Amordegrc, UNIQUE, INTPAR, 7, FDCat_Finance ), - FUNCDATA( Amorlinc, UNIQUE, INTPAR, 7, FDCat_Finance ), - FUNCDATA( Accrint, UNIQUE, INTPAR, 7, FDCat_Finance ), - FUNCDATA( Accrintm, UNIQUE, INTPAR, 5, FDCat_Finance ), - FUNCDATA( Received, UNIQUE, INTPAR, 5, FDCat_Finance ), - FUNCDATA( Disc, UNIQUE, INTPAR, 5, FDCat_Finance ), - FUNCDATA( Duration, DOUBLE, INTPAR, 6, FDCat_Finance ), - FUNCDATA( Effect, DOUBLE, STDPAR, 2, FDCat_Finance ), - FUNCDATA( Cumprinc, DOUBLE, STDPAR, 6, FDCat_Finance ), - FUNCDATA( Cumipmt, DOUBLE, STDPAR, 6, FDCat_Finance ), - FUNCDATA( Price, UNIQUE, INTPAR, 7, FDCat_Finance ), - FUNCDATA( Pricedisc, UNIQUE, INTPAR, 5, FDCat_Finance ), - FUNCDATA( Pricemat, UNIQUE, INTPAR, 6, FDCat_Finance ), - FUNCDATA( Mduration, UNIQUE, INTPAR, 6, FDCat_Finance ), - FUNCDATA( Nominal, DOUBLE, STDPAR, 2, FDCat_Finance ), - FUNCDATA( Dollarfr, UNIQUE, STDPAR, 2, FDCat_Finance ), - FUNCDATA( Dollarde, UNIQUE, STDPAR, 2, FDCat_Finance ), - FUNCDATA( Yield, UNIQUE, INTPAR, 7, FDCat_Finance ), - FUNCDATA( Yielddisc, UNIQUE, INTPAR, 5, FDCat_Finance ), - FUNCDATA( Yieldmat, UNIQUE, INTPAR, 6, FDCat_Finance ), - FUNCDATA( Tbilleq, UNIQUE, INTPAR, 3, FDCat_Finance ), - FUNCDATA( Tbillprice, UNIQUE, INTPAR, 3, FDCat_Finance ), - FUNCDATA( Tbillyield, UNIQUE, INTPAR, 3, FDCat_Finance ), - FUNCDATA( Oddfprice, UNIQUE, INTPAR, 9, FDCat_Finance ), - FUNCDATA( Oddfyield, UNIQUE, INTPAR, 9, FDCat_Finance ), - FUNCDATA( Oddlprice, UNIQUE, INTPAR, 8, FDCat_Finance ), - FUNCDATA( Oddlyield, UNIQUE, INTPAR, 8, FDCat_Finance ), - FUNCDATA( Xirr, UNIQUE, INTPAR, 3, FDCat_Finance ), - FUNCDATA( Xnpv, UNIQUE, STDPAR, 3, FDCat_Finance ), - FUNCDATA( Intrate, UNIQUE, INTPAR, 5, FDCat_Finance ), - FUNCDATA( Coupncd, UNIQUE, INTPAR, 4, FDCat_Finance ), - FUNCDATA( Coupdays, UNIQUE, INTPAR, 4, FDCat_Finance ), - FUNCDATA( Coupdaysnc, UNIQUE, INTPAR, 4, FDCat_Finance ), - FUNCDATA( Coupdaybs, UNIQUE, INTPAR, 4, FDCat_Finance ), - FUNCDATA( Couppcd, UNIQUE, INTPAR, 4, FDCat_Finance ), - FUNCDATA( Coupnum, UNIQUE, INTPAR, 4, FDCat_Finance ), - FUNCDATA( Fvschedule, UNIQUE, STDPAR, 2, FDCat_Finance ) -}; -#undef FUNCDATA - - -sal_uInt16 DaysInMonth( sal_uInt16 nMonth, sal_uInt16 nYear ) -{ - if( (nMonth == 2) && IsLeapYear( nYear ) ) - return 29; - static const sal_uInt16 aDaysInMonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - return aDaysInMonth[ nMonth ]; -} - - -/** - * Convert a date to a count of days starting from 01/01/0001 - * - * The internal representation of a Date used in this Addin - * is the number of days between 01/01/0001 and the date - * this function converts a Day , Month, Year representation - * to this internal Date value. - * - */ - -sal_Int32 DateToDays( sal_uInt16 nDay, sal_uInt16 nMonth, sal_uInt16 nYear ) -{ - sal_Int32 nDays = ((sal_Int32)nYear-1) * 365; - nDays += ((nYear-1) / 4) - ((nYear-1) / 100) + ((nYear-1) / 400); - - for( sal_uInt16 i = 1; i < nMonth; i++ ) - nDays += DaysInMonth(i,nYear); - nDays += nDay; - - return nDays; -} - - -/** - * Convert a count of days starting from 01/01/0001 to a date - * - * The internal representation of a Date used in this Addin - * is the number of days between 01/01/0001 and the date - * this function converts this internal Date value - * to a Day , Month, Year representation of a Date. - * - */ - -void DaysToDate( sal_Int32 nDays, sal_uInt16& rDay, sal_uInt16& rMonth, sal_uInt16& rYear ) - throw( lang::IllegalArgumentException ) -{ - if( nDays < 0 ) - throw lang::IllegalArgumentException(); - - sal_Int32 nTempDays; - sal_Int32 i = 0; - sal_Bool bCalc; - - do - { - nTempDays = nDays; - rYear = (sal_uInt16)((nTempDays / 365) - i); - nTempDays -= ((sal_Int32) rYear -1) * 365; - nTempDays -= (( rYear -1) / 4) - (( rYear -1) / 100) + ((rYear -1) / 400); - bCalc = sal_False; - if ( nTempDays < 1 ) - { - i++; - bCalc = sal_True; - } - else - { - if ( nTempDays > 365 ) - { - if ( (nTempDays != 366) || !IsLeapYear( rYear ) ) - { - i--; - bCalc = sal_True; - } - } - } - } - while ( bCalc ); - - rMonth = 1; - while ( (sal_Int32)nTempDays > DaysInMonth( rMonth, rYear ) ) - { - nTempDays -= DaysInMonth( rMonth, rYear ); - rMonth++; - } - rDay = (sal_uInt16)nTempDays; -} - - -/** - * Get the null date used by the spreadsheet document - * - * The internal representation of a Date used in this Addin - * is the number of days between 01/01/0001 and the date - * this function returns this internal Date value for the document null date - * - */ - -sal_Int32 GetNullDate( constREFXPS& xOpt ) THROWDEF_RTE -{ - if( xOpt.is() ) - { - try - { - ANY aAny = xOpt->getPropertyValue( STRFROMASCII( "NullDate" ) ); - util::Date aDate; - if( aAny >>= aDate ) - return DateToDays( aDate.Day, aDate.Month, aDate.Year ); - } - catch( uno::Exception& ) - { - } - } - - // no null date available -> no calculations possible - throw uno::RuntimeException(); -} - - -sal_Int32 GetDiffDate360( - sal_uInt16 nDay1, sal_uInt16 nMonth1, sal_uInt16 nYear1, sal_Bool bLeapYear1, - sal_uInt16 nDay2, sal_uInt16 nMonth2, sal_uInt16 nYear2, - sal_Bool bUSAMethod ) -{ - if( nDay1 == 31 ) - nDay1--; - else if( bUSAMethod && ( nMonth1 == 2 && ( nDay1 == 29 || ( nDay1 == 28 && !bLeapYear1 ) ) ) ) - nDay1 = 30; - - if( nDay2 == 31 ) - { - if( bUSAMethod && nDay1 != 30 ) - { - nDay2 = 1; - if( nMonth2 == 12 ) - { - nYear2++; - nMonth2 = 1; - } - else - nMonth2++; - } - else - nDay2 = 30; - } - - return nDay2 + nMonth2 * 30 + nYear2 * 360 - nDay1 - nMonth1 * 30 - nYear1 * 360; -} - - -sal_Int32 GetDiffDate360( sal_Int32 nNullDate, sal_Int32 nDate1, sal_Int32 nDate2, sal_Bool bUSAMethod ) -{ - nDate1 += nNullDate; - nDate2 += nNullDate; - - sal_uInt16 nDay1, nMonth1, nYear1, nDay2, nMonth2, nYear2; - - DaysToDate( nDate1, nDay1, nMonth1, nYear1 ); - DaysToDate( nDate2, nDay2, nMonth2, nYear2 ); - - return GetDiffDate360( nDay1, nMonth1, nYear1, IsLeapYear( nYear1 ), nDay2, nMonth2, nYear2, bUSAMethod ); -} - - -sal_Int32 GetDaysInYears( sal_uInt16 nYear1, sal_uInt16 nYear2 ) -{ - sal_uInt16 nLeaps = 0; - for( sal_uInt16 n = nYear1 ; n <= nYear2 ; n++ ) - { - if( IsLeapYear( n ) ) - nLeaps++; - } - - sal_uInt32 nSum = 1; - nSum += nYear2; - nSum -= nYear1; - nSum *= 365; - nSum += nLeaps; - - return nSum; -} - - -void GetDiffParam( sal_Int32 nNullDate, sal_Int32 nStartDate, sal_Int32 nEndDate, sal_Int32 nMode, - sal_uInt16& rYears, sal_Int32& rDayDiffPart, sal_Int32& rDaysInYear ) THROWDEF_RTE_IAE -{ - if( nStartDate > nEndDate ) - { - sal_Int32 n = nEndDate; - nEndDate = nStartDate; - nStartDate = n; - } - - sal_Int32 nDate1 = nStartDate + nNullDate; - sal_Int32 nDate2 = nEndDate + nNullDate; - - sal_uInt16 nDay1, nDay2; - sal_uInt16 nMonth1, nMonth2; - sal_uInt16 nYear1, nYear2; - - DaysToDate( nDate1, nDay1, nMonth1, nYear1 ); - DaysToDate( nDate2, nDay2, nMonth2, nYear2 ); - - sal_uInt16 nYears; - - sal_Int32 nDayDiff, nDaysInYear; - - switch( nMode ) - { - case 0: // 0=USA (NASD) 30/360 - case 4: // 4=Europe 30/360 - nDaysInYear = 360; - nYears = nYear2 - nYear1; - nDayDiff = GetDiffDate360( nDay1, nMonth1, nYear1, IsLeapYear( nYear1 ), - nDay2, nMonth2, nYear2, nMode == 0 ) - nYears * nDaysInYear; - break; - case 1: // 1=exact/exact - nYears = nYear2 - nYear1; - - nDaysInYear = IsLeapYear( nYear1 )? 366 : 365; - - if( nYears && ( nMonth1 > nMonth2 || ( nMonth1 == nMonth2 && nDay1 > nDay2 ) ) ) - nYears--; - - if( nYears ) - nDayDiff = nDate2 - DateToDays( nDay1, nMonth1, nYear2 ); - else - nDayDiff = nDate2 - nDate1; - - if( nDayDiff < 0 ) - nDayDiff += nDaysInYear; - - break; - case 2: // 2=exact/360 - nDaysInYear = 360; - nYears = sal_uInt16( ( nDate2 - nDate1 ) / nDaysInYear ); - nDayDiff = nDate2 - nDate1; - nDayDiff %= nDaysInYear; - break; - case 3: //3=exact/365 - nDaysInYear = 365; - nYears = sal_uInt16( ( nDate2 - nDate1 ) / nDaysInYear ); - nDayDiff = nDate2 - nDate1; - nDayDiff %= nDaysInYear; - break; - default: - THROW_IAE; - } - - rYears = nYears; - rDayDiffPart = nDayDiff; - rDaysInYear = nDaysInYear; -} - - -sal_Int32 GetDiffDate( sal_Int32 nNullDate, sal_Int32 nStartDate, sal_Int32 nEndDate, sal_Int32 nMode, - sal_Int32* pOptDaysIn1stYear ) THROWDEF_RTE_IAE -{ - sal_Bool bNeg = nStartDate > nEndDate; - - if( bNeg ) - { - sal_Int32 n = nEndDate; - nEndDate = nStartDate; - nStartDate = n; - } - - sal_Int32 nRet; - - switch( nMode ) - { - case 0: // 0=USA (NASD) 30/360 - case 4: // 4=Europe 30/360 - { - sal_uInt16 nD1, nM1, nY1, nD2, nM2, nY2; - - nStartDate += nNullDate; - nEndDate += nNullDate; - - DaysToDate( nStartDate, nD1, nM1, nY1 ); - DaysToDate( nEndDate, nD2, nM2, nY2 ); - - sal_Bool bLeap = IsLeapYear( nY1 ); - sal_Int32 nDays, nMonths; - - nMonths = nM2 - nM1; - nDays = nD2 - nD1; - - nMonths += ( nY2 - nY1 ) * 12; - - nRet = nMonths * 30 + nDays; - if( nMode == 0 && nM1 == 2 && nM2 != 2 && nY1 == nY2 ) - nRet -= bLeap? 1 : 2; - - if( pOptDaysIn1stYear ) - *pOptDaysIn1stYear = 360; - } - break; - case 1: // 1=exact/exact - if( pOptDaysIn1stYear ) - { - sal_uInt16 nD, nM, nY; - - DaysToDate( nStartDate + nNullDate, nD, nM, nY ); - - *pOptDaysIn1stYear = IsLeapYear( nY )? 366 : 365; - } - nRet = nEndDate - nStartDate; - break; - case 2: // 2=exact/360 - nRet = nEndDate - nStartDate; - if( pOptDaysIn1stYear ) - *pOptDaysIn1stYear = 360; - break; - case 3: //3=exact/365 - nRet = nEndDate - nStartDate; - if( pOptDaysIn1stYear ) - *pOptDaysIn1stYear = 365; - break; - default: - THROW_IAE; - } - - return bNeg? -nRet : nRet; -} - - -double GetYearDiff( sal_Int32 nNullDate, sal_Int32 nStartDate, sal_Int32 nEndDate, sal_Int32 nMode ) THROWDEF_RTE_IAE -{ - sal_Int32 nDays1stYear; - sal_Int32 nTotalDays = GetDiffDate( nNullDate, nStartDate, nEndDate, nMode, &nDays1stYear ); - - return double( nTotalDays ) / double( nDays1stYear ); -} - - -sal_Int32 GetDaysInYear( sal_Int32 nNullDate, sal_Int32 nDate, sal_Int32 nMode ) THROWDEF_RTE_IAE -{ - switch( nMode ) - { - case 0: // 0=USA (NASD) 30/360 - case 2: // 2=exact/360 - case 4: // 4=Europe 30/360 - return 360; - case 1: // 1=exact/exact - { - sal_uInt16 nD, nM, nY; - nDate += nNullDate; - DaysToDate( nDate, nD, nM, nY ); - return IsLeapYear( nY )? 366 : 365; - } - case 3: //3=exact/365 - return 365; - default: - THROW_IAE; - } -} - - -double GetYearFrac( sal_Int32 nNullDate, sal_Int32 nStartDate, sal_Int32 nEndDate, sal_Int32 nMode ) THROWDEF_RTE_IAE -{ - if( nStartDate == nEndDate ) - return 0.0; // nothing to do... - - sal_uInt16 nYears; - sal_Int32 nDayDiff, nDaysInYear; - - GetDiffParam( nNullDate, nStartDate, nEndDate, nMode, nYears, nDayDiff, nDaysInYear ); - - return double( nYears ) + double( nDayDiff ) / double( nDaysInYear ); -} - - -double Fak( sal_Int32 n ) -{ - if( n > 0 ) - { - double fRet = n; - double f = n - 1; - - while( f >= 2.0 ) - { - fRet *= f; - f--; - } - - return fRet; - } - else if( !n ) - return 1.0; - else - return 0.0; -} - - -double GetGcd( double f1, double f2 ) -{ - double f = fmod( f1, f2 ); - while( f > 0.0 ) - { - f1 = f2; - f2 = f; - f = fmod( f1, f2 ); - } - - return f2; -} - - -double ConvertToDec( const STRING& aStr, sal_uInt16 nBase, sal_uInt16 nCharLim ) THROWDEF_RTE_IAE -{ - if ( nBase < 2 || nBase > 36 ) - THROW_IAE; - - sal_uInt32 nStrLen = aStr.getLength(); - if( nStrLen > nCharLim ) - THROW_IAE; - else if( !nStrLen ) - return 0.0; - - double fVal = 0.0; - - register const sal_Unicode* p = aStr.getStr(); - - sal_uInt16 nFirstDig = 0; - sal_Bool bFirstDig = sal_True; - double fBase = nBase; - - while ( *p ) - { - sal_uInt16 n; - - if( '0' <= *p && *p <= '9' ) - n = *p - '0'; - else if( 'A' <= *p && *p <= 'Z' ) - n = 10 + ( *p - 'A' ); - else if ( 'a' <= *p && *p <= 'z' ) - n = 10 + ( *p - 'a' ); - else - n = nBase; - - if( n < nBase ) - { - if( bFirstDig ) - { - bFirstDig = sal_False; - nFirstDig = n; - } - fVal = fVal * fBase + double( n ); - } - else - // illegal char! - THROW_IAE; - - p++; - - } - - if( nStrLen == nCharLim && !bFirstDig && (nFirstDig >= nBase / 2) ) - { // handling negativ values - fVal = ( pow( double( nBase ), double( nCharLim ) ) - fVal ); // complement - fVal *= -1.0; - } - - return fVal; -} - - -static inline sal_Char GetMaxChar( sal_uInt16 nBase ) -{ - const sal_Char* c = "--123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - return c[ nBase ]; -} - - -STRING ConvertFromDec( double fNum, double fMin, double fMax, sal_uInt16 nBase, - sal_Int32 nPlaces, sal_Int32 nMaxPlaces, sal_Bool bUsePlaces ) THROWDEF_RTE_IAE -{ - fNum = ::rtl::math::approxFloor( fNum ); - fMin = ::rtl::math::approxFloor( fMin ); - fMax = ::rtl::math::approxFloor( fMax ); - - if( fNum < fMin || fNum > fMax || ( bUsePlaces && ( nPlaces <= 0 || nPlaces > nMaxPlaces ) ) ) - THROW_IAE; - - sal_Int64 nNum = static_cast< sal_Int64 >( fNum ); - sal_Bool bNeg = nNum < 0; - if( bNeg ) - nNum = sal_Int64( pow( double( nBase ), double( nMaxPlaces ) ) ) + nNum; - - STRING aRet( STRING::valueOf( nNum, nBase ).toAsciiUpperCase() ); - - - if( bUsePlaces ) - { - sal_Int32 nLen = aRet.getLength(); - if( !bNeg && nLen > nPlaces ) - { - THROW_IAE; - } - else if( ( bNeg && nLen < nMaxPlaces ) || ( !bNeg && nLen < nPlaces ) ) - { - sal_Int32 nLeft = nPlaces - nLen; - sal_Char* p = new sal_Char[ nLeft + 1 ]; - memset( p, bNeg? GetMaxChar( nBase ) : '0', nLeft ); - p[ nLeft ] = 0x00; - STRING aTmp( p, nLeft, RTL_TEXTENCODING_MS_1252 ); - aTmp += aRet; - aRet = aTmp; - - delete[] p; - } - } - - return aRet; -} - -// implementation moved to module sal, see #i97091# -double Erf( double x ) -{ - return ::rtl::math::erf(x); -} - -// implementation moved to module sal, see #i97091# -double Erfc( double x ) -{ - return ::rtl::math::erfc(x); -} - -inline sal_Bool IsNum( sal_Unicode c ) -{ - return c >= '0' && c <= '9'; -} - - -inline sal_Bool IsComma( sal_Unicode c ) -{ - return c == '.' || c == ','; -} - - -inline sal_Bool IsExpStart( sal_Unicode c ) -{ - return c == 'e' || c == 'E'; -} - - -inline sal_Bool IsImagUnit( sal_Unicode c ) -{ - return c == 'i' || c == 'j'; -} - - -inline sal_uInt16 GetVal( sal_Unicode c ) -{ - return sal_uInt16( c - '0' ); -} - - -sal_Bool ParseDouble( const sal_Unicode*& rp, double& rRet ) -{ - double fInt = 0.0; - double fFrac = 0.0; - double fMult = 0.1; // multiplier to multiply digits with, when adding fractional ones - sal_Int32 nExp = 0; - sal_Int32 nMaxExp = 307; - sal_uInt16 nDigCnt = 18; // max. number of digits to read in, rest doesn't matter - - enum State { S_End = 0, S_Sign, S_IntStart, S_Int, S_IgnoreIntDigs, S_Frac, S_IgnoreFracDigs, S_ExpSign, S_Exp }; - - State eS = S_Sign; - - sal_Bool bNegNum = sal_False; - sal_Bool bNegExp = sal_False; - - const sal_Unicode* p = rp; - sal_Unicode c; - - while( eS ) - { - c = *p; - switch( eS ) - { - case S_Sign: - if( IsNum( c ) ) - { - fInt = GetVal( c ); - nDigCnt--; - eS = S_Int; - } - else if( c == '-' ) - { - bNegNum = sal_True; - eS = S_IntStart; - } - else if( c == '+' ) - eS = S_IntStart; - else if( IsComma( c ) ) - eS = S_Frac; - else - return sal_False; - break; - case S_IntStart: - if( IsNum( c ) ) - { - fInt = GetVal( c ); - nDigCnt--; - eS = S_Int; - } - else if( IsComma( c ) ) - eS = S_Frac; - else if( IsImagUnit( c ) ) - { - rRet = 0.0; - return sal_True; - } - else - return sal_False; - break; - case S_Int: - if( IsNum( c ) ) - { - fInt *= 10.0; - fInt += double( GetVal( c ) ); - nDigCnt--; - if( !nDigCnt ) - eS = S_IgnoreIntDigs; - } - else if( IsComma( c ) ) - eS = S_Frac; - else if( IsExpStart( c ) ) - eS = S_ExpSign; - else - eS = S_End; - break; - case S_IgnoreIntDigs: - if( IsNum( c ) ) - nExp++; // just multiply num with 10... ;-) - else if( IsComma( c ) ) - eS = S_Frac; - else if( IsExpStart( c ) ) - eS = S_ExpSign; - else - eS = S_End; - break; - case S_Frac: - if( IsNum( c ) ) - { - fFrac += double( GetVal( c ) ) * fMult; - nDigCnt--; - if( nDigCnt ) - fMult *= 0.1; - else - eS = S_IgnoreFracDigs; - } - else if( IsExpStart( c ) ) - eS = S_ExpSign; - else - eS = S_End; - break; - case S_IgnoreFracDigs: - if( IsExpStart( c ) ) - eS = S_ExpSign; - else if( !IsNum( c ) ) - eS = S_End; - break; - case S_ExpSign: - if( IsNum( c ) ) - { - nExp = GetVal( c ); - eS = S_Exp; - } - else if( c == '-' ) - { - bNegExp = sal_True; - eS = S_Exp; - } - else if( c != '+' ) - eS = S_End; - break; - case S_Exp: - if( IsNum( c ) ) - { - nExp *= 10; - nExp += GetVal( c ); - if( nExp > nMaxExp ) - return sal_False; - } - else - eS = S_End; - break; - case S_End: // to avoid compiler warning - break; // loop exits anyway - } - - p++; - } - - p--; // set pointer back to last - rp = p; - - fInt += fFrac; - sal_Int32 nLog10 = sal_Int32( log10( fInt ) ); - - if( bNegExp ) - nExp = -nExp; - - if( nLog10 + nExp > nMaxExp ) - return sal_False; - - fInt = ::rtl::math::pow10Exp( fInt, nExp ); - - if( bNegNum ) - fInt = -fInt; - - rRet = fInt; - - return sal_True; -} - - -STRING GetString( double f, sal_Bool bLeadingSign, sal_uInt16 nMaxDig ) -{ - const int nBuff = 256; - sal_Char aBuff[ nBuff + 1 ]; - const char* pFormStr = bLeadingSign? "%+.*g" : "%.*g"; - int nLen = snprintf( aBuff, nBuff, pFormStr, int( nMaxDig ), f ); - // you never know which underlying implementation you get ... - aBuff[nBuff] = 0; - if ( nLen < 0 || nLen > nBuff ) - nLen = strlen( aBuff ); - - STRING aRet( aBuff, nLen, RTL_TEXTENCODING_MS_1252 ); - - return aRet; -} - - -double GetAmordegrc( sal_Int32 nNullDate, double fCost, sal_Int32 nDate, sal_Int32 nFirstPer, - double fRestVal, double fPer, double fRate, sal_Int32 nBase ) THROWDEF_RTE_IAE -{ - if( nBase == 2 ) - THROW_IAE; - - sal_uInt32 nPer = sal_uInt32( fPer ); - double fUsePer = 1.0 / fRate; - double fAmorCoeff; - - if( fUsePer < 3.0 ) - fAmorCoeff = 1.0; - else if( fUsePer < 5.0 ) - fAmorCoeff = 1.5; - else if( fUsePer <= 6.0 ) - fAmorCoeff = 2.0; - else - fAmorCoeff = 2.5; - - fRate *= fAmorCoeff; - double fNRate = ::rtl::math::round( GetYearFrac( nNullDate, nDate, nFirstPer, nBase ) * fRate * fCost, 0 ); - fCost -= fNRate; - double fRest = fCost - fRestVal; // Anschaffungskosten - Restwert - Summe aller Abschreibungen - - for( sal_uInt32 n = 0 ; n < nPer ; n++ ) - { - fNRate = ::rtl::math::round( fRate * fCost, 0 ); - fRest -= fNRate; - - if( fRest < 0.0 ) - { - switch( nPer - n ) - { - case 0: - case 1: - return ::rtl::math::round( fCost * 0.5, 0 ); - default: - return 0.0; - } - } - - fCost -= fNRate; - } - - return fNRate; -} - - -double GetAmorlinc( sal_Int32 nNullDate, double fCost, sal_Int32 nDate, sal_Int32 nFirstPer, - double fRestVal, double fPer, double fRate, sal_Int32 nBase ) THROWDEF_RTE_IAE -{ - if( nBase == 2 ) - THROW_IAE; - - sal_uInt32 nPer = sal_uInt32( fPer ); - double fOneRate = fCost * fRate; - double fCostDelta = fCost - fRestVal; - double f0Rate = GetYearFrac( nNullDate, nDate, nFirstPer, nBase ) * fRate * fCost; - sal_uInt32 nNumOfFullPeriods = sal_uInt32( ( fCost - fRestVal - f0Rate) / fOneRate ); - - if( nPer == 0 ) - return f0Rate; - else if( nPer <= nNumOfFullPeriods ) - return fOneRate; - else if( nPer == nNumOfFullPeriods + 1 ) - return fCostDelta - fOneRate * nNumOfFullPeriods - f0Rate; - else - return 0.0; -} - - -double GetDuration( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, double fCoup, - double fYield, sal_Int32 nFreq, sal_Int32 nBase ) THROWDEF_RTE_IAE -{ - double fYearfrac = GetYearFrac( nNullDate, nSettle, nMat, nBase ); - double fNumOfCoups = GetCoupnum( nNullDate, nSettle, nMat, nFreq, nBase ); - double fDur = 0.0; - const double f100 = 100.0; - fCoup *= f100 / double( nFreq ); // fCoup is used as cash flow - fYield /= nFreq; - fYield += 1.0; - - double nDiff = fYearfrac * nFreq - fNumOfCoups; - - double t; - - for( t = 1.0 ; t < fNumOfCoups ; t++ ) - fDur += ( t + nDiff ) * ( fCoup ) / pow( fYield, t + nDiff ); - - fDur += ( fNumOfCoups + nDiff ) * ( fCoup + f100 ) / pow( fYield, fNumOfCoups + nDiff ); - - double p = 0.0; - for( t = 1.0 ; t < fNumOfCoups ; t++ ) - p += fCoup / pow( fYield, t + nDiff ); - - p += ( fCoup + f100 ) / pow( fYield, fNumOfCoups + nDiff ); - - fDur /= p; - fDur /= double( nFreq ); - - return fDur; -} - - -double GetYieldmat( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nIssue, - double fRate, double fPrice, sal_Int32 nBase ) THROWDEF_RTE_IAE -{ - double fIssMat = GetYearFrac( nNullDate, nIssue, nMat, nBase ); - double fIssSet = GetYearFrac( nNullDate, nIssue, nSettle, nBase ); - double fSetMat = GetYearFrac( nNullDate, nSettle, nMat, nBase ); - - double y = 1.0 + fIssMat * fRate; - y /= fPrice / 100.0 + fIssSet * fRate; - y--; - y /= fSetMat; - - return y; -} - - -double GetOddfprice( sal_Int32 /*nNullDate*/, sal_Int32 /*nSettle*/, sal_Int32 /*nMat*/, sal_Int32 /*nIssue*/, - sal_Int32 /*nFirstCoup*/, double /*fRate*/, double /*fYield*/, double /*fRedemp*/, sal_Int32 /*nFreq*/, - sal_Int32 /*nBase*/ ) THROWDEF_RTE_IAE -{ - THROW_RTE; // #87380# -} - - -double getYield_( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, double fCoup, double fPrice, - double fRedemp, sal_Int32 nFreq, sal_Int32 nBase ) THROWDEF_RTE_IAE -{ - double fRate = fCoup; - double fPriceN = 0.0; - double fYield1 = 0.0; - double fYield2 = 1.0; - double fPrice1 = getPrice_( nNullDate, nSettle, nMat, fRate, fYield1, fRedemp, nFreq, nBase ); - double fPrice2 = getPrice_( nNullDate, nSettle, nMat, fRate, fYield2, fRedemp, nFreq, nBase ); - double fYieldN = ( fYield2 - fYield1 ) * 0.5; - - for( sal_uInt32 nIter = 0 ; nIter < 100 && fPriceN != fPrice ; nIter++ ) - { - fPriceN = getPrice_( nNullDate, nSettle, nMat, fRate, fYieldN, fRedemp, nFreq, nBase ); - - if( fPrice == fPrice1 ) - return fYield1; - else if( fPrice == fPrice2 ) - return fYield2; - else if( fPrice == fPriceN ) - return fYieldN; - else if( fPrice < fPrice2 ) - { - fYield2 *= 2.0; - fPrice2 = getPrice_( nNullDate, nSettle, nMat, fRate, fYield2, fRedemp, nFreq, nBase ); - - fYieldN = ( fYield2 - fYield1 ) * 0.5; - } - else - { - if( fPrice < fPriceN ) - { - fYield1 = fYieldN; - fPrice1 = fPriceN; - } - else - { - fYield2 = fYieldN; - fPrice2 = fPriceN; - } - - fYieldN = fYield2 - ( fYield2 - fYield1 ) * ( ( fPrice - fPrice2 ) / ( fPrice1 - fPrice2 ) ); - } - } - - if( fabs( fPrice - fPriceN ) > fPrice / 100.0 ) - THROW_IAE; // result not precise enough - - return fYieldN; -} - - -double getPrice_( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, double fRate, double fYield, - double fRedemp, sal_Int32 nFreq, sal_Int32 nBase ) THROWDEF_RTE_IAE -{ - double fFreq = nFreq; - - double fE = GetCoupdays( nNullDate, nSettle, nMat, nFreq, nBase ); - double fDSC_E = GetCoupdaysnc( nNullDate, nSettle, nMat, nFreq, nBase ) / fE; - double fN = GetCoupnum( nNullDate, nSettle, nMat, nFreq, nBase ); - double fA = GetCoupdaybs( nNullDate, nSettle, nMat, nFreq, nBase ); - - double fRet = fRedemp / ( pow( 1.0 + fYield / fFreq, fN - 1.0 + fDSC_E ) ); - fRet -= 100.0 * fRate / fFreq * fA / fE; - - double fT1 = 100.0 * fRate / fFreq; - double fT2 = 1.0 + fYield / fFreq; - - for( double fK = 0.0 ; fK < fN ; fK++ ) - fRet += fT1 / pow( fT2, fK + fDSC_E ); - - return fRet; -} - - -double GetOddfyield( sal_Int32 /*nNullDate*/, sal_Int32 /*nSettle*/, sal_Int32 /*nMat*/, sal_Int32 /*nIssue*/, - sal_Int32 /*nFirstCoup*/, double /*fRate*/, double /*fPrice*/, double /*fRedemp*/, sal_Int32 /*nFreq*/, - sal_Int32 /*nBase*/ ) THROWDEF_RTE_IAE -{ - THROW_RTE; // #87380# -} - - -double GetOddlprice( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nLastCoup, - double fRate, double fYield, double fRedemp, sal_Int32 nFreq, sal_Int32 nBase ) THROWDEF_RTE_IAE -{ - double fFreq = double( nFreq ); - double fDCi = GetYearFrac( nNullDate, nLastCoup, nMat, nBase ) * fFreq; - double fDSCi = GetYearFrac( nNullDate, nSettle, nMat, nBase ) * fFreq; - double fAi = GetYearFrac( nNullDate, nLastCoup, nSettle, nBase ) * fFreq; - - double p = fRedemp + fDCi * 100.0 * fRate / fFreq; - p /= fDSCi * fYield / fFreq + 1.0; - p -= fAi * 100.0 * fRate / fFreq; - - return p; -} - - -double GetOddlyield( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nLastCoup, - double fRate, double fPrice, double fRedemp, sal_Int32 nFreq, sal_Int32 nBase ) THROWDEF_RTE_IAE -{ - double fFreq = double( nFreq ); - double fDCi = GetYearFrac( nNullDate, nLastCoup, nMat, nBase ) * fFreq; - double fDSCi = GetYearFrac( nNullDate, nSettle, nMat, nBase ) * fFreq; - double fAi = GetYearFrac( nNullDate, nLastCoup, nSettle, nBase ) * fFreq; - - double y = fRedemp + fDCi * 100.0 * fRate / fFreq; - y /= fPrice + fAi * 100.0 * fRate / fFreq; - y--; - y *= fFreq / fDSCi; - - return y; -} - - -double GetRmz( double fZins, double fZzr, double fBw, double fZw, sal_Int32 nF ) -{ - double fRmz; - if( fZins == 0.0 ) - fRmz = ( fBw + fZw ) / fZzr; - else - { - double fTerm = pow( 1.0 + fZins, fZzr ); - if( nF > 0 ) - fRmz = ( fZw * fZins / ( fTerm - 1.0 ) + fBw * fZins / ( 1.0 - 1.0 / fTerm ) ) / ( 1.0 + fZins ); - else - fRmz = fZw * fZins / ( fTerm - 1.0 ) + fBw * fZins / ( 1.0 - 1.0 / fTerm ); - } - - return -fRmz; -} - - -double GetZw( double fZins, double fZzr, double fRmz, double fBw, sal_Int32 nF ) -{ - double fZw; - if( fZins == 0.0 ) - fZw = fBw + fRmz * fZzr; - else - { - double fTerm = pow( 1.0 + fZins, fZzr ); - if( nF > 0 ) - fZw = fBw * fTerm + fRmz * ( 1.0 + fZins ) * ( fTerm - 1.0 ) / fZins; - else - fZw = fBw * fTerm + fRmz * ( fTerm - 1.0 ) / fZins; - } - - return -fZw; -} - - -//----------------------------------------------------------------------------- -// financial functions COUP*** - - -//------- -// COUPPCD: find last coupon date before settlement (can be equal to settlement) -void lcl_GetCouppcd( ScaDate& rDate, const ScaDate& rSettle, const ScaDate& rMat, sal_Int32 nFreq ) - throw( lang::IllegalArgumentException ) -{ - rDate = rMat; - rDate.setYear( rSettle.getYear() ); - if( rDate < rSettle ) - rDate.addYears( 1 ); - while( rDate > rSettle ) - rDate.addMonths( -12 / nFreq ); -} - -double GetCouppcd( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, sal_Int32 nBase ) - THROWDEF_RTE_IAE -{ - if( nSettle >= nMat || CHK_Freq ) - THROW_IAE; - - ScaDate aDate; - lcl_GetCouppcd( aDate, ScaDate( nNullDate, nSettle, nBase ), ScaDate( nNullDate, nMat, nBase ), nFreq ); - return aDate.getDate( nNullDate ); -} - - -//------- -// COUPNCD: find first coupon date after settlement (is never equal to settlement) -void lcl_GetCoupncd( ScaDate& rDate, const ScaDate& rSettle, const ScaDate& rMat, sal_Int32 nFreq ) - throw( lang::IllegalArgumentException ) -{ - rDate = rMat; - rDate.setYear( rSettle.getYear() ); - if( rDate > rSettle ) - rDate.addYears( -1 ); - while( rDate <= rSettle ) - rDate.addMonths( 12 / nFreq ); -} - -double GetCoupncd( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, sal_Int32 nBase ) - THROWDEF_RTE_IAE -{ - if( nSettle >= nMat || CHK_Freq ) - THROW_IAE; - - ScaDate aDate; - lcl_GetCoupncd( aDate, ScaDate( nNullDate, nSettle, nBase ), ScaDate( nNullDate, nMat, nBase ), nFreq ); - return aDate.getDate( nNullDate ); -} - - -//------- -// COUPDAYBS: get day count: coupon date before settlement <-> settlement -double GetCoupdaybs( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, sal_Int32 nBase ) - THROWDEF_RTE_IAE -{ - if( nSettle >= nMat || CHK_Freq ) - THROW_IAE; - - ScaDate aSettle( nNullDate, nSettle, nBase ); - ScaDate aDate; - lcl_GetCouppcd( aDate, aSettle, ScaDate( nNullDate, nMat, nBase ), nFreq ); - return ScaDate::getDiff( aDate, aSettle ); -} - - -//------- -// COUPDAYSNC: get day count: settlement <-> coupon date after settlement -double GetCoupdaysnc( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, sal_Int32 nBase ) - THROWDEF_RTE_IAE -{ - if( nSettle >= nMat || CHK_Freq ) - THROW_IAE; - - if( (nBase != 0) && (nBase != 4) ) - { - ScaDate aSettle( nNullDate, nSettle, nBase ); - ScaDate aDate; - lcl_GetCoupncd( aDate, aSettle, ScaDate( nNullDate, nMat, nBase ), nFreq ); - return ScaDate::getDiff( aSettle, aDate ); - } - return GetCoupdays( nNullDate, nSettle, nMat, nFreq, nBase ) - GetCoupdaybs( nNullDate, nSettle, nMat, nFreq, nBase ); -} - - -//------- -// COUPDAYS: get day count: coupon date before settlement <-> coupon date after settlement -double GetCoupdays( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, sal_Int32 nBase ) - THROWDEF_RTE_IAE -{ - if( nSettle >= nMat || CHK_Freq ) - THROW_IAE; - - if( nBase == 1 ) - { - ScaDate aDate; - lcl_GetCouppcd( aDate, ScaDate( nNullDate, nSettle, nBase ), ScaDate( nNullDate, nMat, nBase ), nFreq ); - ScaDate aNextDate( aDate ); - aNextDate.addMonths( 12 / nFreq ); - return ScaDate::getDiff( aDate, aNextDate ); - } - return static_cast< double >( GetDaysInYear( 0, 0, nBase ) ) / nFreq; -} - - -//------- -// COUPNUM: get count of coupon dates -double GetCoupnum( sal_Int32 nNullDate, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, sal_Int32 nBase ) - THROWDEF_RTE_IAE -{ - if( nSettle >= nMat || CHK_Freq ) - THROW_IAE; - - ScaDate aMat( nNullDate, nMat, nBase ); - ScaDate aDate; - lcl_GetCouppcd( aDate, ScaDate( nNullDate, nSettle, nBase ), aMat, nFreq ); - sal_uInt16 nMonths = (aMat.getYear() - aDate.getYear()) * 12 + aMat.getMonth() - aDate.getMonth(); - return static_cast< double >( nMonths * nFreq / 12 ); -} - - - - - - - -const sal_uInt32 MyList::nStartSize = 16; -const sal_uInt32 MyList::nIncrSize = 16; - - -void MyList::_Grow( void ) -{ - nSize += nIncrSize; - - void** pNewData = new void*[ nSize ]; - memcpy( pNewData, pData, nNew * sizeof( void* ) ); - - delete[] pData; - pData = pNewData; -} - - -MyList::MyList( void ) -{ - nSize = nStartSize; - pData = new void*[ nSize ]; - nNew = nAct = 0; -} - - -MyList::~MyList() -{ - delete[] pData; -} - - -void MyList::Insert( void* p, sal_uInt32 n ) -{ - if( n >= nNew ) - Append( p ); - else - { - Grow(); - - void** pIns = pData + n; - memmove( pIns + 1, pIns, ( nNew - n ) * sizeof( void* ) ); - - *pIns = p; - - nNew++; - } -} - - - - -StringList::~StringList() -{ - for( STRING* p = ( STRING* ) First() ; p ; p = ( STRING* ) Next() ) - delete p; -} - - -class AnalysisRscStrArrLoader : public Resource -{ -private: - ResStringArray aStrArray; -public: - AnalysisRscStrArrLoader( sal_uInt16 nRsc, sal_uInt16 nArrayId, ResMgr& rResMgr ) : - Resource( AnalysisResId( nRsc, rResMgr ) ), - aStrArray( AnalysisResId( nArrayId, rResMgr ) ) - { - FreeResource(); - } - - const ResStringArray& GetStringArray() const { return aStrArray; } -}; - - - - -FuncData::FuncData( const FuncDataBase& r, ResMgr& rResMgr ) : - aIntName( OUString::createFromAscii( r.pIntName ) ), - nUINameID( r.nUINameID ), - nDescrID( r.nDescrID ), - bDouble( r.bDouble ), - bWithOpt( r.bWithOpt ), - nParam( r.nNumOfParams ), - nCompID( r.nCompListID ), - eCat( r.eCat ) -{ - AnalysisRscStrArrLoader aArrLoader( RID_ANALYSIS_DEFFUNCTION_NAMES, nCompID, rResMgr ); - const ResStringArray& rArr = aArrLoader.GetStringArray(); - - sal_uInt16 nCount = sal::static_int_cast<sal_uInt16>( rArr.Count() ); - sal_uInt16 n; - - for( n = 0 ; n < nCount ; n++ ) - aCompList.Append( rArr.GetString( n ) ); -} - - -FuncData::~FuncData() -{ -} - - -sal_uInt16 FuncData::GetStrIndex( sal_uInt16 nParamNum ) const -{ - if( !bWithOpt ) - nParamNum++; - - if( nParamNum > nParam ) - return nParam * 2; - else - return nParamNum * 2; -} - - - - -FuncDataList::FuncDataList( ResMgr& rResMgr ) -{ - for( sal_uInt16 n = 0 ; n < SAL_N_ELEMENTS(pFuncDatas) ; n++ ) - Append( new FuncData( pFuncDatas[ n ], rResMgr ) ); -} - - -FuncDataList::~FuncDataList() -{ - for( FuncData* p = ( FuncData* ) First() ; p ; p = ( FuncData* ) Next() ) - delete p; -} - - -const FuncData* FuncDataList::Get( const OUString& aProgrammaticName ) const -{ - if( aLastName == aProgrammaticName ) - return Get( nLast ); - - ( ( FuncDataList* ) this )->aLastName = aProgrammaticName; - - sal_uInt32 nE = Count(); - for( sal_uInt32 n = 0 ; n < nE ; n++ ) - { - const FuncData* p = Get( n ); - if( p->Is( aProgrammaticName ) ) - { - ( ( FuncDataList* ) this )->nLast = n; - return p; - } - } - - ( ( FuncDataList* ) this )->nLast = 0xFFFFFFFF; - return NULL; -} - - -AnalysisResId::AnalysisResId( sal_uInt16 nId, ResMgr& rResMgr ) : ResId( nId, rResMgr ) -{ -} - - - - -SortedIndividualInt32List::SortedIndividualInt32List() -{ -} - - -SortedIndividualInt32List::~SortedIndividualInt32List() -{ -} - - -void SortedIndividualInt32List::Insert( sal_Int32 nDay ) -{ - sal_uInt32 nIndex = Count(); - while( nIndex ) - { - nIndex--; - sal_Int32 nRef = Get( nIndex ); - if( nDay == nRef ) - return; - else if( nDay > nRef ) - { - MyList::Insert( (void*)(sal_IntPtr)nDay, nIndex + 1 ); - return; - } - } - MyList::Insert( (void*)(sal_IntPtr)nDay, 0UL ); -} - - -void SortedIndividualInt32List::Insert( sal_Int32 nDay, sal_Int32 nNullDate, sal_Bool bInsertOnWeekend ) -{ - if( !nDay ) - return; - - nDay += nNullDate; - if( bInsertOnWeekend || (GetDayOfWeek( nDay ) < 5) ) - Insert( nDay ); -} - - -void SortedIndividualInt32List::Insert( - double fDay, sal_Int32 nNullDate, sal_Bool bInsertOnWeekend ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - if( (fDay < -2147483648.0) || (fDay > 2147483649.0) ) - throw lang::IllegalArgumentException(); - Insert( static_cast< sal_Int32 >( fDay ), nNullDate, bInsertOnWeekend ); -} - - -sal_Bool SortedIndividualInt32List::Find( sal_Int32 nVal ) const -{ - sal_uInt32 nE = Count(); - - if( !nE || nVal < Get( 0 ) || nVal > Get( nE - 1 ) ) - return sal_False; - - // linear search - - for( sal_uInt32 n = 0 ; n < nE ; n++ ) - { - sal_Int32 nRef = Get( n ); - - if( nRef == nVal ) - return sal_True; - else if( nRef > nVal ) - return sal_False; - } - return sal_False; -} - - -void SortedIndividualInt32List::InsertHolidayList( - const ScaAnyConverter& rAnyConv, - const uno::Any& rHolAny, - sal_Int32 nNullDate, - sal_Bool bInsertOnWeekend ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - double fDay; - if( rAnyConv.getDouble( fDay, rHolAny ) ) - Insert( fDay, nNullDate, bInsertOnWeekend ); -} - - -void SortedIndividualInt32List::InsertHolidayList( - ScaAnyConverter& rAnyConv, - const uno::Reference< beans::XPropertySet >& xOptions, - const uno::Any& rHolAny, - sal_Int32 nNullDate, - sal_Bool bInsertOnWeekend ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - rAnyConv.init( xOptions ); - if( rHolAny.getValueTypeClass() == uno::TypeClass_SEQUENCE ) - { - uno::Sequence< uno::Sequence< uno::Any > > aAnySeq; - if( rHolAny >>= aAnySeq ) - { - const uno::Sequence< uno::Any >* pSeqArray = aAnySeq.getConstArray(); - for( sal_Int32 nIndex1 = 0; nIndex1 < aAnySeq.getLength(); nIndex1++ ) - { - const uno::Sequence< uno::Any >& rSubSeq = pSeqArray[ nIndex1 ]; - const uno::Any* pAnyArray = rSubSeq.getConstArray(); - - for( sal_Int32 nIndex2 = 0; nIndex2 < rSubSeq.getLength(); nIndex2++ ) - InsertHolidayList( rAnyConv, pAnyArray[ nIndex2 ], nNullDate, bInsertOnWeekend ); - } - } - else - throw lang::IllegalArgumentException(); - } - else - InsertHolidayList( rAnyConv, rHolAny, nNullDate, bInsertOnWeekend ); -} - - - -//----------------------------------------------------------------------------- - -ScaDoubleList::~ScaDoubleList() -{ - for( double* pDbl = const_cast< double* >( First() ); pDbl; pDbl = const_cast< double* >( Next() ) ) - delete pDbl; -} - - -void ScaDoubleList::Append( - const uno::Sequence< uno::Sequence< double > >& rValueSeq ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - const uno::Sequence< double >* pSeqArray = rValueSeq.getConstArray(); - for( sal_Int32 nIndex1 = 0; nIndex1 < rValueSeq.getLength(); nIndex1++ ) - { - const uno::Sequence< double >& rSubSeq = pSeqArray[ nIndex1 ]; - const double* pArray = rSubSeq.getConstArray(); - for( sal_Int32 nIndex2 = 0; nIndex2 < rSubSeq.getLength(); nIndex2++ ) - Append( pArray[ nIndex2 ] ); - } -} - - -void ScaDoubleList::Append( - const uno::Sequence< uno::Sequence< sal_Int32 > >& rValueSeq ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - const uno::Sequence< sal_Int32 >* pSeqArray = rValueSeq.getConstArray(); - for( sal_Int32 nIndex1 = 0; nIndex1 < rValueSeq.getLength(); nIndex1++ ) - { - const uno::Sequence< sal_Int32 >& rSubSeq = pSeqArray[ nIndex1 ]; - const sal_Int32* pArray = rSubSeq.getConstArray(); - for( sal_Int32 nIndex2 = 0; nIndex2 < rSubSeq.getLength(); nIndex2++ ) - Append( pArray[ nIndex2 ] ); - } -} - - - -void ScaDoubleList::Append( - const ScaAnyConverter& rAnyConv, - const uno::Any& rAny, - sal_Bool bIgnoreEmpty ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - if( rAny.getValueTypeClass() == uno::TypeClass_SEQUENCE ) - Append( rAnyConv, *static_cast< const uno::Sequence< uno::Sequence< uno::Any > >* >( rAny.getValue() ), bIgnoreEmpty ); - else - { - double fValue; - if( rAnyConv.getDouble( fValue, rAny ) ) - Append( fValue ); - else if( !bIgnoreEmpty ) - Append( 0.0 ); - } -} - - -void ScaDoubleList::Append( - const ScaAnyConverter& rAnyConv, - const uno::Sequence< uno::Any >& rAnySeq, - sal_Bool bIgnoreEmpty ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - const uno::Any* pArray = rAnySeq.getConstArray(); - for( sal_Int32 nIndex = 0; nIndex < rAnySeq.getLength(); nIndex++ ) - Append( rAnyConv, pArray[ nIndex ], bIgnoreEmpty ); -} - - -void ScaDoubleList::Append( - const ScaAnyConverter& rAnyConv, - const uno::Sequence< uno::Sequence< uno::Any > >& rAnySeq, - sal_Bool bIgnoreEmpty ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - const uno::Sequence< uno::Any >* pArray = rAnySeq.getConstArray(); - for( sal_Int32 nIndex = 0; nIndex < rAnySeq.getLength(); nIndex++ ) - Append( rAnyConv, pArray[ nIndex ], bIgnoreEmpty ); -} - - - -void ScaDoubleList::Append( - ScaAnyConverter& rAnyConv, - const uno::Reference< beans::XPropertySet >& xOpt, - const uno::Sequence< uno::Any >& rAnySeq, - sal_Bool bIgnoreEmpty ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - rAnyConv.init( xOpt ); - Append( rAnyConv, rAnySeq, bIgnoreEmpty ); -} - - -sal_Bool ScaDoubleList::CheckInsert( double ) const throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - return sal_True; -} - - - -//----------------------------------------------------------------------------- - -sal_Bool ScaDoubleListGT0::CheckInsert( double fValue ) const throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - if( fValue < 0.0 ) - throw lang::IllegalArgumentException(); - return fValue > 0.0; -} - - - -//----------------------------------------------------------------------------- - -sal_Bool ScaDoubleListGE0::CheckInsert( double fValue ) const throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - if( fValue < 0.0 ) - throw lang::IllegalArgumentException(); - return sal_True; -} - - - -//----------------------------------------------------------------------------- - -Complex::Complex( const STRING& rStr ) THROWDEF_RTE_IAE -{ - if( !ParseString( rStr, *this ) ) - THROW_IAE; -} - - -inline sal_Bool Complex::IsImagUnit( sal_Unicode c ) -{ - return c == 'i' || c == 'j'; -} - -sal_Bool Complex::ParseString( const STRING& rStr, Complex& rCompl ) -{ - rCompl.c = '\0'; // do not force a symbol, if only real part present - - const sal_Unicode* pStr = rStr.getStr(); - - if( IsImagUnit( *pStr ) && rStr.getLength() == 1) - { - rCompl.r = 0.0; - rCompl.i = 1.0; - rCompl.c = *pStr; - return sal_True; - } - - double f; - - if( !ParseDouble( pStr, f ) ) - return sal_False; - - switch( *pStr ) - { - case '-': // imag part follows - case '+': - { - double r = f; - if( IsImagUnit( pStr[ 1 ] ) ) - { - rCompl.c = pStr[ 1 ]; - if( pStr[ 2 ] == 0 ) - { - rCompl.r = f; - rCompl.i = ( *pStr == '+' )? 1.0 : -1.0; - return sal_True; - } - } - else if( ParseDouble( pStr, f ) && IsImagUnit( *pStr ) ) - { - rCompl.c = *pStr; - pStr++; - if( *pStr == 0 ) - { - rCompl.r = r; - rCompl.i = f; - return sal_True; - } - } - } - break; - case 'j': - case 'i': - rCompl.c = *pStr; - pStr++; - if( *pStr == 0 ) - { - rCompl.i = f; - rCompl.r = 0.0; - return sal_True; - } - break; - case 0: // only real-part - rCompl.r = f; - rCompl.i = 0.0; - return sal_True; - } - - return sal_False; -} - - -STRING Complex::GetString() const THROWDEF_RTE_IAE -{ - static const String aI( 'i' ); - static const String aJ( 'j' ); - static const String aPlus( '+' ); - static const String aMinus( '-' ); - - CHK_FINITE(r); - CHK_FINITE(i); - STRING aRet; - - bool bHasImag = i != 0.0; - bool bHasReal = !bHasImag || (r != 0.0); - - if( bHasReal ) - aRet = ::GetString( r ); - if( bHasImag ) - { - if( i == 1.0 ) - { - if( bHasReal ) - aRet += aPlus; - } - else if( i == -1.0 ) - aRet += aMinus; - else - aRet += ::GetString( i, bHasReal ); - aRet += (c != 'j') ? aI : aJ; - } - - return aRet; -} - - -double Complex::Arg( void ) const THROWDEF_RTE_IAE -{ - if( r == 0.0 && i == 0.0 ) - THROW_IAE; - - double phi = acos( r / Abs() ); - - if( i < 0.0 ) - phi = -phi; - - return phi; -} - - -void Complex::Power( double fPower ) THROWDEF_RTE_IAE -{ - if( r == 0.0 && i == 0.0 ) - { - if( fPower > 0 ) - { - r = i = 0.0; - return; - } - else - THROW_IAE; - } - - double p, phi; - - p = Abs(); - - phi = acos( r / p ); - if( i < 0.0 ) - phi = -phi; - - p = pow( p, fPower ); - phi *= fPower; - - r = cos( phi ) * p; - i = sin( phi ) * p; -} - - -void Complex::Sqrt( void ) -{ - static const double fMultConst = 0.7071067811865475; // ...2440084436210485 = 1/sqrt(2) - double p = Abs(); - double i_ = sqrt( p - r ) * fMultConst; - - r = sqrt( p + r ) * fMultConst; - i = ( i < 0.0 )? -i_ : i_; -} - - -inline sal_Bool SinOverflow( double f ) -{ - return fabs( f ) >= 134217728; -} - - -void Complex::Sin( void ) THROWDEF_RTE_IAE -{ - if( SinOverflow( r ) ) - THROW_IAE; - - if( i ) - { - double r_; - - r_ = sin( r ) * cosh( i ); - i = cos( r ) * sinh( i ); - r = r_; - } - else - r = sin( r ); -} - - -void Complex::Cos( void ) THROWDEF_RTE_IAE -{ - if( SinOverflow( r ) ) - THROW_IAE; - - if( i ) - { - double r_; - - r_ = cos( r ) * cosh( i ); - i = -( sin( r ) * sinh( i ) ); - r = r_; - } - else - r = cos( r ); -} - - -void Complex::Div( const Complex& z ) THROWDEF_RTE_IAE -{ - if( z.r == 0 && z.i == 0 ) - THROW_IAE; - - double a1 = r; - double a2 = z.r; - double b1 = i; - double b2 = z.i; - - double f = 1.0 / ( a2 * a2 + b2 * b2 ); - - r = ( a1 * a2 + b1 * b2 ) * f; - i = ( a2 * b1 - a1 * b2 ) * f; - - if( !c ) c = z.c; -} - - -void Complex::Exp( void ) -{ - double fE = exp( r ); - r = fE * cos( i ); - i = fE * sin( i ); -} - - -void Complex::Ln( void ) THROWDEF_RTE_IAE -{ - if( r == 0.0 && i == 0.0 ) - THROW_IAE; - - double fAbs = Abs(); - sal_Bool bNegi = i < 0.0; - - i = acos( r / fAbs ); - - if( bNegi ) - i = -i; - - r = log( fAbs ); -} - - -void Complex::Log10( void ) THROWDEF_RTE_IAE -{ - Ln(); - Mult( 0.434294481903251828 ); // * log10( e ) -} - - -void Complex::Log2( void ) THROWDEF_RTE_IAE -{ - Ln(); - Mult( 1.442695040888963407 ); // * log2( e ) -} - - - - -ComplexList::~ComplexList() -{ - for( Complex* p = ( Complex* ) First() ; p ; p = ( Complex* ) Next() ) - delete p; -} - - -void ComplexList::Append( const SEQSEQ( STRING )& r, ComplListAppendHandl eAH ) THROWDEF_RTE_IAE -{ - sal_Int32 n1, n2; - sal_Int32 nE1 = r.getLength(); - sal_Int32 nE2; - sal_Bool bEmpty0 = eAH == AH_EmpyAs0; - sal_Bool bErrOnEmpty = eAH == AH_EmptyAsErr; - - for( n1 = 0 ; n1 < nE1 ; n1++ ) - { - const SEQ( STRING )& rList = r[ n1 ]; - nE2 = rList.getLength(); - - for( n2 = 0 ; n2 < nE2 ; n2++ ) - { - const STRING& rStr = rList[ n2 ]; - - if( rStr.getLength() ) - Append( new Complex( rStr ) ); - else if( bEmpty0 ) - Append( new Complex( 0.0 ) ); - else if( bErrOnEmpty ) - THROW_IAE; - } - } -} - - -void ComplexList::Append( const SEQ( ANY )& aMultPars, ComplListAppendHandl eAH ) THROWDEF_RTE_IAE -{ - sal_Int32 nEle = aMultPars.getLength(); - sal_Bool bEmpty0 = eAH == AH_EmpyAs0; - sal_Bool bErrOnEmpty = eAH == AH_EmptyAsErr; - - for( sal_Int32 i = 0 ; i < nEle ; i++ ) - { - const ANY& r = aMultPars[ i ]; - switch( r.getValueTypeClass() ) - { - case uno::TypeClass_VOID: break; - case uno::TypeClass_STRING: - { - const STRING* pStr = ( const STRING* ) r.getValue(); - - if( pStr->getLength() ) - Append( new Complex( *( STRING* ) r.getValue() ) ); - else if( bEmpty0 ) - Append( new Complex( 0.0 ) ); - else if( bErrOnEmpty ) - THROW_IAE; - } - break; - case uno::TypeClass_DOUBLE: - Append( new Complex( *( double* ) r.getValue(), 0.0 ) ); - break; - case uno::TypeClass_SEQUENCE: - { - SEQSEQ( ANY ) aValArr; - if( r >>= aValArr ) - { - sal_Int32 nE = aValArr.getLength(); - const SEQ( ANY )* pArr = aValArr.getConstArray(); - for( sal_Int32 n = 0 ; n < nE ; n++ ) - Append( pArr[ n ], eAH ); - } - else - THROW_IAE; - } - break; - default: - THROW_IAE; - } - } -} - - - - -ConvertData::ConvertData( const sal_Char p[], double fC, ConvertDataClass e, sal_Bool bPrefSupport ) : aName( p, strlen( p ), RTL_TEXTENCODING_MS_1252 ) -{ - fConst = fC; - eClass = e; - bPrefixSupport = bPrefSupport; -} - -ConvertData::~ConvertData() -{ -} - - -sal_Int16 ConvertData::GetMatchingLevel( const STRING& rRef ) const -{ - STRING aStr = rRef; - sal_Int32 nLen = rRef.getLength(); - sal_Int32 nIndex = rRef.lastIndexOf( '^' ); - if( nIndex > 0 && nIndex == ( nLen - 2 ) ) - { - const sal_Unicode* p = aStr.getStr(); - aStr = STRING( p, nLen - 2 ); - aStr += STRING( p[ nLen - 1 ] ); - } - if( aName.equals( aStr ) ) - return 0; - else - { - const sal_Unicode* p = aStr.getStr(); - - nLen = aStr.getLength(); - bool bPref = IsPrefixSupport(); - bool bOneChar = (bPref && nLen > 1 && (aName == p + 1)); - if (bOneChar || (bPref && nLen > 2 && (aName == p + 2) && - *p == 'd' && *(p+1) == 'a')) - { - sal_Int16 n; - switch( *p ) - { - case 'y': n = -24; break; // yocto - case 'z': n = -21; break; // zepto - case 'a': n = -18; break; - case 'f': n = -15; break; - case 'p': n = -12; break; - case 'n': n = -9; break; - case 'u': n = -6; break; - case 'm': n = -3; break; - case 'c': n = -2; break; - case 'd': - { - if ( bOneChar ) - n = -1; // deci - else - n = 1; // deca - } - break; - case 'e': n = 1; break; - case 'h': n = 2; break; - case 'k': n = 3; break; - case 'M': n = 6; break; - case 'G': n = 9; break; - case 'T': n = 12; break; - case 'P': n = 15; break; - case 'E': n = 18; break; - case 'Z': n = 21; break; // zetta - case 'Y': n = 24; break; // yotta - default: - n = INV_MATCHLEV; - } - -// We could weed some nonsense out, ODFF doesn't say so though. -#if 0 - if (n < 0 && Class() == CDC_Information) - n = INV_MATCHLEV; // milli-bits doesn't make sense -#endif - -//! <HACK> "cm3" is not 10^-2 m^3 but 10^-6 m^3 !!! ------------------ - if( n != INV_MATCHLEV ) - { - sal_Unicode cLast = p[ aStr.getLength() - 1 ]; - if( cLast == '2' ) - n *= 2; - else if( cLast == '3' ) - n *= 3; - } -//! </HACK> ------------------------------------------------------------------- - - return n; - } - else if ( nLen > 2 && ( aName == p + 2 ) && ( Class() == CDC_Information ) ) - { - const sal_Unicode* pStr = aStr.getStr(); - if ( *(pStr + 1) != 'i') - return INV_MATCHLEV; - sal_Int16 n; - switch( *pStr ) - { - case 'k': n = 10; break; - case 'M': n = 20; break; - case 'G': n = 30; break; - case 'T': n = 40; break; - case 'P': n = 50; break; - case 'E': n = 60; break; - case 'Z': n = 70; break; - case 'Y': n = 80; break; - default: - n = INV_MATCHLEV; - } - return n; - } - else - return INV_MATCHLEV; - } -} - - -double ConvertData::Convert( - double f, const ConvertData& r, sal_Int16 nLevFrom, sal_Int16 nLevTo ) const THROWDEF_RTE_IAE -{ - if( Class() != r.Class() ) - THROW_IAE; - - sal_Bool bBinFromLev = ( nLevFrom > 0 && ( nLevFrom % 10 ) == 0 ); - sal_Bool bBinToLev = ( nLevTo > 0 && ( nLevTo % 10 ) == 0 ); - - if ( Class() == CDC_Information && ( bBinFromLev || bBinToLev ) ) - { - if ( bBinFromLev && bBinToLev ) - { - nLevFrom = sal::static_int_cast<sal_Int16>( nLevFrom - nLevTo ); - f *= r.fConst / fConst; - if( nLevFrom ) - f *= pow( 2.0, nLevFrom ); - } - else if ( bBinFromLev ) - f *= ( r.fConst / fConst ) * ( pow( 2.0, nLevFrom ) / pow( 10.0, nLevTo ) ); - else - f *= ( r.fConst / fConst ) * ( pow( 10.0, nLevFrom ) / pow( 2.0, nLevTo ) ); - return f; - } - - nLevFrom = sal::static_int_cast<sal_Int16>( nLevFrom - nLevTo ); // effective level - - f *= r.fConst / fConst; - - if( nLevFrom ) - f = ::rtl::math::pow10Exp( f, nLevFrom ); - - return f; -} - - -double ConvertData::ConvertToBase( double f, sal_Int16 n ) const -{ - return ::rtl::math::pow10Exp( f / fConst, n ); -} - - -double ConvertData::ConvertFromBase( double f, sal_Int16 n ) const -{ - return ::rtl::math::pow10Exp( f * fConst, -n ); -} - - - -ConvertDataLinear::~ConvertDataLinear() -{ -} - -double ConvertDataLinear::Convert( - double f, const ConvertData& r, sal_Int16 nLevFrom, sal_Int16 nLevTo ) const THROWDEF_RTE_IAE -{ - if( Class() != r.Class() ) - THROW_IAE; - return r.ConvertFromBase( ConvertToBase( f, nLevFrom ), nLevTo ); -} - - -double ConvertDataLinear::ConvertToBase( double f, sal_Int16 n ) const -{ - if( n ) - f = ::rtl::math::pow10Exp( f, n ); - - f /= fConst; - f -= fOffs; - - return f; -} - - -double ConvertDataLinear::ConvertFromBase( double f, sal_Int16 n ) const -{ - f += fOffs; - f *= fConst; - - if( n ) - f = ::rtl::math::pow10Exp( f, -n ); - - return f; -} - - - - -ConvertDataList::ConvertDataList( void ) -{ -#define NEWD(str,unit,cl) Append(new ConvertData(str,unit,cl)) -#define NEWDP(str,unit,cl) Append(new ConvertData(str,unit,cl,sal_True)) -#define NEWL(str,unit,offs,cl) Append(new ConvertDataLinear(str,unit,offs,cl)) -#define NEWLP(str,unit,offs,cl) Append(new ConvertDataLinear(str,unit,offs,cl,sal_True)) - - // *** are extra and not standard Excel Analysis Addin! - - // MASS: 1 Gram is... - NEWDP( "g", 1.0000000000000000E00, CDC_Mass ); // Gram - NEWD( "sg", 6.8522050005347800E-05, CDC_Mass ); // Pieces - NEWD( "lbm", 2.2046229146913400E-03, CDC_Mass ); // Pound (commercial weight) - NEWDP( "u", 6.0221370000000000E23, CDC_Mass ); // U (atomic mass) - NEWD( "ozm", 3.5273971800362700E-02, CDC_Mass ); // Ounce (commercial weight) - NEWD( "stone", 1.574730e-04, CDC_Mass ); // *** Stone - NEWD( "ton", 1.102311e-06, CDC_Mass ); // *** Ton - NEWD( "grain", 1.543236E01, CDC_Mass ); // *** Grain - NEWD( "pweight", 7.054792E-01, CDC_Mass ); // *** Pennyweight - NEWD( "hweight", 1.968413E-05, CDC_Mass ); // *** Hundredweight - NEWD( "shweight", 2.204623E-05, CDC_Mass ); // *** Shorthundredweight - NEWD( "brton", 9.842065E-07, CDC_Mass ); // *** Gross Registered Ton - NEWD( "cwt", 2.2046226218487758E-05, CDC_Mass ); // U.S. (short) hundredweight - NEWD( "shweight", 2.2046226218487758E-05, CDC_Mass ); // U.S. (short) hundredweight also - NEWD( "uk_cwt", 1.9684130552221213E-05, CDC_Mass ); // Imperial hundredweight - NEWD( "lcwt", 1.9684130552221213E-05, CDC_Mass ); // Imperial hundredweight also - NEWD( "hweight", 1.9684130552221213E-05, CDC_Mass ); // Imperial hundredweight also - NEWD( "uk_ton", 9.8420652761106063E-07, CDC_Mass ); // Imperial ton - NEWD( "LTON", 9.8420652761106063E-07, CDC_Mass ); // Imperial ton also - - // LENGTH: 1 Meter is... - NEWDP( "m", 1.0000000000000000E00, CDC_Length ); // Meter - NEWD( "mi", 6.2137119223733397E-04, CDC_Length ); // Britsh Mile 6,21371192237333969617434184363e-4 - NEWD( "Nmi", 5.3995680345572354E-04, CDC_Length ); // Nautical Mile 5,39956803455723542116630669546e-4 - NEWD( "in", 3.9370078740157480E01, CDC_Length ); // Inch 39,37007874015748031496062992126 - NEWD( "ft", 3.2808398950131234E00, CDC_Length ); // Foot 3,2808398950131233595800524934383 - NEWD( "yd", 1.0936132983377078E00, CDC_Length ); // Yard 1,0936132983377077865266841644794 - NEWDP( "ang", 1.0000000000000000E10, CDC_Length ); // Angstroem - NEWD( "Pica", 2.8346456692913386E03, CDC_Length ); // Pica (1/72 Inch) 2834,6456692913385826771653543307 - NEWD( "ell", 8.748906E-01, CDC_Length ); // *** Ell - NEWDP( "parsec", 3.240779E-17, CDC_Length ); // *** Parsec - NEWDP( "pc", 3.240779E-17, CDC_Length ); // *** Parsec also - NEWDP( "lightyear", 1.0570234557732930E-16, CDC_Length ); // *** Light Year - NEWDP( "ly", 1.0570234557732930E-16, CDC_Length ); // *** Light Year also - NEWD( "survey_mi", 6.2136994949494949E-04, CDC_Length ); // U.S. survey mile - - // TIME: 1 Second is... - NEWD( "yr", 3.1688087814028950E-08, CDC_Time ); // Year - NEWD( "day", 1.1574074074074074E-05, CDC_Time ); // Day - NEWD( "d", 1.1574074074074074E-05, CDC_Time ); // Day also - NEWD( "hr", 2.7777777777777778E-04, CDC_Time ); // Hour - NEWD( "mn", 1.6666666666666667E-02, CDC_Time ); // Minute - NEWD( "min", 1.6666666666666667E-02, CDC_Time ); // Minute also - NEWDP( "sec", 1.0000000000000000E00, CDC_Time ); // Second - NEWDP( "s", 1.0000000000000000E00, CDC_Time ); // Second also - - // PRESSURE: 1 Pascal is... - NEWDP( "Pa", 1.0000000000000000E00, CDC_Pressure ); // Pascal - NEWDP( "atm", 9.8692329999819300E-06, CDC_Pressure ); // Atmosphere - NEWDP( "at", 9.8692329999819300E-06, CDC_Pressure ); // Atmosphere also - NEWDP( "mmHg", 7.5006170799862700E-03, CDC_Pressure ); // mm Hg (Mercury) - NEWD( "Torr", 7.5006380000000000E-03, CDC_Pressure ); // *** Torr - NEWD( "psi", 1.4503770000000000E-04, CDC_Pressure ); // *** Psi - - // FORCE: 1 Newton is... - NEWDP( "N", 1.0000000000000000E00, CDC_Force ); // Newton - NEWDP( "dyn", 1.0000000000000000E05, CDC_Force ); // Dyn - NEWDP( "dy", 1.0000000000000000E05, CDC_Force ); // Dyn also - NEWD( "lbf", 2.24808923655339E-01, CDC_Force ); // Pound-Force - NEWDP( "pond", 1.019716E02, CDC_Force ); // *** Pond - - // ENERGY: 1 Joule is... - NEWDP( "J", 1.0000000000000000E00, CDC_Energy ); // Joule - NEWDP( "e", 1.0000000000000000E07, CDC_Energy ); // Erg -> http://www.chemie.fu-berlin.de/chemistry/general/si.html - NEWDP( "c", 2.3900624947346700E-01, CDC_Energy ); // Thermodynamical Calorie - NEWDP( "cal", 2.3884619064201700E-01, CDC_Energy ); // Calorie - NEWDP( "eV", 6.2414570000000000E18, CDC_Energy ); // Electronvolt - NEWDP( "ev", 6.2414570000000000E18, CDC_Energy ); // Electronvolt also - NEWD( "HPh", 3.7250611111111111E-07, CDC_Energy ); // Horsepower Hours - NEWD( "hh", 3.7250611111111111E-07, CDC_Energy ); // Horsepower Hours also - NEWDP( "Wh", 2.7777777777777778E-04, CDC_Energy ); // Watt Hours - NEWDP( "wh", 2.7777777777777778E-04, CDC_Energy ); // Watt Hours also - NEWD( "flb", 2.37304222192651E01, CDC_Energy ); // Foot Pound - NEWD( "BTU", 9.4781506734901500E-04, CDC_Energy ); // British Thermal Unit - NEWD( "btu", 9.4781506734901500E-04, CDC_Energy ); // British Thermal Unit also - - // POWER: 1 Watt is... - NEWDP( "W", 1.0000000000000000E00, CDC_Power ); // Watt - NEWDP( "w", 1.0000000000000000E00, CDC_Power ); // Watt also - NEWD( "HP", 1.341022E-03, CDC_Power ); // Horsepower - NEWD( "h", 1.341022E-03, CDC_Power ); // Horsepower also - NEWD( "PS", 1.359622E-03, CDC_Power ); // *** German Pferdestaerke - - // MAGNETISM: 1 Tesla is... - NEWDP( "T", 1.0000000000000000E00, CDC_Magnetism ); // Tesla - NEWDP( "ga", 1.0000000000000000E04, CDC_Magnetism ); // Gauss - - // TEMERATURE: 1 Kelvin is... - NEWL( "C", 1.0000000000000000E00, -2.7315000000000000E02, CDC_Temperature ); // Celsius - NEWL( "cel", 1.0000000000000000E00, -2.7315000000000000E02, CDC_Temperature ); // Celsius also - NEWL( "F", 1.8000000000000000E00, -2.5537222222222222E02, CDC_Temperature ); // Fahrenheit - NEWL( "fah", 1.8000000000000000E00, -2.5537222222222222E02, CDC_Temperature ); // Fahrenheit also - NEWLP( "K", 1.0000000000000000E00, +0.0000000000000000E00, CDC_Temperature ); // Kelvin - NEWLP( "kel", 1.0000000000000000E00, +0.0000000000000000E00, CDC_Temperature ); // Kelvin also - NEWL( "Reau", 8.0000000000000000E-01, -2.7315000000000000E02, CDC_Temperature ); // *** Reaumur - NEWL( "Rank", 1.8000000000000000E00, +0.0000000000000000E00, CDC_Temperature ); // *** Rankine - - // VOLUMNE: 1 Liter is... - NEWD( "tsp", 2.0288413621105798E02, CDC_Volume ); // US teaspoon 1/768 gallon - NEWD( "tbs", 6.7628045403685994E01, CDC_Volume ); // US tablespoon 1/256 gallon - NEWD( "oz", 3.3814022701842997E01, CDC_Volume ); // Ounce Liquid 1/128 gallon - NEWD( "cup", 4.2267528377303746E00, CDC_Volume ); // Cup 1/16 gallon - NEWD( "pt", 2.1133764188651873E00, CDC_Volume ); // US Pint 1/8 gallon - NEWD( "us_pt", 2.1133764188651873E00, CDC_Volume ); // US Pint also - NEWD( "uk_pt", 1.7597539863927023E00, CDC_Volume ); // UK Pint 1/8 imperial gallon - NEWD( "qt", 1.0566882094325937E00, CDC_Volume ); // Quart 1/4 gallon - NEWD( "gal", 2.6417205235814842E-01, CDC_Volume ); // Gallon 1/3.785411784 - NEWDP( "l", 1.0000000000000000E00, CDC_Volume ); // Liter - NEWDP( "L", 1.0000000000000000E00, CDC_Volume ); // Liter also - NEWDP( "lt", 1.0000000000000000E00, CDC_Volume ); // Liter also - NEWDP( "m3", 1.0000000000000000E-03, CDC_Volume ); // *** Cubic Meter - NEWD( "mi3", 2.3991275857892772E-13, CDC_Volume ); // *** Cubic Britsh Mile - NEWD( "Nmi3", 1.5742621468581148E-13, CDC_Volume ); // *** Cubic Nautical Mile - NEWD( "in3", 6.1023744094732284E01, CDC_Volume ); // *** Cubic Inch - NEWD( "ft3", 3.5314666721488590E-02, CDC_Volume ); // *** Cubic Foot - NEWD( "yd3", 1.3079506193143922E-03, CDC_Volume ); // *** Cubic Yard - NEWDP( "ang3", 1.0000000000000000E27, CDC_Volume ); // *** Cubic Angstroem - NEWD( "Pica3", 2.2776990435870636E07, CDC_Volume ); // *** Cubic Pica - NEWD( "barrel", 6.2898107704321051E-03, CDC_Volume ); // *** Barrel (=42gal) - NEWD( "bushel", 2.837759E-02, CDC_Volume ); // *** Bushel - NEWD( "regton", 3.531467E-04, CDC_Volume ); // *** Register ton - NEWD( "GRT", 3.531467E-04, CDC_Volume ); // *** Register ton also - NEWD( "Schooner", 2.3529411764705882E00, CDC_Volume ); // *** austr. Schooner - NEWD( "Middy", 3.5087719298245614E00, CDC_Volume ); // *** austr. Middy - NEWD( "Glass", 5.0000000000000000E00, CDC_Volume ); // *** austr. Glass - NEWD( "Sixpack", 0.5, CDC_Volume ); // *** - NEWD( "Humpen", 2.0, CDC_Volume ); // *** - NEWD( "ly3", 1.1810108125623799E-51, CDC_Volume ); // *** Cubic light-year - NEWD( "MTON", 1.4125866688595436E00, CDC_Volume ); // *** Measurement ton - NEWD( "tspm", 5.0000000000000000E02, CDC_Volume ); // *** Modern teaspoon - NEWD( "uk_gal", 2.1996924829908779E-01, CDC_Volume ); // U.K. / Imperial gallon 1/4.54609 - NEWD( "uk_qt", 8.7987699319635115E-01, CDC_Volume ); // U.K. / Imperial quart 1/4 imperial gallon - - // 1 Square Meter is... - NEWDP( "m2", 1.0000000000000000E00, CDC_Area ); // *** Square Meter - NEWD( "mi2", 3.8610215854244585E-07, CDC_Area ); // *** Square Britsh Mile - NEWD( "Nmi2", 2.9155334959812286E-07, CDC_Area ); // *** Square Nautical Mile - NEWD( "in2", 1.5500031000062000E03, CDC_Area ); // *** Square Inch - NEWD( "ft2", 1.0763910416709722E01, CDC_Area ); // *** Square Foot - NEWD( "yd2", 1.1959900463010803E00, CDC_Area ); // *** Square Yard - NEWDP( "ang2", 1.0000000000000000E20, CDC_Area ); // *** Square Angstroem - NEWD( "Pica2", 8.0352160704321409E06, CDC_Area ); // *** Square Pica - NEWD( "Morgen", 4.0000000000000000E-04, CDC_Area ); // *** Morgen - NEWDP( "ar", 1.000000E-02, CDC_Area ); // *** Ar - NEWD( "acre", 2.471053815E-04, CDC_Area ); // *** Acre - NEWD( "uk_acre", 2.4710538146716534E-04, CDC_Area ); // *** International acre - NEWD( "us_acre", 2.4710439304662790E-04, CDC_Area ); // *** U.S. survey/statute acre - NEWD( "ly2", 1.1172985860549147E-32, CDC_Area ); // *** Square Light-year - NEWD( "ha", 1.000000E-04, CDC_Area ); // *** Hectare - NEWD( "Quadratlatschen",5.6689342403628117914,CDC_Area ); // *** - - // SPEED: 1 Meter per Second is... - NEWDP( "m/s", 1.0000000000000000E00, CDC_Speed ); // *** Meters per Second - NEWDP( "m/sec", 1.0000000000000000E00, CDC_Speed ); // *** Meters per Second also - NEWDP( "m/h", 3.6000000000000000E03, CDC_Speed ); // *** Meters per Hour - NEWDP( "m/hr", 3.6000000000000000E03, CDC_Speed ); // *** Meters per Hour also - NEWD( "mph", 2.2369362920544023E00, CDC_Speed ); // *** Britsh Miles per Hour - NEWD( "kn", 1.9438444924406048E00, CDC_Speed ); // *** Knot = Nautical Miles per Hour - NEWD( "admkn", 1.9438446603753486E00, CDC_Speed ); // *** Admiralty Knot - NEWD( "wahnsinnige Geschwindigkeit", 2.0494886343432328E-14, CDC_Speed ); // *** - NEWD( "ludicrous speed", 2.0494886343432328E-14, CDC_Speed ); // *** - NEWD( "laecherliche Geschwindigkeit", 4.0156958471424288E-06, CDC_Speed); // *** - NEWD( "ridiculous speed", 4.0156958471424288E-06, CDC_Speed); // *** - - // INFORMATION: 1 Bit is... - NEWDP( "bit", 1.00E00, CDC_Information); // *** Bit - NEWDP( "byte", 1.25E-01, CDC_Information); // *** Byte -} - - -ConvertDataList::~ConvertDataList() -{ - for( ConvertData* p = First() ; p ; p = Next() ) - delete p; -} - - -double ConvertDataList::Convert( double fVal, const STRING& rFrom, const STRING& rTo ) THROWDEF_RTE_IAE -{ - ConvertData* pFrom = NULL; - ConvertData* pTo = NULL; - sal_Bool bSearchFrom = sal_True; - sal_Bool bSearchTo = sal_True; - sal_Int16 nLevelFrom = 0; - sal_Int16 nLevelTo = 0; - - ConvertData* p = First(); - while( p && ( bSearchFrom || bSearchTo ) ) - { - if( bSearchFrom ) - { - sal_Int16 n = p->GetMatchingLevel( rFrom ); - if( n != INV_MATCHLEV ) - { - if( n ) - { // only first match for partial equality rulz a little bit more - pFrom = p; - nLevelFrom = n; - } - else - { // ... but exact match rulz most - pFrom = p; - bSearchFrom = sal_False; - nLevelFrom = n; - } - } - } - - if( bSearchTo ) - { - sal_Int16 n = p->GetMatchingLevel( rTo ); - if( n != INV_MATCHLEV ) - { - if( n ) - { // only first match for partial equality rulz a little bit more - pTo = p; - nLevelTo = n; - } - else - { // ... but exact match rulz most - pTo = p; - bSearchTo = sal_False; - nLevelTo = n; - } - } - } - - p = Next(); - } - - if( pFrom && pTo ) - return pFrom->Convert( fVal, *pTo, nLevelFrom, nLevelTo ); - else - THROW_IAE; -} - - - -//----------------------------------------------------------------------------- - -ScaDate::ScaDate() : - nOrigDay( 1 ), - nDay( 1 ), - nMonth( 1 ), - nYear( 1900 ), - bLastDayMode( sal_True ), - bLastDay( sal_False ), - b30Days( sal_False ), - bUSMode( sal_False ) -{ -} - -ScaDate::ScaDate( sal_Int32 nNullDate, sal_Int32 nDate, sal_Int32 nBase ) -{ - DaysToDate( nNullDate + nDate, nOrigDay, nMonth, nYear ); - bLastDayMode = (nBase != 5); - bLastDay = (nOrigDay >= ::DaysInMonth( nMonth, nYear )); - b30Days = (nBase == 0) || (nBase == 4); - bUSMode = (nBase == 0); - setDay(); -} - -ScaDate::ScaDate( const ScaDate& rCopy ) : - nOrigDay( rCopy.nOrigDay ), - nDay( rCopy.nDay ), - nMonth( rCopy.nMonth ), - nYear( rCopy.nYear ), - bLastDayMode( rCopy.bLastDayMode ), - bLastDay( rCopy.bLastDay ), - b30Days( rCopy.b30Days ), - bUSMode( rCopy.bUSMode ) -{ -} - -ScaDate& ScaDate::operator=( const ScaDate& rCopy ) -{ - if( this != &rCopy ) - { - nOrigDay = rCopy.nOrigDay; - nDay = rCopy.nDay; - nMonth = rCopy.nMonth; - nYear = rCopy.nYear; - bLastDayMode = rCopy.bLastDayMode; - bLastDay = rCopy.bLastDay; - b30Days = rCopy.b30Days; - bUSMode = rCopy.bUSMode; - } - return *this; -} - -void ScaDate::setDay() -{ - if( b30Days ) - { - // 30-days-mode: set nDay to 30 if original was last day in month - nDay = Min( nOrigDay, static_cast< sal_uInt16 >( 30 ) ); - if( bLastDay || (nDay >= ::DaysInMonth( nMonth, nYear )) ) - nDay = 30; - } - else - { - // set nDay to last day in this month if original was last day - sal_uInt16 nLastDay = ::DaysInMonth( nMonth, nYear ); - nDay = bLastDay ? nLastDay : Min( nOrigDay, nLastDay ); - } -} - -sal_Int32 ScaDate::getDaysInMonthRange( sal_uInt16 nFrom, sal_uInt16 nTo ) const -{ - if( nFrom > nTo ) - return 0; - - sal_Int32 nRet = 0; - if( b30Days ) - nRet = (nTo - nFrom + 1) * 30; - else - { - for( sal_uInt16 nMonthIx = nFrom; nMonthIx <= nTo; ++nMonthIx ) - nRet += getDaysInMonth( nMonthIx ); - } - return nRet; -} - -sal_Int32 ScaDate::getDaysInYearRange( sal_uInt16 nFrom, sal_uInt16 nTo ) const -{ - if( nFrom > nTo ) - return 0; - - return b30Days ? ((nTo - nFrom + 1) * 360) : ::GetDaysInYears( nFrom, nTo ); -} - -void ScaDate::doAddYears( sal_Int32 nYearCount ) throw( lang::IllegalArgumentException ) -{ - sal_Int32 nNewYear = nYearCount + nYear; - if( (nNewYear < 0) || (nNewYear > 0x7FFF) ) - throw lang::IllegalArgumentException(); - nYear = static_cast< sal_uInt16 >( nNewYear ); -} - -void ScaDate::addMonths( sal_Int32 nMonthCount ) throw( lang::IllegalArgumentException ) -{ - sal_Int32 nNewMonth = nMonthCount + nMonth; - if( nNewMonth > 12 ) - { - --nNewMonth; - doAddYears( nNewMonth / 12 ); - nMonth = static_cast< sal_uInt16 >( nNewMonth % 12 ) + 1; - } - else if( nNewMonth < 1 ) - { - doAddYears( nNewMonth / 12 - 1 ); - nMonth = static_cast< sal_uInt16 >( nNewMonth % 12 + 12 ); - } - else - nMonth = static_cast< sal_uInt16 >( nNewMonth ); - setDay(); -} - -sal_Int32 ScaDate::getDate( sal_Int32 nNullDate ) const -{ - sal_uInt16 nLastDay = ::DaysInMonth( nMonth, nYear ); - sal_uInt16 nRealDay = (bLastDayMode && bLastDay) ? nLastDay : Min( nLastDay, nOrigDay ); - return ::DateToDays( nRealDay, nMonth, nYear ) - nNullDate; -} - -sal_Int32 ScaDate::getDiff( const ScaDate& rFrom, const ScaDate& rTo ) throw( lang::IllegalArgumentException ) -{ - if( rFrom > rTo ) - return getDiff( rTo, rFrom ); - - sal_Int32 nDiff = 0; - ScaDate aFrom( rFrom ); - ScaDate aTo( rTo ); - - if( rTo.b30Days ) - { - // corrections for base 0 (US NASD) - if( rTo.bUSMode ) - { - if( ((rFrom.nMonth == 2) || (rFrom.nDay < 30)) && (aTo.nOrigDay == 31) ) - aTo.nDay = 31; - else if( (aTo.nMonth == 2) && aTo.bLastDay ) - aTo.nDay = ::DaysInMonth( 2, aTo.nYear ); - } - // corrections for base 4 (Europe) - else - { - if( (aFrom.nMonth == 2) && (aFrom.nDay == 30) ) - aFrom.nDay = ::DaysInMonth( 2, aFrom.nYear ); - if( (aTo.nMonth == 2) && (aTo.nDay == 30) ) - aTo.nDay = ::DaysInMonth( 2, aTo.nYear ); - } - } - - if( (aFrom.nYear < aTo.nYear) || ((aFrom.nYear == aTo.nYear) && (aFrom.nMonth < aTo.nMonth)) ) - { - // move aFrom to 1st day of next month - nDiff = aFrom.getDaysInMonth() - aFrom.nDay + 1; - aFrom.nOrigDay = aFrom.nDay = 1; - aFrom.bLastDay = sal_False; - aFrom.addMonths( 1 ); - - if( aFrom.nYear < aTo.nYear ) - { - // move aFrom to 1st day of next year - nDiff += aFrom.getDaysInMonthRange( aFrom.nMonth, 12 ); - aFrom.addMonths( 13 - aFrom.nMonth ); - - // move aFrom to 1st day of this year - nDiff += aFrom.getDaysInYearRange( aFrom.nYear, aTo.nYear - 1 ); - aFrom.addYears( aTo.nYear - aFrom.nYear ); - } - - // move aFrom to 1st day of this month - nDiff += aFrom.getDaysInMonthRange( aFrom.nMonth, aTo.nMonth - 1 ); - aFrom.addMonths( aTo.nMonth - aFrom.nMonth ); - } - // finally add remaining days in this month - nDiff += aTo.nDay - aFrom.nDay; - return nDiff > 0 ? nDiff : 0; -} - -sal_Bool ScaDate::operator<( const ScaDate& rCmp ) const -{ - if( nYear != rCmp.nYear ) - return nYear < rCmp.nYear; - if( nMonth != rCmp.nMonth ) - return nMonth < rCmp.nMonth; - if( nDay != rCmp.nDay ) - return nDay < rCmp.nDay; - if( bLastDay || rCmp.bLastDay ) - return !bLastDay && rCmp.bLastDay; - return nOrigDay < rCmp.nOrigDay; -} - - - -//----------------------------------------------------------------------------- - -ScaAnyConverter::ScaAnyConverter( const uno::Reference< lang::XMultiServiceFactory >& xServiceFact ) : - bHasValidFormat( sal_False ) -{ - if( xServiceFact.is() ) - { - uno::Reference< uno::XInterface > xInstance = xServiceFact->createInstance( - OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.NumberFormatter" )) ); - xFormatter = uno::Reference< util::XNumberFormatter >( xInstance, uno::UNO_QUERY ); - } -} - -ScaAnyConverter::~ScaAnyConverter() -{ -} - -void ScaAnyConverter::init( const uno::Reference< beans::XPropertySet >& xPropSet ) throw( uno::RuntimeException ) -{ - // try to get default number format - bHasValidFormat = sal_False; - if( xFormatter.is() ) - { - // get XFormatsSupplier from outer XPropertySet - uno::Reference< util::XNumberFormatsSupplier > xFormatsSupp( xPropSet, uno::UNO_QUERY ); - if( xFormatsSupp.is() ) - { - // get XNumberFormatTypes from XNumberFormatsSupplier to get standard index - uno::Reference< util::XNumberFormats > xFormats( xFormatsSupp->getNumberFormats() ); - uno::Reference< util::XNumberFormatTypes > xFormatTypes( xFormats, uno::UNO_QUERY ); - if( xFormatTypes.is() ) - { - lang::Locale eLocale; - nDefaultFormat = xFormatTypes->getStandardIndex( eLocale ); - xFormatter->attachNumberFormatsSupplier( xFormatsSupp ); - bHasValidFormat = sal_True; - } - } - } -} - -double ScaAnyConverter::convertToDouble( const OUString& rString ) const throw( lang::IllegalArgumentException ) -{ - double fValue = 0.0; - if( bHasValidFormat ) - { - try - { - fValue = xFormatter->convertStringToNumber( nDefaultFormat, rString ); - } - catch( uno::Exception& ) - { - throw lang::IllegalArgumentException(); - } - } - else - { - rtl_math_ConversionStatus eStatus; - sal_Int32 nEnd; - fValue = ::rtl::math::stringToDouble( rString, '.', ',', &eStatus, &nEnd ); - if( (eStatus != rtl_math_ConversionStatus_Ok) || (nEnd < rString.getLength()) ) - throw lang::IllegalArgumentException(); - } - return fValue; -} - -sal_Bool ScaAnyConverter::getDouble( - double& rfResult, - const uno::Any& rAny ) const throw( lang::IllegalArgumentException ) -{ - rfResult = 0.0; - sal_Bool bContainsVal = sal_True; - switch( rAny.getValueTypeClass() ) - { - case uno::TypeClass_VOID: - bContainsVal = sal_False; - break; - case uno::TypeClass_DOUBLE: - rAny >>= rfResult; - break; - case uno::TypeClass_STRING: - { - const OUString* pString = static_cast< const OUString* >( rAny.getValue() ); - if( pString->getLength() ) - rfResult = convertToDouble( *pString ); - else - bContainsVal = sal_False; - } - break; - default: - throw lang::IllegalArgumentException(); - } - return bContainsVal; -} - -sal_Bool ScaAnyConverter::getDouble( - double& rfResult, - const uno::Reference< beans::XPropertySet >& xPropSet, - const uno::Any& rAny ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - init( xPropSet ); - return getDouble( rfResult, rAny ); -} - -double ScaAnyConverter::getDouble( - const uno::Reference< beans::XPropertySet >& xPropSet, - const uno::Any& rAny, - double fDefault ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - double fResult; - if( !getDouble( fResult, xPropSet, rAny ) ) - fResult = fDefault; - return fResult; -} - -sal_Bool ScaAnyConverter::getInt32( - sal_Int32& rnResult, - const uno::Reference< beans::XPropertySet >& xPropSet, - const uno::Any& rAny ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - double fResult; - sal_Bool bContainsVal = getDouble( fResult, xPropSet, rAny ); - if( (fResult <= -2147483649.0) || (fResult >= 2147483648.0) ) - throw lang::IllegalArgumentException(); - - rnResult = static_cast< sal_Int32 >( fResult ); - return bContainsVal; -} - -sal_Int32 ScaAnyConverter::getInt32( - const uno::Reference< beans::XPropertySet >& xPropSet, - const uno::Any& rAny, - sal_Int32 nDefault ) throw( uno::RuntimeException, lang::IllegalArgumentException ) -{ - sal_Int32 nResult; - if( !getInt32( nResult, xPropSet, rAny ) ) - nResult = nDefault; - return nResult; -} - - - -//----------------------------------------------------------------------------- - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |