20#include <config_features.h>
23#include <config_version.h>
27#include <rtl/math.hxx>
39#include <osl/file.hxx>
59#include <com/sun/star/uno/Sequence.hxx>
60#include <com/sun/star/lang/XMultiServiceFactory.hpp>
61#include <com/sun/star/i18n/LocaleCalendar2.hpp>
62#include <com/sun/star/sheet/XFunctionAccess.hpp>
64#include <officecfg/Office/Scripting.hxx>
77 static css::lang::Locale aLastLocale;
78 static bool bNeedsReload =
true;
81 bNeedsReload = bNeedsReload ||
82 ( aLocale.Language != aLastLocale.Language ||
83 aLocale.Country != aLastLocale.Country ||
84 aLocale.Variant != aLastLocale.Variant );
88 aLastLocale = aLocale;
89 xCalendar->loadDefaultCalendar( aLocale );
94#if HAVE_FEATURE_SCRIPTING
98 const sal_Int16 vbGet = 2;
99 const sal_Int16 vbLet = 4;
100 const sal_Int16 vbMethod = 1;
101 const sal_Int16 vbSet = 8;
104 sal_uInt32 nParCount = rPar.
Count();
115 pObj =
dynamic_cast<SbxObject*
>( pObjVar );
117 if (
auto pSbxVar =
dynamic_cast<const SbxVariable*
>( pObjVar))
118 pObj =
dynamic_cast<SbxObject*
>( pSbxVar->GetObject() );
133 if( pFindVar ==
nullptr )
145 pFindVar->
Get( aVals );
148 refVar->Put( aVals );
154 if ( nParCount != 5 )
160 if( nCallType == vbLet )
164 pValVar->Get( aVals );
165 pFindVar->
Put( aVals );
182 if( pMeth ==
nullptr )
190 sal_uInt32 nMethParamCount = nParCount - 4;
191 if( nMethParamCount > 0 )
194 for( sal_uInt32 i = 0 ;
i < nMethParamCount ;
i++ )
197 xArray->Put(pPar, i + 1);
217 if (rPar.
Count() == 2)
220 bVal = pSbxVariable->
GetBool();
232 if (rPar.
Count() == 2)
235 nByte = pSbxVariable->
GetByte();
247 if (rPar.
Count() == 2)
263 if (rPar.
Count() == 2)
282 if (rPar.
Count() == 2)
285 nVal = pSbxVariable->
GetDate();
297 if (rPar.
Count() == 2)
305 if( Error != ERRCODE_NONE )
326 if (rPar.
Count() == 2)
341 if (rPar.
Count() != 2)
345 nVal = pSbxVariable->
GetLong();
351 float nVal = float(0.0);
352 if (rPar.
Count() == 2)
365 nVal =
static_cast<float>(dVal);
381 if (rPar.
Count() != 2)
392 if (rPar.
Count() == 2)
395 pSbxVariable->
Get( aVals );
406 if (rPar.
Count() != 2)
410 sal_Int16 nErrCode = pSbxVariable->
GetInteger();
416 if (rPar.
Count() != 4)
421 *rPar.
Get(0) = *rPar.
Get(2);
425 *rPar.
Get(0) = *rPar.
Get(3);
432 if (rPar.
Count() != 1)
441 if (rPar.
Count() != 1)
456 if (rPar.
Count() != 2)
468 if (rPar.
Count() != 2)
480 if (rPar.
Count() != 2)
496 if( !(nCount & 0x0001 ))
501 sal_uInt32 nCurExpr = 1;
502 while( nCurExpr < (nCount-1) )
506 (*rPar.
Get(0)) = *(rPar.
Get(nCurExpr + 1));
518 if (rPar.
Count() != 2)
522 if ( bDurationBased )
526 double dSecs = ( dWait - dNow ) * 24.0 * 3600.0;
537 Timer aTimer(
"basic Wait_Impl");
538 aTimer.SetTimeout( nWait );
571 if (rPar.
Count() != 1)
580 if (rPar.
Count() < 2)
587 if( nCount == 1 || nIndex > sal::static_int_cast<sal_Int16>(nCount-1) || nIndex < 1 )
592 (*rPar.
Get(0)) = *(rPar.
Get(nIndex + 1));
598 if (rPar.
Count() < 2)
611 rPar.
Get(0)->
PutLong(LIBO_VERSION_MAJOR * 10000 + LIBO_VERSION_MINOR * 100
612 + LIBO_VERSION_MICRO * 1);
617 sal_Int32 nResult = 0;
624 nResult = aSize.Width() / 100;
631 sal_Int32 nResult = 0;
638 nResult = aSize.Height() / 100;
646 if (rPar.
Count() != 2)
654 bool bResult =
false;
669 sal_uInt32 nArraySize = rPar.
Count() - 1;
675 pArray->
AddDim(1, sal::static_int_cast<sal_Int32>(nArraySize));
679 pArray->
AddDim(0, sal::static_int_cast<sal_Int32>(nArraySize) - 1);
688 for( sal_uInt32 i = 0 ;
i < nArraySize ;
i++ )
694 aIdx[0] =
static_cast<sal_Int32
>(
i);
699 pArray->
Put(pNew, aIdx);
706 refVar->PutObject( pArray );
707 refVar->SetFlags( nFlags );
708 refVar->SetParameters(
nullptr );
722 sal_uInt32 nArrayDims = rPar.
Count() - 1;
725 for( sal_uInt32 i = 0;
i < nArrayDims ;
i++ )
743 refVar->PutObject( pArray );
744 refVar->SetFlags( nFlags );
745 refVar->SetParameters(
nullptr );
774 if (rPar.
Count() < 2)
784 pFindObj =
dynamic_cast<SbxObject*
>( pFind );
787 refVar->PutObject( pFindObj );
795 if (rPar.
Count() < 3)
803 pObj =
dynamic_cast<SbxObject*
>( pObjVar );
806 if (
auto pSbxVar =
dynamic_cast<const SbxVariable*
>( pObjVar))
807 pObj =
dynamic_cast<SbxObject*
>( pSbxVar->GetObject() );
815 pFindObj =
dynamic_cast<SbxObject*
>( pFindVar );
823 refVar->PutObject( pFindObj );
828 bool bBinary,
short nBlockLen,
bool bIsArray )
830 sal_uInt64
const nFPos = pStrm->
Tell();
832 bool bIsVariant = !rVar.
IsFixed();
899 if( !bBinary || bIsArray )
924 pStrm->
Seek( nFPos + nBlockLen );
930 bool bBinary,
short nBlockLen )
934 sal_uInt64
const nFPos = pStrm->
Tell();
936 bool bIsVariant = !rVar.
IsFixed();
991 rVar.
PutInt64(
static_cast<sal_Int64
>(aInt) );
1032 pStrm->
Seek( nFPos + nBlockLen );
1040 bool bBinary, sal_Int32 nCurDim, sal_Int32* pOtherDims,
bool bWrite )
1043 sal_Int32 nLower, nUpper;
1044 if (!rArr.
GetDim(nCurDim, nLower, nUpper))
1046 for(sal_Int32 nCur = nLower; nCur <= nUpper; nCur++ )
1048 pOtherDims[ nCurDim-1 ] = nCur;
1050 lcl_WriteReadSbxArray(rArr, pStrm, bBinary, nCurDim-1, pOtherDims, bWrite);
1056 bRet = lcl_WriteSbxVariable(*pVar, pStrm, bBinary, 0,
true );
1058 bRet = lcl_ReadSbxVariable(*pVar, pStrm, bBinary, 0 );
1066static void PutGet(
SbxArray& rPar,
bool bPut )
1068 if (rPar.
Count() != 4)
1076 if ( nFileNo < 1 || ( bHasRecordNo && nRecordNo < 1 ) )
1089 bool bRandom = pSbStrm->
IsRandom();
1090 short nBlockLen = bRandom ? pSbStrm->
GetBlockLen() : 0;
1099 sal_uInt64
const nFilePos = bRandom
1100 ?
static_cast<sal_uInt64
>(nBlockLen * nRecordNo)
1101 :
static_cast<sal_uInt64
>(nRecordNo);
1102 pStrm->
Seek( nFilePos );
1117 sal_uInt64
const nFPos = pStrm->
Tell();
1118 sal_Int32 nDims = pArr->
GetDims();
1119 std::unique_ptr<sal_Int32[]> pDims(
new sal_Int32[ nDims ]);
1120 bRet = lcl_WriteReadSbxArray(*pArr,pStrm,!bRandom,nDims,pDims.get(),bPut);
1123 pStrm->
Seek( nFPos + nBlockLen );
1128 bRet = lcl_WriteSbxVariable(*pVar, pStrm, !bRandom, nBlockLen,
false);
1130 bRet = lcl_ReadSbxVariable(*pVar, pStrm, !bRandom, nBlockLen);
1138 PutGet( rPar,
true );
1143 PutGet( rPar,
false );
1148 if (rPar.
Count() != 2)
1154 osl_getThreadTextEncoding()));
1155 const char* pEnvStr = getenv(aByteStr.getStr());
1158 aResult = OUString(pEnvStr, strlen(pEnvStr), osl_getThreadTextEncoding());
1163static double GetDialogZoomFactor(
bool bX,
tools::Long nValue )
1169 Size aRefSize( nValue, nValue );
1176 double nRef, nScaled;
1179 nRef = aRefSize.Width();
1180 nScaled = aScaledSize.
Width();
1184 nRef = aRefSize.Height();
1185 nScaled = aScaledSize.
Height();
1187 nResult = nScaled /
nRef;
1195 if (rPar.
Count() != 2)
1202 if (rPar.
Count() != 2)
1212 if (rPar.
Count() != 2)
1220 if (rPar.
Count() != 1)
1228 if (rPar.
Count() != 1)
1236 if (rPar.
Count() != 2)
1245 if (rPar.
Count() != 2)
1304 nLen =
static_cast<sal_Int16
>(rPar.
Get(1)->
GetOUString().getLength());
1381 while(
p->GetParent() )
1386 refVar->PutObject( p );
1392 if (rPar.
Count() != 2)
1398 if( aFileURL.isEmpty() )
1400 osl::File::getFileURLFromSystemPath(aStr, aFileURL);
1402 if( aFileURL.isEmpty() )
1412 if (rPar.
Count() != 2)
1417 ::osl::File::getSystemPathFromFileURL( aStr, aSysPath );
1418 if( aSysPath.isEmpty() )
1434 sal_uInt32 nParCount = rPar.
Count();
1435 if ( nParCount != 3 && nParCount != 2 )
1447 if( nParCount == 3 )
1455 OUStringBuffer aRetStr(32);
1456 sal_Int32 nLower, nUpper;
1457 pArr->
GetDim(1, nLower, nUpper);
1459 for (aIdx[0] = nLower; aIdx[0] <= nUpper; ++aIdx[0])
1462 aRetStr.append(aStr);
1463 if (aIdx[0] != nUpper)
1465 aRetStr.append(aDelim);
1475 sal_uInt32 nParCount = rPar.
Count();
1476 if ( nParCount < 2 )
1483 sal_Int32 nArraySize = 0;
1484 std::vector< OUString > vRet;
1485 if( !aExpression.isEmpty() )
1488 if( nParCount >= 3 )
1498 if( nParCount == 4 )
1502 sal_Int32 nDelimLen = aDelim.getLength();
1505 sal_Int32 iSearch = -1;
1506 sal_Int32 iStart = 0;
1509 bool bBreak =
false;
1510 if( nCount >= 0 && nArraySize == nCount - 1 )
1514 iSearch = aExpression.indexOf( aDelim, iStart );
1516 if( iSearch >= 0 && !bBreak )
1518 aSubStr = aExpression.copy( iStart, iSearch - iStart );
1519 iStart = iSearch + nDelimLen;
1523 aSubStr = aExpression.copy( iStart );
1525 vRet.push_back( aSubStr );
1533 while( iSearch >= 0 );
1537 vRet.push_back( aExpression );
1548 for(sal_Int32 i = 0 ;
i < nArraySize ;
i++ )
1552 xVar->PutString( vRet[i] );
1558 pArray->
Put(xVar.
get(), &i);
1565 refVar->PutObject( pArray );
1566 refVar->SetFlags( nFlags );
1567 refVar->SetParameters(
nullptr );
1573 sal_uInt32 nParCount = rPar.
Count();
1574 if( nParCount != 2 && nParCount != 3 )
1581 if( !xCalendar.is() )
1587 sal_Int32 nMonthCount = aMonthSeq.getLength();
1590 if( nVal < 1 || nVal > nMonthCount )
1596 bool bAbbreviate =
false;
1597 if( nParCount == 3 )
1600 const CalendarItem2* pCalendarItems = aMonthSeq.getConstArray();
1601 const CalendarItem2& rItem = pCalendarItems[nVal - 1];
1603 OUString aRetStr = ( bAbbreviate ? rItem.AbbrevName : rItem.FullName );
1610 sal_uInt32 nParCount = rPar.
Count();
1611 if( nParCount < 2 || nParCount > 4 )
1618 if( !xCalendar.is() )
1625 sal_Int16 nDayCount =
static_cast<sal_Int16
>(aDaySeq.getLength());
1627 sal_Int16 nFirstDay = 0;
1628 if( nParCount == 4 )
1631 if( nFirstDay < 0 || nFirstDay > 7 )
1637 if( nFirstDay == 0 )
1639 nFirstDay = sal_Int16( xCalendar->getFirstDayOfWeek() + 1 );
1641 nDay = 1 + (nDay + nDayCount + nFirstDay - 2) % nDayCount;
1642 if( nDay < 1 || nDay > nDayCount )
1648 bool bAbbreviate =
false;
1649 if( nParCount >= 3 )
1652 if( !pPar2->
IsErr() )
1654 bAbbreviate = pPar2->
GetBool();
1658 const CalendarItem2* pCalendarItems = aDaySeq.getConstArray();
1659 const CalendarItem2& rItem = pCalendarItems[nDay - 1];
1661 OUString aRetStr = ( bAbbreviate ? rItem.AbbrevName : rItem.FullName );
1667 sal_uInt32 nParCount = rPar.
Count();
1668 if ( nParCount < 2 )
1676 bool bFirstDay =
false;
1677 sal_Int16 nFirstDay = 0;
1678 if ( nParCount > 2 )
1706 Interval meInterval;
1707 char const * mStringCode;
1714static IntervalInfo
const * getIntervalInfo(
const OUString& rStringCode )
1716 static IntervalInfo
const aIntervalTable[] =
1718 { INTERVAL_YYYY,
"yyyy", 0.0,
false },
1719 { INTERVAL_Q,
"q", 0.0,
false },
1720 { INTERVAL_M,
"m", 0.0,
false },
1721 { INTERVAL_Y,
"y", 1.0,
true },
1722 { INTERVAL_D,
"d", 1.0,
true },
1723 { INTERVAL_W,
"w", 1.0,
true },
1724 { INTERVAL_WW,
"ww", 7.0,
true },
1725 { INTERVAL_H,
"h", 1.0 / 24.0,
true },
1726 { INTERVAL_N,
"n", 1.0 / 1440.0,
true },
1727 { INTERVAL_S,
"s", 1.0 / 86400.0,
true }
1729 auto const pred = [&rStringCode](
const IntervalInfo &aInterval) {
1730 return rStringCode.equalsIgnoreAsciiCaseAscii(aInterval.mStringCode);
1733 auto intervalIter = std::find_if(std::begin(aIntervalTable), std::end(aIntervalTable), pred);
1734 if(intervalIter != std::end(aIntervalTable)) {
1735 return intervalIter;
1740static void implGetDayMonthYear( sal_Int16& rnYear, sal_Int16& rnMonth, sal_Int16& rnDay,
double dDate )
1752static sal_Int16 limitDate( sal_Int32 n32Year, sal_Int16& rMonth, sal_Int16& rDay )
1754 if( n32Year > SAL_MAX_INT16 )
1760 else if( n32Year < SAL_MIN_INT16 )
1766 return static_cast<sal_Int16
>(n32Year);
1771 sal_uInt32 nParCount = rPar.
Count();
1772 if( nParCount != 4 )
1779 IntervalInfo
const * pInfo = getIntervalInfo( aStringCode );
1788 double dNewDate = 0;
1789 if( pInfo->mbSimple )
1791 double dAdd = pInfo->mdValue * lNumber;
1792 dNewDate = dDate + dAdd;
1797 double dHoursMinutesSeconds = dDate - floor( dDate );
1800 sal_Int16 nYear, nMonth, nDay;
1801 sal_Int16 nTargetYear16 = 0, nTargetMonth = 0;
1802 implGetDayMonthYear( nYear, nMonth, nDay, dDate );
1803 switch( pInfo->meInterval )
1807 sal_Int32 nTargetYear = lNumber + nYear;
1808 nTargetYear16 = limitDate( nTargetYear, nMonth, nDay );
1810 nTargetMonth = nMonth;
1817 bool bNeg = (lNumber < 0);
1820 sal_Int32 nYearsAdd;
1821 sal_Int16 nMonthAdd;
1822 if( pInfo->meInterval == INTERVAL_Q )
1824 nYearsAdd = lNumber / 4;
1825 nMonthAdd =
static_cast<sal_Int16
>( 3 * (lNumber % 4) );
1829 nYearsAdd = lNumber / 12;
1830 nMonthAdd =
static_cast<sal_Int16
>( lNumber % 12 );
1833 sal_Int32 nTargetYear;
1836 nTargetMonth = nMonth - nMonthAdd;
1837 if( nTargetMonth <= 0 )
1842 nTargetYear =
static_cast<sal_Int32
>(nYear) - nYearsAdd;
1846 nTargetMonth = nMonth + nMonthAdd;
1847 if( nTargetMonth > 12 )
1852 nTargetYear =
static_cast<sal_Int32
>(nYear) + nYearsAdd;
1854 nTargetYear16 = limitDate( nTargetYear, nTargetMonth, nDay );
1863 dNewDate += dHoursMinutesSeconds;
1869static double RoundImpl(
double d )
1871 return ( d >= 0 ) ? floor( d + 0.5 ) : -floor( -
d + 0.5 );
1878 sal_uInt32 nParCount = rPar.
Count();
1879 if( nParCount < 4 || nParCount > 6 )
1886 IntervalInfo
const * pInfo = getIntervalInfo( aStringCode );
1897 switch( pInfo->meInterval )
1903 dRet = nYear2 - nYear1;
1912 sal_Int16 nQGes1 = 4 * nYear1 + nQ1;
1913 sal_Int16 nQGes2 = 4 * nYear2 + nQ2;
1914 dRet = nQGes2 - nQGes1;
1923 sal_Int16 nMonthGes1 = 12 * nYear1 + nMonth1;
1924 sal_Int16 nMonthGes2 = 12 * nYear2 + nMonth2;
1925 dRet = nMonthGes2 - nMonthGes1;
1931 double dDays1 = floor( dDate1 );
1932 double dDays2 = floor( dDate2 );
1933 dRet = dDays2 - dDays1;
1939 double dDays1 = floor( dDate1 );
1940 double dDays2 = floor( dDate2 );
1941 if( pInfo->meInterval == INTERVAL_WW )
1943 sal_Int16 nFirstDay = 1;
1944 if( nParCount >= 5 )
1947 if( nFirstDay < 0 || nFirstDay > 7 )
1952 if( nFirstDay == 0 )
1955 if( !xCalendar.is() )
1960 nFirstDay = sal_Int16( xCalendar->getFirstDayOfWeek() + 1 );
1964 sal_Int16 nDay1_Diff = nDay1 - nFirstDay;
1965 if( nDay1_Diff < 0 )
1967 dDays1 -= nDay1_Diff;
1970 sal_Int16 nDay2_Diff = nDay2 - nFirstDay;
1971 if( nDay2_Diff < 0 )
1973 dDays2 -= nDay2_Diff;
1976 double dDiff = dDays2 - dDays1;
1977 dRet = ( dDiff >= 0 ) ? floor( dDiff / 7.0 ) : -floor( -dDiff / 7.0 );
1982 dRet = RoundImpl( 24.0 * (dDate2 - dDate1) );
1987 dRet = RoundImpl( 1440.0 * (dDate2 - dDate1) );
1992 dRet = RoundImpl( 86400.0 * (dDate2 - dDate1) );
1999static double implGetDateOfFirstDayInFirstWeek
2000 ( sal_Int16 nYear, sal_Int16& nFirstDay, sal_Int16& nFirstWeek,
bool* pbError =
nullptr )
2003 if( nFirstDay < 0 || nFirstDay > 7 )
2006 if( nFirstWeek < 0 || nFirstWeek > 3 )
2010 if( nFirstDay == 0 || nFirstWeek == 0 )
2013 if( !xCalendar.is() )
2017 if( nError != ERRCODE_NONE )
2025 if( nFirstDay == 0 )
2026 nFirstDay = sal_Int16( xCalendar->getFirstDayOfWeek() + 1 );
2028 sal_Int16 nFirstWeekMinDays = 0;
2029 if( nFirstWeek == 0 )
2031 nFirstWeekMinDays = xCalendar->getMinimumNumberOfDaysForFirstWeek();
2032 if( nFirstWeekMinDays == 1 )
2034 nFirstWeekMinDays = 0;
2037 else if( nFirstWeekMinDays == 4 )
2039 else if( nFirstWeekMinDays == 7 )
2042 else if( nFirstWeek == 2 )
2043 nFirstWeekMinDays = 4;
2044 else if( nFirstWeek == 3 )
2045 nFirstWeekMinDays = 7;
2051 sal_Int16 nDayDiff = nWeekDay0101 - nFirstDay;
2055 if( nFirstWeekMinDays )
2057 sal_Int16 nThisWeeksDaysInYearCount = 7 - nDayDiff;
2058 if( nThisWeeksDaysInYearCount < nFirstWeekMinDays )
2061 double dRetDate = dBaseDate - nDayDiff;
2069 sal_uInt32 nParCount = rPar.
Count();
2070 if( nParCount < 3 || nParCount > 5 )
2077 IntervalInfo
const * pInfo = getIntervalInfo( aStringCode );
2087 switch( pInfo->meInterval )
2109 nRet = 1 + sal_Int32( dDate - dBaseDate );
2119 bool bFirstDay =
false;
2120 sal_Int16 nFirstDay = 1;
2121 if( nParCount >= 4 )
2131 sal_Int16 nFirstDay = 1;
2132 if( nParCount >= 4 )
2135 sal_Int16 nFirstWeek = 1;
2136 if( nParCount == 5 )
2140 bool bError =
false;
2141 double dYearFirstDay = implGetDateOfFirstDayInFirstWeek( nYear, nFirstDay, nFirstWeek, &bError );
2144 if( dYearFirstDay > dDate )
2147 dYearFirstDay = implGetDateOfFirstDayInFirstWeek( nYear - 1, nFirstDay, nFirstWeek );
2149 else if( nFirstWeek != 1 )
2152 double dNextYearFirstDay = implGetDateOfFirstDayInFirstWeek( nYear + 1, nFirstDay, nFirstWeek );
2153 if( dDate >= dNextYearFirstDay )
2154 dYearFirstDay = dNextYearFirstDay;
2158 double dDiff = dDate - dYearFirstDay;
2159 nRet = 1 + sal_Int32( dDiff / 7 );
2185 sal_uInt32 nParCount = rPar.
Count();
2186 if( nParCount < 2 || nParCount > 3 )
2193 sal_Int16 nNamedFormat = 0;
2197 if( nNamedFormat < 0 || nNamedFormat > 4 )
2205 if( !xCalendar.is() )
2213 switch( nNamedFormat )
2223 pSbxVar->PutDate( dDate );
2224 aRetStr = pSbxVar->GetOUString();
2233 std::shared_ptr<SvNumberFormatter> pFormatter;
2245 const sal_uInt32
nIndex = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_LONG, eLangType );
2247 pFormatter->GetOutputString( dDate, nIndex, aRetStr, &pCol );
2255 pSbxVar->PutDate( floor(dDate) );
2256 aRetStr = pSbxVar->GetOUString();
2268 pSbxVar->PutDate( dTime );
2269 if( nNamedFormat == 3 )
2271 aRetStr = pSbxVar->GetOUString();
2275 aRetStr = pSbxVar->GetOUString().copy( 0, 5 );
2285 sal_uInt32 nParCount = rPar.
Count();
2293 double dVal = pSbxVariable->
GetDouble();
2295 rPar.
Get(0)->
PutDouble(dVal - ::rtl::math::approxFloor(dVal));
2297 rPar.
Get(0)->
PutDouble(dVal - ::rtl::math::approxCeil(dVal));
2302 sal_uInt32 nParCount = rPar.
Count();
2303 if( nParCount != 2 && nParCount != 3 )
2310 double dVal = pSbxVariable->
GetDouble();
2314 sal_Int16 numdecimalplaces = 0;
2315 if( nParCount == 3 )
2318 if( numdecimalplaces < 0 || numdecimalplaces > 22 )
2325 dRes = rtl_math_round(dVal, numdecimalplaces, rtl_math_RoundingMode_HalfEven);
2340 xFunc.set(
xFactory->createInstance(
"com.sun.star.sheet.FunctionAccess"), UNO_QUERY_THROW);
2343 Any aRet = xFunc->callFunction( sFuncName, aArgs );
2348 catch(
const Exception& )
2356 sal_uInt32 nArgCount = rPar.
Count() - 1;
2358 if ( nArgCount < 4 )
2374 CallFunctionAccessFunction(aParams,
"SYD", rPar.
Get(0));
2379 sal_uInt32 nArgCount = rPar.
Count() - 1;
2381 if ( nArgCount < 3 )
2396 CallFunctionAccessFunction(aParams,
"SLN", rPar.
Get(0));
2401 sal_uInt32 nArgCount = rPar.
Count() - 1;
2403 if ( nArgCount < 3 || nArgCount > 5 )
2419 if ( nArgCount >= 4 )
2425 if ( nArgCount >= 5 )
2440 CallFunctionAccessFunction(aParams,
"Pmt", rPar.
Get(0));
2445 sal_uInt32 nArgCount = rPar.
Count() - 1;
2447 if ( nArgCount < 4 || nArgCount > 6 )
2464 if ( nArgCount >= 5 )
2470 if ( nArgCount >= 6 )
2486 CallFunctionAccessFunction(aParams,
"PPmt", rPar.
Get(0));
2491 sal_uInt32 nArgCount = rPar.
Count() - 1;
2493 if ( nArgCount < 3 || nArgCount > 5 )
2509 if ( nArgCount >= 4 )
2515 if ( nArgCount >= 5 )
2530 CallFunctionAccessFunction(aParams,
"PV", rPar.
Get(0));
2535 sal_uInt32 nArgCount = rPar.
Count() - 1;
2537 if ( nArgCount < 1 || nArgCount > 2 )
2548 aValues >>= sValues.getArray()[ 0 ];
2549 aValues <<= sValues;
2557 CallFunctionAccessFunction(aParams,
"NPV", rPar.
Get(0));
2562 sal_uInt32 nArgCount = rPar.
Count() - 1;
2564 if ( nArgCount < 3 || nArgCount > 5 )
2580 if ( nArgCount >= 4 )
2586 if ( nArgCount >= 5 )
2601 CallFunctionAccessFunction(aParams,
"NPer", rPar.
Get(0));
2606 sal_uInt32 nArgCount = rPar.
Count() - 1;
2608 if ( nArgCount < 3 )
2621 aValues >>= sValues.getArray()[ 0 ];
2622 aValues <<= sValues;
2631 CallFunctionAccessFunction(aParams,
"MIRR", rPar.
Get(0));
2636 sal_uInt32 nArgCount = rPar.
Count() - 1;
2638 if ( nArgCount < 1 || nArgCount > 2 )
2649 aValues >>= sValues.getArray()[ 0 ];
2650 aValues <<= sValues;
2655 if ( nArgCount >= 2 )
2667 CallFunctionAccessFunction(aParams,
"IRR", rPar.
Get(0));
2672 sal_uInt32 nArgCount = rPar.
Count() - 1;
2674 if ( nArgCount < 4 || nArgCount > 6 )
2691 if ( nArgCount >= 5 )
2697 if ( nArgCount >= 6 )
2713 CallFunctionAccessFunction(aParams,
"IPmt", rPar.
Get(0));
2718 sal_uInt32 nArgCount = rPar.
Count() - 1;
2720 if ( nArgCount < 3 || nArgCount > 5 )
2736 if ( nArgCount >= 4 )
2742 if ( nArgCount >= 5 )
2757 CallFunctionAccessFunction(aParams,
"FV", rPar.
Get(0));
2762 sal_uInt32 nArgCount = rPar.
Count() - 1;
2764 if ( nArgCount < 4 || nArgCount > 5 )
2780 if ( nArgCount >= 5 )
2795 CallFunctionAccessFunction(aParams,
"DDB", rPar.
Get(0));
2800 sal_uInt32 nArgCount = rPar.
Count() - 1;
2802 if ( nArgCount < 3 || nArgCount > 6 )
2823 if ( nArgCount >= 4 )
2830 if ( nArgCount >= 5 )
2837 if ( nArgCount >= 6 )
2853 CallFunctionAccessFunction(aParams,
"Rate", rPar.
Get(0));
2858 if (rPar.
Count() != 2)
2865 if( pSbxVariable->
IsNull() )
2877 bool bEnabled =
false;
2879 if ( nCount != 1 && nCount != 2 )
2897 if (rPar.
Count() < 3)
2914 OString aByteBuffer;
2924 rPar.
Get(0)->
PutString(OStringToOUString(aByteBuffer, osl_getThreadTextEncoding()));
2930 SbClassModuleObject* pClassModuleObject =
dynamic_cast<SbClassModuleObject*
>( pActiveModule );
2932 if( pClassModuleObject ==
nullptr )
2936 refVar->PutObject( pMod );
2941 refVar->PutObject( pClassModuleObject );
2948 static bool bMode = std::getenv(
"LIBREOFFICE6FLOATINGPOINTMODE") !=
nullptr;
2950 return bMode || officecfg::Office::Scripting::Basic::Compatibility::UseLibreOffice6FloatingPointConversion::get();
2955 Date aRefDate(1899'12'30);
2956 sal_Int32 nDays =
static_cast<sal_Int32
>(aDate);
2961 nDay =
static_cast<sal_Int16
>(aDay) + 2;
2966 if( bFirstDayParam )
2968 if( nFirstDay < 0 || nFirstDay > 7 )
2970#if HAVE_FEATURE_SCRIPTING
2975 if( nFirstDay == 0 )
2978 if( !xCalendar.is() )
2980#if HAVE_FEATURE_SCRIPTING
2985 nFirstDay = sal_Int16( xCalendar->getFirstDayOfWeek() + 1 );
2987 nDay = 1 + (nDay + 7 - nFirstDay) % 7;
const LanguageTag & GetLanguageTag() const
static OutputDevice * GetDefaultDevice()
static const AllSettings & GetSettings()
static bool Reschedule(bool bHandleAllCurrentEvents=false)
void AddDays(sal_Int32 nAddDays)
DayOfWeek GetDayOfWeek() const
LanguageType getLanguageType(bool bResolveSystem=true) const
const css::lang::Locale & getLocale(bool bResolveSystem=true) const
SAL_WARN_UNUSED_RESULT Point PixelToLogic(const Point &rDevicePt) const
SAL_WARN_UNUSED_RESULT Point LogicToPixel(const Point &rLogicPt) const
ErrCode Call(SbxValue *pRet, SbxVariable *pCaller=nullptr)
void FreeDll(OUString const &library)
SbiIoSystem * GetIoSystem()
SbModule * GetActiveModule()
bool IsCompatibility() const
static std::shared_ptr< SvNumberFormatter > PrepareNumberFormatter(sal_uInt32 &rnStdDateIdx, sal_uInt32 &rnStdTimeIdx, sal_uInt32 &rnStdDateTimeIdx, LanguageType const *peFormatterLangType=nullptr, DateOrder const *peFormatterDateOrder=nullptr)
std::shared_ptr< SvNumberFormatter > const & GetNumberFormatter()
void EnableReschedule(bool bEnable)
void EnableCompatibility(bool bEnable)
SbiStream * GetStream(short nChannel) const
static bool isVBAEnabled()
sal_uInt16 GetBase() const
void StepSET_Impl(SbxVariableRef &refVal, SbxVariableRef &refVar, bool bDefaultHandling=false)
SbiStreamFlags GetMode() const
short GetBlockLen() const
ErrCode Read(OString &, sal_uInt16=0, bool bForceReadingPerByte=false)
SbxVariable * Get(sal_uInt32)
static ErrCode const & GetError()
void SetFlag(SbxFlagBits n)
bool GetDim(sal_Int32, sal_Int32 &, sal_Int32 &) const
SbxVariable * Get(SbxArray *)
void AddDim(sal_Int32, sal_Int32)
sal_Int32 GetDims() const
void unoAddDim(sal_Int32, sal_Int32)
void Put(SbxVariable *, const sal_Int32 *)
virtual SbxVariable * Find(const OUString &, SbxClassType)
OUString GetOUString() const
bool PutString(const OUString &)
SbxBase * GetObject() const
virtual bool IsFixed() const override
bool PutCurrency(sal_Int64)
static ErrCode ScanNumIntnl(const OUString &rSrc, double &nVal, bool bSingle=false)
void PutDecimal(css::bridge::oleautomation::Decimal const &rAutomationDec)
sal_uInt8 GetByte() const
bool PutInteger(sal_Int16)
SbxDecimal * GetDecimal() const
sal_Int64 GetInt64() const
sal_Int32 GetLong() const
sal_Int16 GetInteger() const
bool Get(SbxValues &) const
sal_uInt16 GetUShort() const
bool Put(const SbxValues &)
sal_Int64 GetCurrency() const
void SetParameters(SbxArray *p)
virtual SbxDataType GetType() const override
constexpr tools::Long Height() const
constexpr tools::Long Width() const
static void Error(ErrCode, const OUString &rMsg={})
static SbxBase * FindSBXInCurrentScope(const OUString &rName)
SvStream & WriteDouble(const double &rDouble)
SvStream & WriteInt32(sal_Int32 nInt32)
SvStream & WriteUniOrByteString(std::u16string_view rStr, rtl_TextEncoding eDestCharSet)
OUString ReadUniOrByteString(rtl_TextEncoding eSrcCharSet)
SvStream & ReadDouble(double &rDouble)
SvStream & ReadInt16(sal_Int16 &rInt16)
SvStream & WriteInt16(sal_Int16 nInt16)
SvStream & WriteUChar(unsigned char nChar)
SvStream & WriteUInt16(sal_uInt16 nUInt16)
SvStream & WriteOString(std::string_view rStr)
SvStream & WriteUInt64(sal_uInt64 nuInt64)
SvStream & ReadFloat(float &rFloat)
SvStream & WriteFloat(float nFloat)
SvStream & ReadUInt32(sal_uInt32 &rUInt32)
sal_uInt64 Seek(sal_uInt64 nPos)
SvStream & ReadInt32(sal_Int32 &rInt32)
SvStream & ReadUInt16(sal_uInt16 &rUInt16)
ErrCode const & GetErrorCode() const
SvStream & ReadUChar(unsigned char &rChar)
sal_Int16 implGetHour(double dDate)
bool implDateSerial(sal_Int16 nYear, sal_Int16 nMonth, sal_Int16 nDay, bool bUseTwoDigitYear, SbDateCorrection eCorr, double &rdRet)
sal_Int16 implGetDateYear(double aDate)
sal_Int16 implGetSecond(double dDate)
sal_Int16 implGetMinute(double dDate)
sal_Int16 implGetDateDay(double aDate)
sal_Int16 implGetDateMonth(double aDate)
void RTL_Impl_CreateUnoDialog(SbxArray &rPar)
Reference< XSingleServiceFactory > xFactory
#define SAL_WARN_IF(condition, area, stream)
bool LibreOffice6FloatingPointMode()
sal_Int16 implGetWeekDay(double aDate, bool bFirstDayParam, sal_Int16 nFirstDay)
static Reference< XCalendar4 > const & getLocaleCalendar()
OString strip(const OString &rIn, char c)
OUString reverseString(std::u16string_view rStr)
Reference< XMultiServiceFactory > getProcessServiceFactory()
Reference< XComponentContext > getProcessComponentContext()
constexpr T & temporary(T &&x)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
HashMap_OWString_Interface aMap
void RTL_Impl_CreatePropertySet(SbxArray &rPar)
void SbRtl_IsUnoStruct(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CVErr(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_TypeLen(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Input(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_TwipsPerPixelX(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_NPer(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_FreeLibrary(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_GetSolarVersion(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_FindObject(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CompatibilityMode(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Pmt(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Me(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_DoEvents(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_ResolvePath(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CallByName(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_GetGUIType(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_GlobalScope(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_IRR(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CreateUnoStruct(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Weekday(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_WaitUntil(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_EqualUnoObjects(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CInt(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_ConvertToUrl(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Switch(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Red(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_FV(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Frac(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Put(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_GetDefaultContext(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_StrReverse(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_TwipsPerPixelY(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_GetProcessServiceManager(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Green(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CSng(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_MIRR(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_DatePart(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_PV(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_MonthName(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CDate(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_EnableReschedule(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_GetGUIVersion(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CreateUnoValue(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Round(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Split(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_GetSystemType(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CByte(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_DateAdd(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CreateUnoService(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_IPmt(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_SYD(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Environ(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_PPmt(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_FormatDateTime(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void Wait_Impl(bool bDurationBased, SbxArray &rPar)
void SbRtl_HasUnoInterfaces(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Iif(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CreateUnoDialog(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Blue(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CDbl(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_DDB(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_DateDiff(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CCur(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Join(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CDec(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_GetPathSeparator(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CStr(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_NPV(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CreatePropertySet(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_GetDialogZoomFactorY(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CLng(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CreateUnoServiceWithArguments(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_WeekdayName(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Trim(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_ConvertFromUrl(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CVar(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_DimArray(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_GetSystemTicks(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Choose(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Array(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_SLN(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_GetDialogZoomFactorX(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_FindPropertyObject(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Get(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_CBool(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Rate(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
void SbRtl_Wait(StarBASIC *pBasic, SbxArray &rPar, bool bWrite)
#define ERRCODE_BASIC_BAD_PARAMETER
#define ERRCODE_BASIC_PROC_UNDEFINED
#define ERRCODE_BASIC_MUST_HAVE_DIMS
#define ERRCODE_BASIC_OUT_OF_RANGE
#define ERRCODE_BASIC_BAD_ARGUMENT
#define ERRCODE_BASIC_INTERNAL_ERROR
#define ERRCODE_BASIC_NOT_IMPLEMENTED
#define ERRCODE_BASIC_IO_ERROR
#define ERRCODE_BASIC_BAD_CHANNEL
#define ERRCODE_BASIC_WRONG_DIMS
#define ERRCODE_BASIC_INVALID_USAGE_OBJECT
void RTL_Impl_CreateUnoServiceWithArguments(SbxArray &rPar)
void RTL_Impl_HasInterfaces(SbxArray &rPar)
void RTL_Impl_CreateUnoValue(SbxArray &rPar)
void RTL_Impl_GetDefaultContext(SbxArray &rPar)
void RTL_Impl_EqualUnoObjects(SbxArray &rPar)
void RTL_Impl_CreateUnoStruct(SbxArray &rPar)
void unoToSbxValue(SbxVariable *pVar, const Any &aValue)
Any sbxToUnoValue(const SbxValue *pVar)
void RTL_Impl_CreateUnoService(SbxArray &rPar)
void RTL_Impl_GetProcessServiceManager(SbxArray &rPar)
void RTL_Impl_IsUnoStruct(SbxArray &rPar)