summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2015-04-08 18:06:44 +0200
committerEike Rathke <erack@redhat.com>2015-04-08 20:45:46 +0200
commit315e1cace3c1384fc37b1a36f48150f7d8afd43c (patch)
tree043d29bdbb697a4de64012ade5a3467cb8b62e65 /sc
parent2a176c2f658f30cf8b33d9338e931ebf01fd0f3d (diff)
TableRef: keywords come with extra brackets each
Change-Id: Ie12264c02d178be9bc5752e7ea20b4feff409e68
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/tool/compiler.cxx72
1 files changed, 64 insertions, 8 deletions
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 400be9a7f3bd..ea752c305e88 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -1986,7 +1986,7 @@ Label_MaskStateMachine:
else if( nMask & SC_COMPILER_C_CHAR_ERRCONST )
{
*pSym++ = c;
- if (!maTableRefs.empty() && maTableRefs.back().mnLevel)
+ if (!maTableRefs.empty() && maTableRefs.back().mnLevel == 2)
eState = ssGetTableRefItem;
else
eState = ssGetErrorConstant;
@@ -3664,7 +3664,7 @@ bool ScCompiler::NextNewToken( bool bInArray )
if (cSymbol[0] == '#')
{
// Check for TableRef item specifiers first.
- if (!maTableRefs.empty())
+ if (!maTableRefs.empty() && maTableRefs.back().mnLevel == 2)
{
if (IsTableRefItem( aUpper ))
return true;
@@ -4859,8 +4859,70 @@ bool ScCompiler::HandleTableRef()
}
break;
}
+ bool bColumnRange = false;
+ if (bForwardToClose && (bGotToken = GetToken()) && mpToken->GetOpCode() == ocTableRefOpen)
+ {
+ int nLevel = 1;
+ enum
+ {
+ sOpen,
+ sItem,
+ sClose,
+ sSep,
+ sStop
+ } eState = sOpen;
+ do
+ {
+ if ((bGotToken = GetToken()))
+ {
+ switch (mpToken->GetOpCode())
+ {
+ case ocTableRefOpen:
+ eState = ((eState == sOpen || eState == sSep) ? sOpen : sStop);
+ if (++nLevel > 2)
+ {
+ SetError( errPair);
+ eState = sStop;
+ }
+ break;
+ case ocTableRefItemAll:
+ case ocTableRefItemHeaders:
+ case ocTableRefItemData:
+ case ocTableRefItemTotals:
+ case ocTableRefItemThisRow:
+ eState = ((eState == sOpen) ? sItem : sStop);
+ break;
+ case ocTableRefClose:
+ eState = ((eState == sItem || eState == sClose) ? sClose : sStop);
+ if (--nLevel <= 0)
+ {
+ if (nLevel < 0)
+ SetError( errPair);
+ eState = sStop;
+ }
+ break;
+ case ocSep:
+ eState = ((eState == sClose) ? sSep : sStop);
+ break;
+ case ocPush:
+ if (mpToken->GetType() == svSingleRef || mpToken->GetType() == svDoubleRef)
+ bColumnRange = true;
+ eState = sStop;
+ break;
+ default:
+ eState = sStop;
+ }
+ }
+ } while (bGotToken && eState != sStop);
+ if (bGotToken && mpToken->GetOpCode() == ocTableRefClose)
+ bGotToken = false; // get next token below in return
+ }
if (bAddRange)
{
+ if (bColumnRange)
+ {
+ /* TODO: limit range to specified columns */
+ }
ScComplexRefData aRefData;
aRefData.InitFlags();
aRefData.SetRange( aRange, aPos);
@@ -4870,12 +4932,6 @@ bool ScCompiler::HandleTableRef()
{
SetError( errNoRef);
}
- if (bForwardToClose)
- {
- while ((bGotToken = GetToken()) && mpToken->GetOpCode() != ocTableRefClose)
- ;
- bGotToken = false; // get next token below
- }
PushTokenArray( pNew, true );
pNew->Reset();
return bGotToken ? true : GetToken();