22#include <compiler.hxx>
23#include <document.hxx>
26#include <tokenarray.hxx>
45 mpFirstTab( nullptr ),
60 const FormulaToken* mpScToken;
63 explicit XclExpScToken() : mpScToken( nullptr ), mnSpaces( 0 ) {}
64 bool Is()
const {
return mpScToken !=
nullptr; }
66 OpCode GetOpCode()
const {
return mpScToken ? mpScToken->GetOpCode() :
ocNone; }
78struct XclExpTokenConvInfo
87struct XclExpOperandList :
public std::vector< XclExpTokenConvInfo >
89 explicit XclExpOperandList() { reserve( 2 ); }
90 void AppendOperand( sal_uInt16 nTokPos,
XclFuncParamConv eConv,
bool bValType );
93void XclExpOperandList::AppendOperand( sal_uInt16 nTokPos,
XclFuncParamConv eConv,
bool bValType )
96 XclExpTokenConvInfo& rConvInfo = back();
97 rConvInfo.mnTokPos = nTokPos;
98 rConvInfo.meConv = eConv;
99 rConvInfo.mbValType = bValType;
102typedef std::shared_ptr< XclExpOperandList > XclExpOperandListRef;
105struct XclExpExtFuncData
111 explicit XclExpExtFuncData() : mbVBasic( false ), mbHidden( false ) {}
112 void Set(
const OUString& rFuncName,
bool bVBasic,
bool bHidden );
115void XclExpExtFuncData::Set(
const OUString& rFuncName,
bool bVBasic,
bool bHidden )
117 maFuncName = rFuncName;
126 explicit XclExpFuncData(
127 const XclExpScToken& rTokData,
129 XclExpExtFuncData aExtFuncData );
131 const FormulaToken& GetScToken()
const {
return *mrTokData.mpScToken; }
132 OpCode GetOpCode()
const {
return mrFuncInfo.meOpCode; }
133 sal_uInt16 GetXclFuncIdx()
const {
return mrFuncInfo.mnXclFunc; }
134 bool IsVolatile()
const {
return mrFuncInfo.IsVolatile(); }
135 bool IsFixedParamCount()
const {
return mrFuncInfo.IsFixedParamCount(); }
136 bool IsAddInEquivalent()
const {
return mrFuncInfo.IsAddInEquivalent(); }
137 bool IsMacroFunc()
const {
return mrFuncInfo.IsMacroFunc(); }
138 sal_uInt8 GetSpaces()
const {
return mrTokData.mnSpaces; }
139 const XclExpExtFuncData& GetExtFuncData()
const {
return maExtFuncData; }
140 sal_uInt8 GetReturnClass()
const {
return mrFuncInfo.mnRetClass; }
143 bool IsCalcOnlyParam()
const;
144 bool IsExcelOnlyParam()
const;
145 void IncParamInfoIdx();
147 sal_uInt8 GetMinParamCount()
const {
return mrFuncInfo.mnMinParamCount; }
148 sal_uInt8 GetMaxParamCount()
const {
return mrFuncInfo.mnMaxParamCount; }
149 sal_uInt8 GetParamCount()
const {
return static_cast< sal_uInt8 >( mxOperands->size() ); }
150 void FinishParam( sal_uInt16 nTokPos );
151 const XclExpOperandListRef& GetOperandList()
const {
return mxOperands; }
154 void AppendAttrPos( sal_uInt16 nPos ) { maAttrPosVec.push_back( nPos ); }
158 const XclExpScToken& mrTokData;
160 XclExpExtFuncData maExtFuncData;
161 XclExpOperandListRef mxOperands;
165XclExpFuncData::XclExpFuncData(
const XclExpScToken& rTokData,
167 mrTokData( rTokData ),
168 mrFuncInfo( rFuncInfo ),
169 maExtFuncData(
std::move( aExtFuncData )),
173 OSL_ENSURE( mrTokData.mpScToken,
"XclExpFuncData::XclExpFuncData - missing core token" );
175 if( (maExtFuncData.maFuncName.isEmpty()) &&
dynamic_cast< const FormulaExternalToken*
>( mrTokData.mpScToken ) )
176 maExtFuncData.Set( GetScToken().GetExternal(),
true,
false );
182 return mpParamInfo ? *mpParamInfo : saInvalidInfo;
185bool XclExpFuncData::IsCalcOnlyParam()
const
190bool XclExpFuncData::IsExcelOnlyParam()
const
195void XclExpFuncData::IncParamInfoIdx()
204 else if( IsExcelOnlyParam() || IsCalcOnlyParam() )
205 mpParamInfo =
nullptr;
207 else if( mrFuncInfo.IsParamPairs() )
212void XclExpFuncData::FinishParam( sal_uInt16 nTokPos )
216 mxOperands->AppendOperand( nTokPos, rParamInfo.
meConv, rParamInfo.
mbValType );
224enum XclExpFmlaClassType
232struct XclExpCompConfig
235 XclExpFmlaClassType meClassType;
243const XclExpCompConfig spConfigTable[] =
261 typedef std::shared_ptr< ScTokenArray > ScTokenArrayRef;
263 const XclExpCompConfig& mrCfg;
264 ScTokenArrayRef mxOwnScTokArr;
272 std::vector< XclExpOperandListRef >
279 explicit XclExpCompData(
const XclExpCompConfig* pCfg );
282XclExpCompData::XclExpCompData(
const XclExpCompConfig* pCfg ) :
283 mrCfg( pCfg ? *pCfg : spConfigTable[ 0 ] ),
284 mpLinkMgr( nullptr ),
286 mpScBasePos( nullptr ),
287 mbStopAtSep( false ),
289 mbOk( pCfg != nullptr )
291 OSL_ENSURE( pCfg,
"XclExpFmlaCompImpl::Init - unknown formula type" );
321 sal_uInt16
GetSize()
const {
return static_cast< sal_uInt16
>(
mxData->maTokVec.size() ); }
342 XclExpScToken
Expression( XclExpScToken aTokData,
bool bInParentheses,
bool bStopAtSep );
343 XclExpScToken
SkipExpression( XclExpScToken aTokData,
bool bStopAtSep );
345 XclExpScToken
OrTerm( XclExpScToken aTokData,
bool bInParentheses );
346 XclExpScToken
AndTerm( XclExpScToken aTokData,
bool bInParentheses );
347 XclExpScToken
CompareTerm( XclExpScToken aTokData,
bool bInParentheses );
348 XclExpScToken
ConcatTerm( XclExpScToken aTokData,
bool bInParentheses );
349 XclExpScToken
AddSubTerm( XclExpScToken aTokData,
bool bInParentheses );
350 XclExpScToken
MulDivTerm( XclExpScToken aTokData,
bool bInParentheses );
351 XclExpScToken
PowTerm( XclExpScToken aTokData,
bool bInParentheses );
352 XclExpScToken
UnaryPostTerm( XclExpScToken aTokData,
bool bInParentheses );
353 XclExpScToken
UnaryPreTerm( XclExpScToken aTokData,
bool bInParentheses );
354 XclExpScToken
ListTerm( XclExpScToken aTokData,
bool bInParentheses );
355 XclExpScToken
IntersectTerm( XclExpScToken aTokData,
bool& rbHasRefOp );
356 XclExpScToken
RangeTerm( XclExpScToken aTokData,
bool& rbHasRefOp );
357 XclExpScToken
Factor( XclExpScToken aTokData );
364 void ProcessBad(
const XclExpScToken& rTokData );
377 XclExpScToken
ProcessParam( XclExpScToken aTokData, XclExpFuncData& rFuncData );
388 bool bNatLangRef,
bool bTruncMaxCol,
bool bTruncMaxRow )
const;
390 bool bNatLangRef )
const;
403 void PushOperatorPos( sal_uInt16 nTokPos,
const XclExpOperandListRef& rxOperands );
408 void Append( sal_uInt16 nData );
409 void Append( sal_uInt32 nData );
410 void Append(
double fData );
411 void Append(
const OUString& rString );
440 void InsertZeros( sal_uInt16 nInsertPos, sal_uInt16 nInsertSize );
441 void Overwrite( sal_uInt16 nWriteToPos, sal_uInt16 nOffset );
452 void AppendExt(
const OUString& rString );
461 std::vector< XclExpCompDataRef >
475 meBiff( rRoot.GetBiff() ),
476 mnMaxAbsCol( rRoot.GetXclMaxPos().
Col() ),
477 mnMaxAbsRow( rRoot.GetXclMaxPos().
Row() ),
478 mnMaxScCol( rRoot.GetScMaxPos().
Col() ),
479 mnMaxScRow( rRoot.GetScMaxPos().
Row() ),
480 mnMaxColMask( static_cast< sal_uInt16 >( rRoot.GetXclMaxPos().
Col() ) ),
481 mnMaxRowMask( static_cast< sal_uInt32 >( rRoot.GetXclMaxPos().
Row() ) )
484 for(
auto const &rEntry : spConfigTable)
492 Init(
eType, rScTokArr, pScBasePos, pRefLog );
499 if( (nScError != FormulaError::NONE) && (!aTokData.Is() || (aTokData.GetOpCode() ==
ocStop)) )
504 else if( aTokData.Is() )
506 aTokData =
Expression( aTokData,
false,
false );
510 OSL_FAIL(
"XclExpFmlaCompImpl::CreateFormula - empty token array" );
517 mxData->mbOk = !aTokData.Is() || (aTokData.GetOpCode() ==
ocStop);
518 OSL_ENSURE(
mxData->mbOk,
"XclExpFmlaCompImpl::CreateFormula - unknown garbage behind formula" );
556 return pCfg && pCfg->mb3DRefOnly;
563 XclExpCompConfigMap::const_iterator aIt =
maCfgMap.find(
eType );
564 OSL_ENSURE( aIt !=
maCfgMap.end(),
"XclExpFmlaCompImpl::GetConfigForType - unknown formula type" );
565 return (aIt ==
maCfgMap.end()) ? nullptr : &aIt->second;
589 mxData->mbOk = pScBasePos !=
nullptr;
590 OSL_ENSURE(
mxData->mbOk,
"XclExpFmlaCompImpl::Init - missing cell address" );
591 mxData->mpScBasePos = pScBasePos;
594 mxData->mbOk = pScBasePos !=
nullptr;
595 assert(
mxData->mbOk &&
"XclExpFmlaCompImpl::Init - missing cell address");
613 mxData->maTokArrIt.Init(
mxData->mxOwnScTokArr ? *
mxData->mxOwnScTokArr : rScTokArr,
false );
614 mxData->mpRefLog = pRefLog;
617 mxData->mpScBasePos = pScBasePos;
627 OSL_ENSURE(
mxData->mbOk,
"XclExpFmlaCompImpl::RecalcTokenClasses - position of root token expected on stack" );
633 bool bNameFmla =
mxData->mrCfg.meClassType == EXC_CLASSTYPE_NAME;
635 XclExpClassConv eClassConv = bNameFmla ? EXC_CLASSCONV_ARR : EXC_CLASSCONV_VAL;
636 XclExpTokenConvInfo aConvInfo = {
PopOperandPos(), eParamConv, !bNameFmla };
641 mxData->maOpListVec.clear();
642 mxData->maOpPosStack.clear();
646 XclFuncParamConv ePrevConv, XclExpClassConv ePrevClassConv,
bool bWasRefClass )
648 OSL_ENSURE( rConvInfo.mnTokPos <
GetSize(),
"XclExpFmlaCompImpl::RecalcTokenClass - invalid token position" );
663 XclExpClassConv eClassConv = EXC_CLASSCONV_ORG;
668 eClassConv = EXC_CLASSCONV_ORG;
672 eClassConv = EXC_CLASSCONV_VAL;
676 eClassConv = EXC_CLASSCONV_ARR;
688 eClassConv = bWasRefClass ? EXC_CLASSCONV_VAL : ePrevClassConv;
692 eClassConv = ePrevClassConv;
699 eClassConv = bWasRefClass ? ePrevClassConv : EXC_CLASSCONV_ORG;
712 eClassConv = ((nTokClass ==
EXC_TOKCLASS_REF) || (ePrevClassConv == EXC_CLASSCONV_ARR)) ?
713 ePrevClassConv : EXC_CLASSCONV_ORG;
722 case EXC_CLASSCONV_ORG:
733 case EXC_CLASSCONV_VAL:
741 case EXC_CLASSCONV_ARR:
752 if( rConvInfo.mnTokPos <
mxData->maOpListVec.size() )
753 if(
const XclExpOperandList* pOperands =
mxData->maOpListVec[ rConvInfo.mnTokPos ].get() )
754 for(
const auto& rOperand : *pOperands )
782 mxData->maExtDataVec.clear();
783 mxData->mbVolatile =
false;
791 OSL_ENSURE(
mxData->mrCfg.mbAllowArrays ||
mxData->maExtDataVec.empty(),
"XclExpFmlaCompImpl::CreateTokenArray - unexpected extended data" );
792 if( !
mxData->mrCfg.mbAllowArrays )
793 mxData->maExtDataVec.clear();
811 const FormulaToken* pScToken =
mxData->maTokArrIt.Get();
826 return aTempIt.
Get();
832 rTokData.mnSpaces = 0;
836 rTokData.mnSpaces += rTokData.mpScToken->GetByte();
839 return rTokData.Is();
844 XclExpScToken aTokData;
944 if(
mxData->mbOk && aTokData.Is() )
947 bool bOldStopAtSep =
mxData->mbStopAtSep;
948 mxData->mbStopAtSep = bStopAtSep;
950 aTokData =
OrTerm( aTokData, bInParentheses );
952 mxData->mbStopAtSep = bOldStopAtSep;
959 while(
mxData->mbOk && aTokData.Is() && (aTokData.GetOpCode() !=
ocClose) && (!bStopAtSep || (aTokData.GetOpCode() !=
ocSep)) )
961 if( aTokData.GetOpCode() ==
ocOpen )
973 aTokData =
AndTerm( aTokData, bInParentheses );
975 while(
mxData->mbOk && (aTokData.GetOpCode() ==
ocOr) )
983 if(
mxData->mbOk && (nParamCount > 1) )
990 aTokData =
CompareTerm( aTokData, bInParentheses );
992 while(
mxData->mbOk && (aTokData.GetOpCode() ==
ocAnd) )
1000 if(
mxData->mbOk && (nParamCount > 1) )
1007 aTokData =
ConcatTerm( aTokData, bInParentheses );
1010 sal_uInt8 nOpTokenId = lclGetConcatTokenId( aTokData.GetOpCode() );
1022 aTokData =
AddSubTerm( aTokData, bInParentheses );
1025 sal_uInt8 nOpTokenId = lclGetCompareTokenId( aTokData.GetOpCode() );
1037 aTokData =
MulDivTerm( aTokData, bInParentheses );
1040 sal_uInt8 nOpTokenId = lclGetAddSubTokenId( aTokData.GetOpCode() );
1052 aTokData =
PowTerm( aTokData, bInParentheses );
1055 sal_uInt8 nOpTokenId = lclGetMulDivTokenId( aTokData.GetOpCode() );
1071 nOpTokenId = lclGetPowTokenId( aTokData.GetOpCode() );
1087 nOpTokenId = lclGetUnaryPostTokenId( aTokData.GetOpCode() );
1107 aTokData =
ListTerm( aTokData, bInParentheses );
1114 sal_uInt16 nSubExprPos =
GetSize();
1115 bool bHasAnyRefOp =
false;
1116 bool bHasListOp =
false;
1120 sal_uInt8 nOpTokenId = lclGetListTokenId( aTokData.GetOpCode(),
mxData->mbStopAtSep );
1126 bHasAnyRefOp = bHasListOp =
true;
1131 sal_uInt16 nSubExprSize =
GetSize() - nSubExprPos;
1134 Overwrite( nSubExprPos + 1, nSubExprSize );
1136 XclExpOperandListRef xOperands = std::make_shared<XclExpOperandList>();
1141 if( bHasListOp && !bInParentheses )
1148 aTokData =
RangeTerm( aTokData, rbHasRefOp );
1151 sal_uInt8 nOpTokenId = lclGetIntersectTokenId( aTokData.GetOpCode() );
1164 aTokData =
Factor( aTokData );
1167 sal_uInt8 nOpTokenId = lclGetRangeTokenId( aTokData.GetOpCode() );
1180 if( !
mxData->mbOk || !aTokData.Is() )
return XclExpScToken();
1182 switch( aTokData.GetType() )
1195 default:
switch( aTokData.GetOpCode() )
1216 double fValue = rTokData.mpScToken->GetDouble();
1218 double fFrac = modf( fValue, &fInt );
1219 if( (fFrac == 0.0) && (0.0 <= fInt) && (fInt <= 65535.0) )
1220 AppendIntToken(
static_cast< sal_uInt16
>( fInt ), rTokData.mnSpaces );
1228 Append( rTokData.mpScToken->GetString().getString() );
1258bool lclGetTokenString( OUString& rString,
const XclExpScToken& rTokData )
1260 bool bIsStr = (rTokData.GetType() ==
svString) && (rTokData.GetOpCode() ==
ocPush);
1262 rString = rTokData.mpScToken->GetString().getString();
1270 OUString aApplic, aTopic, aItem;
1279 if(
mxData->mbOk )
mxData->mbOk = !aApplic.isEmpty() && !aTopic.isEmpty() && !aItem.isEmpty();
1282 sal_uInt16 nExtSheet(0), nExtName(0);
1283 if(
mxData->mpLinkMgr &&
mxData->mpLinkMgr->InsertDde( nExtSheet, nExtName, aApplic, aTopic, aItem ) )
1297 if( !pNextScToken || (pNextScToken->GetOpCode() !=
ocOpen) )
1305 const ScMatrix* pMatrix = rTokData.mpScToken->GetMatrix();
1306 if( pMatrix &&
mxData->mrCfg.mbAllowArrays )
1310 OSL_ENSURE( (nScCols > 0) && (nScRows > 0),
"XclExpFmlaCompImpl::ProcessMatrix - invalid matrix size" );
1311 sal_uInt16 nCols = ::limit_cast< sal_uInt16 >( nScCols, 0, 256 );
1312 sal_uInt16 nRows = ::limit_cast< sal_uInt16 >( nScRows, 0, 1024 );
1318 Append(
static_cast< sal_uInt32
>( 0 ) );
1323 for(
SCSIZE nScRow = 0; nScRow < nScRows; ++nScRow )
1325 for(
SCSIZE nScCol = 0; nScCol < nScCols; ++nScCol )
1337 else if( (nErr = nMatVal.
GetError()) != FormulaError::NONE )
1352 if(
aStr.isEmpty() )
1375 OpCode eOpCode = rTokData.GetOpCode();
1378 XclExpExtFuncData aExtFuncData;
1384 if( !rFuncName.isEmpty() )
1386 aExtFuncData.Set( rFuncName,
true,
false );
1391 mxData->mbOk = pFuncInfo !=
nullptr;
1392 if( !
mxData->mbOk )
return;
1401 XclExpFuncData aFuncData( rTokData, *pFuncInfo, std::move(aExtFuncData) );
1402 XclExpScToken aTokData;
1407 enum { STATE_START, STATE_OPEN, STATE_PARAM, STATE_SEP, STATE_CLOSE, STATE_END }
1408 eState = STATE_START;
1409 while( eState != STATE_END )
switch( eState )
1413 eState =
mxData->mbOk ? STATE_OPEN : STATE_END;
1417 eState =
mxData->mbOk ? ((aTokData.GetOpCode() ==
ocClose) ? STATE_CLOSE : STATE_PARAM) : STATE_END;
1421 switch( aTokData.GetOpCode() )
1423 case ocSep: eState = STATE_SEP;
break;
1424 case ocClose: eState = STATE_CLOSE;
break;
1425 default:
mxData->mbOk =
false;
1427 if( !
mxData->mbOk ) eState = STATE_END;
1431 eState =
mxData->mbOk ? STATE_PARAM : STATE_END;
1447 switch( rFuncData.GetOpCode() )
1470 sal_uInt8 nParamCount = rFuncData.GetParamCount();
1471 if( (rFuncData.GetMinParamCount() <= nParamCount) && (nParamCount <= rFuncData.GetMaxParamCount()) )
1478 switch( rFuncData.GetOpCode() )
1491 mxData->mbVolatile |= rFuncData.IsVolatile();
1494 switch( rFuncData.GetOpCode() )
1534 sal_uInt16 nParamCount = rFuncData.GetParamCount();
1535 OSL_ENSURE( (nParamCount == 2) || (nParamCount == 3),
"XclExpFmlaCompImpl::FinishIfFunction - wrong parameter count" );
1536 const ScfUInt16Vec& rAttrPos = rFuncData.GetAttrPosVec();
1537 OSL_ENSURE( nParamCount == rAttrPos.size(),
"XclExpFmlaCompImpl::FinishIfFunction - wrong number of tAttr tokens" );
1539 Overwrite( rAttrPos[ 0 ] + 2,
static_cast< sal_uInt16
>( rAttrPos[ 1 ] - rAttrPos[ 0 ] ) );
1542 if( nParamCount == 3 )
1548 sal_uInt16 nParamCount = rFuncData.GetParamCount();
1550 OSL_ENSURE( nParamCount == rAttrPos.size(),
"XclExpFmlaCompImpl::FinishChooseFunction - wrong number of tAttr tokens" );
1552 sal_uInt16 nChoices = nParamCount - 1;
1554 Overwrite( rAttrPos[ 0 ] + 2, nChoices );
1556 sal_uInt16 nJumpArrPos = rAttrPos[ 0 ] + 4;
1558 sal_uInt16 nJumpArrSize = 2 * (nChoices + 1);
1563 for( nIdx = 1; nIdx < nParamCount; ++nIdx )
1564 rAttrPos[ nIdx ] = rAttrPos[ nIdx ] + nJumpArrSize;
1566 for( nIdx = 1; nIdx < nParamCount; ++nIdx )
1570 for( nIdx = 1; nIdx < nParamCount; ++nIdx )
1571 Overwrite( nJumpArrPos + 2 * nIdx,
static_cast< sal_uInt16
>( rAttrPos[ nIdx ] + 4 - nJumpArrPos ) );
1576 if( rFuncData.IsCalcOnlyParam() )
1580 rFuncData.IncParamInfoIdx();
1585 while( rFuncData.IsExcelOnlyParam() )
1593 switch( aTokData.GetOpCode() )
1597 default: aTokData =
Expression( aTokData,
false,
true );
1608 sal_uInt8 nParamIdx = rFuncData.GetParamCount();
1610 switch( rFuncData.GetOpCode() )
1635 if( nParamIdx == 0 )
1648 sal_uInt8 nParamIdx = rFuncData.GetParamCount() - 1;
1649 switch( rFuncData.GetOpCode() )
1652 if( nParamIdx == 0 )
1667 switch( rFuncData.GetOpCode() )
1684 if( rFuncData.IsAddInEquivalent() )
1688 else if( rFuncData.IsMacroFunc() )
1699 SAL_WARN(
"sc.filter",
"XclExpFmlaCompImpl::AppendDefaultParam - unknown opcode" );
1711 sal_uInt8 nParamCount = rFuncData.GetParamCount();
1712 switch( rFuncData.GetOpCode() )
1715 if( nParamCount == 1 )
1727 if( nParamCount == 1 )
1737 if( nParamCount == 1 )
1749 if( nParamCount == 0 )
1754 if( nParamCount == 3 )
1764 if( nParamCount == 2 )
1774 if( nParamCount == 3 )
1785 switch( nParamCount )
1805 if( (nParamCount == 0) && rFuncData.IsMacroFunc() )
1827 return lclIsRefRel2D( rRefData.
Ref1 ) || lclIsRefRel2D( rRefData.
Ref2 );
1832 return lclIsRefDel2D( rRefData.
Ref1 ) || lclIsRefDel2D( rRefData.
Ref2 );
1844 return rRefData.
Tab();
1846 if (!
mxData->mpScBasePos)
1862 if (bCheck3DFlag && rRefData.
IsFlag3D())
1869 return rRefData.
Tab() == 0;
1881 bool bNatLangRef,
bool bTruncMaxCol,
bool bTruncMaxRow )
const
1883 if(
mxData->mpScBasePos )
1910 sal_Int16 nXclRelCol =
static_cast<sal_Int16
>(rRefData.
Col());
1914 sal_Int32 nXclRelRow =
static_cast<sal_Int32
>(rRefData.
Row());
1921 OSL_ENSURE(
meBiff ==
EXC_BIFF8,
"XclExpFmlaCompImpl::ConvertRefData - NLRs only for BIFF8" );
1927 sal_uInt16 rnRelRow = rXclPos.
mnRow;
1948 mxData->mpRefLog->emplace_back();
1949 return &
mxData->mpRefLog->back();
1965 "XclExpFmlaCompImpl::ProcessCellRef - broken natural language reference" );
1976 mxData->mpLinkMgr->StoreCell(aRefData, *
mxData->mpScBasePos);
1987 else if(
mxData->mpLinkMgr )
1990 sal_uInt16 nExtSheet, nXclTab;
2021 mxData->mpLinkMgr->StoreCellRange(aRefData, *
mxData->mpScBasePos);
2032 else if(
mxData->mpLinkMgr )
2035 sal_uInt16 nExtSheet, nFirstXclTab, nLastXclTab;
2036 mxData->mpLinkMgr->FindExtSheet( nExtSheet, nFirstXclTab, nLastXclTab,
2067 sal_uInt16 nFileId = rTokData.mpScToken->GetIndex();
2068 OUString aTabName = rTokData.mpScToken->GetString().getString();
2073 sal_uInt16 nExtSheet, nFirstSBTab, nLastSBTab;
2074 mxData->mpLinkMgr->FindExtSheet( nFileId, aTabName, 1, nExtSheet, nFirstSBTab, nLastSBTab,
GetNewRefLogEntry() );
2103 sal_uInt16 nFileId = rTokData.mpScToken->GetIndex();
2104 OUString aTabName = rTokData.mpScToken->GetString().getString();
2109 sal_uInt16 nExtSheet, nFirstSBTab, nLastSBTab;
2110 sal_uInt16 nTabSpan =
static_cast<sal_uInt16
>(aRefData.
Ref2.
Tab() - aRefData.
Ref1.
Tab() + 1);
2111 mxData->mpLinkMgr->FindExtSheet(
2112 nFileId, aTabName, nTabSpan, nExtSheet, nFirstSBTab, nLastSBTab,
GetNewRefLogEntry());
2133 sal_Int16 nSheet = rTokData.mpScToken->GetSheet();
2146 else if(
mxData->mpLinkMgr )
2166 sal_uInt16 nFileId = rTokData.mpScToken->GetIndex();
2167 OUString
aName = rTokData.mpScToken->GetString().getString();
2172 if(
mxData->mpScBasePos )
2174 FormulaTokenArrayPlainIterator aIter(*xArray);
2175 for( FormulaToken* pScToken = aIter.First(); pScToken; pScToken = aIter.Next() )
2177 if( pScToken->IsExternalRef() )
2179 switch( pScToken->GetType() )
2184 mxData->mpLinkMgr->StoreCell(
2191 mxData->mpLinkMgr->StoreCellRange(
2203 sal_uInt16 nExtSheet = 0, nExtName = 0;
2205 if( pFile &&
mxData->mpLinkMgr->InsertExtName( nExtSheet, nExtName, *pFile,
aName, xArray ) )
2221 mxData->maOpPosStack.push_back( nTokPos );
2227 OSL_ENSURE( rxOperands,
"XclExpFmlaCompImpl::AppendOperatorTokenId - missing operand list" );
2228 if(
mxData->maOpListVec.size() <= nTokPos )
2229 mxData->maOpListVec.resize( nTokPos + 1, XclExpOperandListRef() );
2230 mxData->maOpListVec[ nTokPos ] = rxOperands;
2235 OSL_ENSURE( !
mxData->mbOk || !
mxData->maOpPosStack.empty(),
"XclExpFmlaCompImpl::PopOperandPos - token stack broken" );
2239 sal_uInt16 nTokPos =
mxData->maOpPosStack.back();
2240 mxData->maOpPosStack.pop_back();
2248void lclAppend(
ScfUInt8Vec& orVector, sal_uInt16 nData )
2250 orVector.resize( orVector.size() + 2 );
2251 ShortToSVBT16( nData, &*(orVector.end() - 2) );
2254void lclAppend(
ScfUInt8Vec& orVector, sal_uInt32 nData )
2256 orVector.resize( orVector.size() + 4 );
2257 UInt32ToSVBT32( nData, &*(orVector.end() - 4) );
2260void lclAppend(
ScfUInt8Vec& orVector,
double fData )
2262 orVector.resize( orVector.size() + 8 );
2263 DoubleToSVBT64( fData, &*(orVector.end() - 8) );
2269 size_t nSize = orVector.size();
2270 orVector.resize( nSize + xXclStr->GetSize() );
2271 xXclStr->WriteToMem( &orVector[ nSize ] );
2278 mxData->maTokVec.push_back( nData );
2288 lclAppend(
mxData->maTokVec, nData );
2293 lclAppend(
mxData->maTokVec, nData );
2298 lclAppend(
mxData->maTokVec, fData );
2414 OUString aXclFuncName;
2417 sal_uInt16 nExtSheet, nExtName;
2418 if(
mxData->mpLinkMgr->InsertAddIn( nExtSheet, nExtName, aXclFuncName ) )
2429 sal_uInt16 nExtSheet(0), nExtName(0);
2430 if(
mxData->mpLinkMgr &&
mxData->mpLinkMgr->InsertEuroTool( nExtSheet, nExtName, rExtFuncData.maFuncName ) )
2445 XclExpOperandListRef xOperands = std::make_shared<XclExpOperandList>();
2452 XclExpOperandListRef xOperands = std::make_shared<XclExpOperandList>();
2460 XclExpOperandListRef xOperands = std::make_shared<XclExpOperandList>();
2461 for(
sal_uInt8 nOpIdx = 0; nOpIdx < nOpCount; ++nOpIdx )
2470 sal_uInt16 nXclFuncIdx = rFuncData.GetXclFuncIdx();
2471 sal_uInt8 nParamCount = rFuncData.GetParamCount();
2472 sal_uInt8 nRetClass = rFuncData.GetReturnClass();
2479 Append( sal_uInt16( 0 ) );
2481 else if( rFuncData.IsFixedParamCount() )
2506 rFuncData.AppendAttrPos(
GetSize() );
2510 Append( sal_uInt16( 0 ) );
2516 OSL_ENSURE( nInsertPos < mxData->maTokVec.size(),
"XclExpFmlaCompImpl::Insert - invalid position" );
2517 mxData->maTokVec.insert(
mxData->maTokVec.begin() + nInsertPos, nInsertSize, 0 );
2520 for(
auto& rOpPos :
mxData->maOpPosStack )
2521 if( nInsertPos <= rOpPos )
2522 rOpPos += nInsertSize;
2525 if( nInsertPos < mxData->maOpListVec.size() )
2526 mxData->maOpListVec.insert(
mxData->maOpListVec.begin() + nInsertPos, nInsertSize, XclExpOperandListRef() );
2527 for(
auto& rxOpList :
mxData->maOpListVec )
2529 for(
auto& rOp : *rxOpList )
2530 if( nInsertPos <= rOp.mnTokPos )
2531 rOp.mnTokPos += nInsertSize;
2536 OSL_ENSURE(
o3tl::make_unsigned( nWriteToPos + 1 ) <
mxData->maTokVec.size(),
"XclExpFmlaCompImpl::Overwrite - invalid position" );
2537 ShortToSVBT16( nOffset, &
mxData->maTokVec[ nWriteToPos ] );
2547 Overwrite( nAttrPos + 2,
static_cast< sal_uInt16
>(
GetSize() - nAttrPos - 5 ) );
2562 mxData->maTokVec.pop_back();
2570 mxData->maExtDataVec.push_back( nData );
2580 lclAppend(
mxData->maExtDataVec, nData );
2585 lclAppend(
mxData->maExtDataVec, fData );
2602 else if( rScPos.
Tab() == nCurrScTab )
2612 lclInitOwnTab( aRef, rScPos, nCurrScTab, b3DRefOnly );
2620 lclPutCellToTokenArray( rScTokArr, rScRange.
aStart, nCurrScTab, b3DRefOnly );
2626 lclInitOwnTab( aRef.
Ref1, rScRange.
aStart, nCurrScTab, b3DRefOnly );
2627 lclInitOwnTab( aRef.
Ref2, rScRange.
aEnd, nCurrScTab, b3DRefOnly );
2648 return mxImpl->CreateFormula(
eType, rScTokArr, pScBasePos, pRefLog );
2674 for(
size_t nIdx = 0; nIdx <
nCount; ++nIdx )
2678 lclPutRangeToTokenArray( aScTokArr, rScRanges[ nIdx ], nCurrScTab, b3DRefOnly );
2685 return mxImpl->CreateErrorFormula( nErrCode );
2691 return mxImpl->CreateSpecialRefFormula( nTokenId, rXclPos );
2695 sal_uInt16 nExtSheet, sal_uInt16 nExtName )
2697 return mxImpl->CreateNameXFormula( nExtSheet, nExtName );
2702 return mxImpl->IsRef2D(rRefData,
true);
2707 return mxImpl->IsRef2D(rRefData,
true);
size_t SCSIZE
size_t typedef to be able to find places where code was changed from USHORT to size_t and is used to ...
ScSheetLimits & GetSheetLimits() const
SC_DLLPUBLIC ScExternalRefManager * GetExternalRefManager() const
std::shared_ptr< ScTokenArray > TokenArrayRef
const OUString * getExternalFileName(sal_uInt16 nFileId, bool bForceOriginal=false)
It returns a pointer to the name of the URI associated with a given external file ID.
ScExternalRefCache::TokenArrayRef getRangeNameTokens(sal_uInt16 nFileId, const OUString &rName, const ScAddress *pCurPos=nullptr)
Get an array of tokens corresponding with a specified name in a specified file.
static SC_DLLPUBLIC ScUnoAddInCollection * GetAddInCollection()
Matrix data type that can store values of mixed types.
ScMatrixValue Get(SCSIZE nC, SCSIZE nR) const
@ATTENTION: If bString the ScMatrixValue->pS may still be NULL to indicate an empty string!
static bool IsBooleanType(ScMatValType nType)
Boolean.
static bool IsValueType(ScMatValType nType)
Value or boolean.
void GetDimensions(SCSIZE &rC, SCSIZE &rR) const
virtual formula::FormulaToken * AddOpCode(OpCode eCode) override
std::unique_ptr< ScTokenArray > Clone() const
formula::FormulaToken * AddDoubleReference(const ScComplexRefData &rRef)
formula::FormulaToken * AddSingleReference(const ScSingleRefData &rRef)
ScSingleRefToken with ocPush.
bool GetExcelName(const OUString &rCalcName, LanguageType eDestLang, OUString &rRetExcelName)
leave rRetExcelName unchanged, if no matching name is found
Implementation class of the export formula compiler.
void FinishFunction(XclExpFuncData &rFuncData, sal_uInt8 nCloseSpaces)
void AppendUnaryOperatorToken(sal_uInt8 nTokenId, sal_uInt8 nSpaces=0)
void Overwrite(sal_uInt16 nWriteToPos, sal_uInt16 nOffset)
void AppendBinaryOperatorToken(sal_uInt8 nTokenId, bool bValType, sal_uInt8 nSpaces=0)
void PushOperandPos(sal_uInt16 nTokPos)
XclExpScToken SkipExpression(XclExpScToken aTokData, bool bStopAtSep)
void ProcessFunction(const XclExpScToken &rTokData)
void AppendMissingToken(sal_uInt8 nSpaces=0)
XclExpScToken AndTerm(XclExpScToken aTokData, bool bInParentheses)
void ProcessExternalRangeRef(const XclExpScToken &rTokData)
void PrepareFunction(const XclExpFuncData &rFuncData)
void AppendRange(const XclRange &rXclRange)
void ProcessMissing(const XclExpScToken &rTokData)
void FinishParam(XclExpFuncData &rFuncData)
void ProcessExternalName(const XclExpScToken &rTokData)
void AppendAddInCallToken(const XclExpExtFuncData &rExtFuncData)
sal_uInt16 PopOperandPos()
std::vector< XclExpCompDataRef > maDataStack
Working data for current formula.
void AppendAddress(const XclAddress &rXclPos)
void ProcessDouble(const XclExpScToken &rTokData)
std::map< XclFormulaType, XclExpCompConfig > XclExpCompConfigMap
void ProcessDdeLink(const XclExpScToken &rTokData)
const sal_uInt16 mnMaxColMask
Maximum row index in Calc itself.
void FinishIfFunction(XclExpFuncData &rFuncData)
const SCCOL mnMaxAbsCol
Cached BIFF version to save GetBiff() calls.
XclExpScToken PowTerm(XclExpScToken aTokData, bool bInParentheses)
void PushOperatorPos(sal_uInt16 nTokPos, const XclExpOperandListRef &rxOperands)
std::shared_ptr< XclExpCompData > XclExpCompDataRef
XclFunctionProvider maFuncProv
Compiler configuration map for all formula types.
void FinishChooseFunction(XclExpFuncData &rFuncData)
void AppendEuroToolCallToken(const XclExpExtFuncData &rExtFuncData)
const XclExpCompConfig * GetConfigForType(XclFormulaType eType) const
void AppendLogicalOperatorToken(sal_uInt16 nXclFuncIdx, sal_uInt8 nOpCount)
void AppendMissingNameToken(const OUString &rName, sal_uInt8 nSpaces=0)
void InsertZeros(sal_uInt16 nInsertPos, sal_uInt16 nInsertSize)
XclExpRefLogEntry * GetNewRefLogEntry()
XclTokenArrayRef CreateErrorFormula(sal_uInt8 nErrCode)
Creates a single error token containing the passed error code.
XclExpScToken CompareTerm(XclExpScToken aTokData, bool bInParentheses)
void AppendOperatorTokenId(sal_uInt8 nTokenId, const XclExpOperandListRef &rxOperands, sal_uInt8 nSpaces=0)
XclExpFmlaCompImpl(const XclExpRoot &rRoot)
const FormulaToken * PeekNextRawToken() const
XclExpScToken OrTerm(XclExpScToken aTokData, bool bInParentheses)
XclExpScToken MulDivTerm(XclExpScToken aTokData, bool bInParentheses)
void RemoveTrailingParen()
const SCCOL mnMaxScCol
Maximum row index.
void ProcessParentheses(const XclExpScToken &rTokData)
XclTokenArrayRef CreateSpecialRefFormula(sal_uInt8 nTokenId, const XclAddress &rXclPos)
Creates a single token for a special cell reference.
void ProcessBad(const XclExpScToken &rTokData)
void AppendIntToken(sal_uInt16 nValue, sal_uInt8 nSpaces=0)
void Append(sal_uInt8 nData)
sal_uInt16 GetSize() const
void RecalcTokenClasses()
XclExpScToken UnaryPostTerm(XclExpScToken aTokData, bool bInParentheses)
void ProcessExternalCellRef(const XclExpScToken &rTokData)
bool IsSpaceToken(sal_uInt16 nPos) const
void ProcessCellRef(const XclExpScToken &rTokData)
XclExpScToken Factor(XclExpScToken aTokData)
const SCROW mnMaxScRow
Maximum column index in Calc itself.
void AppendErrorToken(sal_uInt8 nErrCode, sal_uInt8 nSpaces=0)
void AppendOperandTokenId(sal_uInt8 nTokenId, sal_uInt8 nSpaces=0)
void AppendDefaultParam(XclExpFuncData &rFuncData)
XclExpScToken UnaryPreTerm(XclExpScToken aTokData, bool bInParentheses)
void AppendMacroCallToken(const XclExpExtFuncData &rExtFuncData)
const SCROW mnMaxAbsRow
Maximum column index.
XclExpCompConfigMap maCfgMap
void UpdateAttrGoto(sal_uInt16 nAttrPos)
XclExpScToken ListTerm(XclExpScToken aTokData, bool bInParentheses)
const FormulaToken * GetNextRawToken()
void ConvertRefData(ScSingleRefData &rRefData, XclAddress &rXclPos, bool bNatLangRef, bool bTruncMaxCol, bool bTruncMaxRow) const
void ProcessExternal(const XclExpScToken &rTokData)
bool IsRef2D(const ScSingleRefData &rRefData, bool bCheck3DFlag) const
void ProcessString(const XclExpScToken &rTokData)
XclTokenArrayRef CreateTokenArray()
XclExpScToken IntersectTerm(XclExpScToken aTokData, bool &rbHasRefOp)
XclExpCompDataRef mxData
Excel function data provider.
XclExpScToken AddSubTerm(XclExpScToken aTokData, bool bInParentheses)
void ProcessDefinedName(const XclExpScToken &rTokData)
SCTAB GetScTab(const ScSingleRefData &rRefData) const
void ProcessMatrix(const XclExpScToken &rTokData)
void AppendBoolToken(bool bValue, sal_uInt8 nSpaces=0)
XclExpScToken RangeTerm(XclExpScToken aTokData, bool &rbHasRefOp)
void AppendFuncToken(const XclExpFuncData &rFuncData)
void AppendTrailingParam(XclExpFuncData &rFuncData)
void RecalcTokenClass(const XclExpTokenConvInfo &rConvInfo, XclFuncParamConv ePrevConv, XclExpClassConv ePrevClassConv, bool bWasRefClass)
void AppendParenToken(sal_uInt8 nOpenSpaces=0, sal_uInt8 nCloseSpaces=0)
void ProcessRangeRef(const XclExpScToken &rTokData)
void AppendNumToken(double fValue, sal_uInt8 nSpaces=0)
void ProcessBoolean(const XclExpScToken &rTokData)
XclExpScToken ConcatTerm(XclExpScToken aTokData, bool bInParentheses)
const XclBiff meBiff
Stack for working data, when compiler is called recursively.
void AppendNameToken(sal_uInt16 nNameIdx, sal_uInt8 nSpaces=0)
XclExpScToken GetNextToken()
void Init(XclFormulaType eType)
XclExpScToken Expression(XclExpScToken aTokData, bool bInParentheses, bool bStopAtSep)
XclExpScToken ProcessParam(XclExpScToken aTokData, XclExpFuncData &rFuncData)
bool Is3DRefOnly(XclFormulaType eType) const
Returns true, if the passed formula type allows 3D references only.
void AppendExt(sal_uInt8 nData)
void AppendNameXToken(sal_uInt16 nExtSheet, sal_uInt16 nExtName, sal_uInt8 nSpaces=0)
XclTokenArrayRef CreateFormula(XclFormulaType eType, const ScTokenArray &rScTokArr, const ScAddress *pScBasePos=nullptr, XclExpRefLog *pRefLog=nullptr)
Creates an Excel token array from the passed Calc token array.
void AppendSpaceToken(sal_uInt8 nType, sal_uInt8 nCount)
const sal_uInt32 mnMaxRowMask
Mask to delete invalid bits in column fields.
void PrepareParam(XclExpFuncData &rFuncData)
void AppendJumpToken(XclExpFuncData &rFuncData, sal_uInt8 nAttrType)
XclTokenArrayRef CreateNameXFormula(sal_uInt16 nExtSheet, sal_uInt16 nExtName)
Creates a single tNameXR token for a reference to an external name.
Stores all data for internal/external references (the link table).
Manager that stores all internal defined names (NAME records) of the document.
sal_uInt16 InsertRawName(const OUString &rName)
Returns index of an existing name, or creates a name without definition.
SCTAB GetScTab(sal_uInt16 nNameIdx) const
Returns the Calc sheet of a local defined name, or SCTAB_GLOBAL for global defined names.
sal_uInt16 InsertName(SCTAB nTab, sal_uInt16 nScNameIdx, SCTAB nCurrTab)
Inserts the Calc name with the passed index and returns the Excel NAME index.
bool IsVolatile(sal_uInt16 nNameIdx) const
Returns true, if the specified defined name is volatile.
sal_uInt16 InsertMacroCall(const OUString &rMacroName, bool bVBasic, bool bFunc, bool bHidden=false)
Searches or inserts a defined name describing a macro name.
Access to global data from other classes.
XclExpLinkManager & GetGlobalLinkManager() const
Returns the global link manager for defined names.
XclExpNameManager & GetNameManager() const
Returns the buffer that contains internal defined names.
XclExpLinkManager & GetLocalLinkManager() const
Returns the local link manager for the current sheet.
const XclExpRoot & GetRoot() const
Returns this root instance - for code readability in derived classes.
static XclExpStringRef CreateString(const XclExpRoot &rRoot, const OUString &rString, XclStrFlags nFlags=XclStrFlags::NONE, sal_uInt16 nMaxLen=EXC_STR_MAXLEN)
Creates a new unformatted string from the passed string.
Provides access to function info structs for all available functions.
const XclFunctionInfo * GetFuncInfoFromOpCode(OpCode eOpCode) const
Returns the function data for a Calc opcode, or 0 on error.
XclOutput GetOutput() const
Returns the current output format of the importer/exporter.
LanguageType GetUILanguage() const
Returns the UI language.
SCTAB GetCurrScTab() const
Returns the current Calc sheet index.
ScDocument & GetDoc() const
Returns reference to the destination document (import) or source document (export).
A helper with Excel specific token array functions.
static sal_uInt8 GetTokenClass(sal_uInt8 nTokenId)
Returns the token class of the passed token ID.
static sal_uInt8 GetTokenId(sal_uInt8 nBaseId, sal_uInt8 nTokenClass)
Returns the classified token ID from a base ID and the token class.
static void ChangeTokenClass(sal_uInt8 &rnTokenId, sal_uInt8 nTokenClass)
Changes the token class in the passed classified token ID.
Special token array iterator for the Excel filters.
const ::formula::FormulaToken * Get() const
const OUString & getString() const
#define SC_OPCODE_START_NO_PAR
#define SAL_WARN(area, stream)
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
std::shared_ptr< T > make_shared(Args &&... args)
Complex reference (a range) into the sheet.
SC_DLLPUBLIC ScRange toAbs(const ScSheetLimits &rLimits, const ScAddress &rPos) const
void InitRange(const ScRange &rRange)
Try NOT to use this struct.
FormulaError GetError() const
Only valid if ScMatrix methods indicate that this is no string!
const svl::SharedString & GetString() const
Only valid if ScMatrix methods indicate so!
bool GetBoolean() const
Only valid if ScMatrix methods indicate that this is a boolean.
Single reference (one address) into the sheet.
void SetAddress(const ScSheetLimits &rLimits, const ScAddress &rAddr, const ScAddress &rPos)
void InitAddress(const ScAddress &rAdr)
InitAddress: InitFlags and set address.
bool IsRowDeleted() const
void SetColDeleted(bool bVal)
void SetRelTab(SCTAB nVal)
ScAddress toAbs(const ScSheetLimits &rLimits, const ScAddress &rPos) const
bool IsTabDeleted() const
void SetFlag3D(bool bVal)
void SetRowDeleted(bool bVal)
bool IsColDeleted() const
A 2D cell address struct with Excel column and row indexes.
Log entry for external references in a formula, used i.e.
XclExpRefLogEntry()
Calc index of the last sheet.
Structure that contains all needed information for a parameter in a function.
bool mbValType
Token class conversion type.
XclFuncParamConv meConv
Parameter validity.
Represents information for a spreadsheet function for import and export.
OUString GetMacroFuncName() const
Returns the name of the external function as string.
OUString GetAddInEquivalentFuncName() const
Returns the programmatical name of the Add-In function as string.
bool IsMacroFunc() const
Returns true, if the function is simulated by a macro call.
bool IsAddInEquivalent() const
Returns true, if the function is stored as an add-in call.
A 2D cell range address struct with Excel column and row indexes.
std::shared_ptr< XclExpString > XclExpStringRef
const SCTAB SCTAB_INVALID
An invalid Excel sheet index, for common use.
const sal_uInt8 EXC_ERR_NA
const sal_uInt8 EXC_ERR_REF
const SCTAB SCTAB_GLOBAL
An invalid Calc sheet index, for common use.
const sal_uInt8 EXC_ERR_NAME
const sal_uInt8 EXC_CACHEDVAL_ERROR
const sal_uInt8 EXC_CACHEDVAL_STRING
XclBiff
An enumeration for all Excel file format types (BIFF types).
@ EXC_BIFF8
MS Excel 5.0, MS Excel 7.0 (95)
@ EXC_OUTPUT_XML_2007
MS Excel binary .xls.
const sal_uInt8 EXC_CACHEDVAL_EMPTY
const sal_uInt8 EXC_CACHEDVAL_BOOL
const sal_uInt8 EXC_CACHEDVAL_DOUBLE
const sal_Unicode EXC_EXTSH_OWNDOC
const sal_uInt16 EXC_TAB_DELETED
Special sheet index for external links.
XclStrFlags
Flags used to specify import/export mode of strings.
@ EightBitLength
Always use UCS-2 characters (default: try to compress). BIFF8 only.