summaryrefslogtreecommitdiff
path: root/sc/source
diff options
context:
space:
mode:
authorEike Rathke <er@openoffice.org>2001-02-21 17:39:37 +0000
committerEike Rathke <er@openoffice.org>2001-02-21 17:39:37 +0000
commitb0fa32d0afbd3bc0d2d15ea465c29b391610b9f8 (patch)
tree86ad5095a70dccc1ed9dc62557d02a520a1ac651 /sc/source
parentd521b08f678450801e66c9a9f6bb17277281333f (diff)
new class ScToken and derived
Diffstat (limited to 'sc/source')
-rw-r--r--sc/source/core/data/cell.cxx169
-rw-r--r--sc/source/core/data/cell2.cxx189
-rw-r--r--sc/source/core/data/conditio.cxx73
-rw-r--r--sc/source/core/data/documen4.cxx9
-rw-r--r--sc/source/core/inc/interpre.hxx31
-rw-r--r--sc/source/core/tool/chgtrack.cxx64
-rw-r--r--sc/source/core/tool/compiler.cxx589
-rw-r--r--sc/source/core/tool/interpr1.cxx156
-rw-r--r--sc/source/core/tool/interpr2.cxx25
-rw-r--r--sc/source/core/tool/interpr4.cxx343
-rw-r--r--sc/source/core/tool/interpr5.cxx22
-rw-r--r--sc/source/core/tool/rangenam.cxx76
-rw-r--r--sc/source/core/tool/refdata.cxx70
-rw-r--r--sc/source/core/tool/token.cxx786
-rw-r--r--sc/source/filter/inc/imp_op.hxx6
-rw-r--r--sc/source/filter/inc/tokstack.hxx6
-rw-r--r--sc/source/ui/miscdlgs/anyrefdg.cxx20
17 files changed, 1546 insertions, 1088 deletions
diff --git a/sc/source/core/data/cell.cxx b/sc/source/core/data/cell.cxx
index 5b1bd73f8678..15d85074d66e 100644
--- a/sc/source/core/data/cell.cxx
+++ b/sc/source/core/data/cell.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: cell.cxx,v $
*
- * $Revision: 1.6 $
+ * $Revision: 1.7 $
*
- * last change: $Author: er $ $Date: 2001-02-13 18:58:28 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:29:35 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -119,8 +119,6 @@
// STATIC DATA -----------------------------------------------------------
-#pragma code_seg("SCSTATICS")
-
#ifdef USE_MEMPOOL
// MemPools auf 4k Boundaries - 64 Bytes ausrichten
const USHORT nMemPoolValueCell = (0x8000 - 64) / sizeof(ScValueCell);
@@ -264,60 +262,64 @@ void ScBaseCell::StartListeningTo( ScDocument* pDoc, BOOL bOnlyRelNames )
for( ScToken* t = pArr->GetNextReferenceRPN(); t;
t = pArr->GetNextReferenceRPN() )
{
+ StackVar eType = t->GetType();
+ SingleRefData& rRef1 = t->GetSingleRef();
+ SingleRefData& rRef2 = (eType == svDoubleRef ?
+ t->GetDoubleRef().Ref2 : rRef1);
if ( !bOnlyRelNames || (bOnlyRelNames
- && (t->aRef.Ref1.IsRelName() || t->aRef.Ref2.IsRelName())))
+ && (rRef1.IsRelName() || rRef2.IsRelName())))
{
- switch( t->GetType() )
+ switch( eType )
{
case svSingleRef:
- t->aRef.Ref1.CalcAbsIfRel( pFormCell->aPos );
- if ( t->aRef.Ref1.Valid() )
+ rRef1.CalcAbsIfRel( pFormCell->aPos );
+ if ( rRef1.Valid() )
{
pDoc->StartListeningCell(
- ScAddress( t->aRef.Ref1.nCol,
- t->aRef.Ref1.nRow,
- t->aRef.Ref1.nTab ), pFormCell );
+ ScAddress( rRef1.nCol,
+ rRef1.nRow,
+ rRef1.nTab ), pFormCell );
}
- break;
+ break;
case svDoubleRef:
- t->aRef.CalcAbsIfRel( pFormCell->aPos );
- if ( t->aRef.Valid() )
+ t->CalcAbsIfRel( pFormCell->aPos );
+ if ( rRef1.Valid() && rRef2.Valid() )
{
if ( t->GetOpCode() == ocColRowNameAuto )
{ // automagically
- if ( t->aRef.Ref1.IsColRel() )
+ if ( rRef1.IsColRel() )
{ // ColName
pDoc->StartListeningArea( ScRange (
0,
- t->aRef.Ref1.nRow,
- t->aRef.Ref1.nTab,
+ rRef1.nRow,
+ rRef1.nTab,
MAXCOL,
- t->aRef.Ref2.nRow,
- t->aRef.Ref2.nTab ), pFormCell );
+ rRef2.nRow,
+ rRef2.nTab ), pFormCell );
}
else
{ // RowName
pDoc->StartListeningArea( ScRange (
- t->aRef.Ref1.nCol,
+ rRef1.nCol,
0,
- t->aRef.Ref1.nTab,
- t->aRef.Ref2.nCol,
+ rRef1.nTab,
+ rRef2.nCol,
MAXROW,
- t->aRef.Ref2.nTab ), pFormCell );
+ rRef2.nTab ), pFormCell );
}
}
else
{
pDoc->StartListeningArea( ScRange (
- t->aRef.Ref1.nCol,
- t->aRef.Ref1.nRow,
- t->aRef.Ref1.nTab,
- t->aRef.Ref2.nCol,
- t->aRef.Ref2.nRow,
- t->aRef.Ref2.nTab ), pFormCell );
+ rRef1.nCol,
+ rRef1.nRow,
+ rRef1.nTab,
+ rRef2.nCol,
+ rRef2.nRow,
+ rRef2.nTab ), pFormCell );
}
}
- break;
+ break;
}
}
}
@@ -351,60 +353,64 @@ void ScBaseCell::EndListeningTo( ScDocument* pDoc, BOOL bOnlyRelNames,
for( ScToken* t = pArr->GetNextReferenceRPN(); t;
t = pArr->GetNextReferenceRPN() )
{
+ StackVar eType = t->GetType();
+ SingleRefData& rRef1 = t->GetSingleRef();
+ SingleRefData& rRef2 = (eType == svDoubleRef ?
+ t->GetDoubleRef().Ref2 : rRef1);
if ( !bOnlyRelNames || (bOnlyRelNames
- && (t->aRef.Ref1.IsRelName() || t->aRef.Ref2.IsRelName())))
+ && (rRef1.IsRelName() || rRef2.IsRelName())))
{
switch( t->GetType() )
{
case svSingleRef:
- t->aRef.Ref1.CalcAbsIfRel( aPos );
- if ( t->aRef.Ref1.Valid() )
+ rRef1.CalcAbsIfRel( aPos );
+ if ( rRef1.Valid() )
{
pDoc->EndListeningCell(
- ScAddress( t->aRef.Ref1.nCol,
- t->aRef.Ref1.nRow,
- t->aRef.Ref1.nTab ), pFormCell );
+ ScAddress( rRef1.nCol,
+ rRef1.nRow,
+ rRef1.nTab ), pFormCell );
}
- break;
+ break;
case svDoubleRef:
- t->aRef.CalcAbsIfRel( aPos );
- if ( t->aRef.Valid() )
+ t->CalcAbsIfRel( aPos );
+ if ( rRef1.Valid() && rRef2.Valid() )
{
if ( t->GetOpCode() == ocColRowNameAuto )
{ // automagically
- if ( t->aRef.Ref1.IsColRel() )
+ if ( rRef1.IsColRel() )
{ // ColName
pDoc->EndListeningArea( ScRange (
0,
- t->aRef.Ref1.nRow,
- t->aRef.Ref1.nTab,
+ rRef1.nRow,
+ rRef1.nTab,
MAXCOL,
- t->aRef.Ref2.nRow,
- t->aRef.Ref2.nTab ), pFormCell );
+ rRef2.nRow,
+ rRef2.nTab ), pFormCell );
}
else
{ // RowName
pDoc->EndListeningArea( ScRange (
- t->aRef.Ref1.nCol,
+ rRef1.nCol,
0,
- t->aRef.Ref1.nTab,
- t->aRef.Ref2.nCol,
+ rRef1.nTab,
+ rRef2.nCol,
MAXROW,
- t->aRef.Ref2.nTab ), pFormCell );
+ rRef2.nTab ), pFormCell );
}
}
else
{
pDoc->EndListeningArea( ScRange (
- t->aRef.Ref1.nCol,
- t->aRef.Ref1.nRow,
- t->aRef.Ref1.nTab,
- t->aRef.Ref2.nCol,
- t->aRef.Ref2.nRow,
- t->aRef.Ref2.nTab ), pFormCell );
+ rRef1.nCol,
+ rRef1.nRow,
+ rRef1.nTab,
+ rRef2.nCol,
+ rRef2.nRow,
+ rRef2.nTab ), pFormCell );
}
}
- break;
+ break;
}
}
}
@@ -697,7 +703,7 @@ ScFormulaCell::ScFormulaCell( ScDocument* pDoc, const ScAddress& rNewPos,
{
if ( t->GetType() == svIndex )
{
- ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex( t->nIndex );
+ ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex( t->GetIndex() );
if( pRangeData )
{
if( pRangeData->HasReferences() )
@@ -845,7 +851,9 @@ BOOL lcl_IsBeyond( ScTokenArray* pCode, USHORT nMaxRow )
ScToken* t;
pCode->Reset();
while ( t = pCode->GetNextReferenceRPN() ) // RPN -> auch in Namen
- if ( t->aRef.Ref1.nRow > nMaxRow || t->aRef.Ref2.nRow > nMaxRow )
+ if ( t->GetSingleRef().nRow > nMaxRow ||
+ (t->GetType() == svDoubleRef &&
+ t->GetDoubleRef().Ref2.nRow > nMaxRow) )
return TRUE;
return FALSE;
}
@@ -941,10 +949,11 @@ void ScFormulaCell::GetFormula( String& rFormula ) const
ScBaseCell* pCell = NULL;
if ( !IsInChangeTrack() )
{
- p->aRef.Ref1.CalcAbsIfRel( aPos );
- if ( p->aRef.Ref1.Valid() )
- pCell = pDocument->GetCell( ScAddress( p->aRef.Ref1.nCol,
- p->aRef.Ref1.nRow, p->aRef.Ref1.nTab ) );
+ SingleRefData& rRef = p->GetSingleRef();
+ rRef.CalcAbsIfRel( aPos );
+ if ( rRef.Valid() )
+ pCell = pDocument->GetCell( ScAddress( rRef.nCol,
+ rRef.nRow, rRef.nTab ) );
}
if (pCell && pCell->GetCellType() == CELLTYPE_FORMULA)
{
@@ -1553,32 +1562,46 @@ ScDetectiveRefIter::ScDetectiveRefIter( ScFormulaCell* pCell )
aPos = pCell->aPos;
}
+BOOL lcl_ScDetectiveRefIter_SkipRef( ScToken* p )
+{
+ SingleRefData& rRef1 = p->GetSingleRef();
+ if ( rRef1.IsColDeleted() || rRef1.IsRowDeleted() || rRef1.IsTabDeleted()
+ || !rRef1.Valid() )
+ return TRUE;
+ if ( p->GetType() == svDoubleRef )
+ {
+ SingleRefData& rRef2 = p->GetDoubleRef().Ref2;
+ if ( rRef2.IsColDeleted() || rRef2.IsRowDeleted() || rRef2.IsTabDeleted()
+ || !rRef2.Valid() )
+ return TRUE;
+ }
+ return FALSE;
+}
+
BOOL ScDetectiveRefIter::GetNextRef( ScTripel& rStart, ScTripel& rEnd )
{
BOOL bRet = FALSE;
ScToken* p = pCode->GetNextReferenceRPN();
if (p)
- p->aRef.CalcAbsIfRel( aPos );
+ p->CalcAbsIfRel( aPos );
- while ( p && ( p->aRef.Ref1.IsColDeleted() || p->aRef.Ref2.IsColDeleted() ||
- p->aRef.Ref1.IsRowDeleted() || p->aRef.Ref2.IsRowDeleted() ||
- p->aRef.Ref1.IsTabDeleted() || p->aRef.Ref2.IsTabDeleted() ||
- !p->aRef.Ref1.Valid() || !p->aRef.Ref2.Valid() ) )
+ while ( p && lcl_ScDetectiveRefIter_SkipRef( p ) )
{
p = pCode->GetNextReferenceRPN();
if (p)
- p->aRef.CalcAbsIfRel( aPos );
+ p->CalcAbsIfRel( aPos );
}
if( p )
{
- rStart.Put( p->aRef.Ref1.nCol,
- p->aRef.Ref1.nRow,
- p->aRef.Ref1.nTab );
- rEnd.Put( p->aRef.Ref2.nCol,
- p->aRef.Ref2.nRow,
- p->aRef.Ref2.nTab );
+ SingleDoubleRefProvider aProv( *p );
+ rStart.Put( aProv.Ref1.nCol,
+ aProv.Ref1.nRow,
+ aProv.Ref1.nTab );
+ rEnd.Put( aProv.Ref2.nCol,
+ aProv.Ref2.nRow,
+ aProv.Ref2.nTab );
bRet = TRUE;
}
diff --git a/sc/source/core/data/cell2.cxx b/sc/source/core/data/cell2.cxx
index 7b679fc8f26e..8c8e6224a516 100644
--- a/sc/source/core/data/cell2.cxx
+++ b/sc/source/core/data/cell2.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: cell2.cxx,v $
*
- * $Revision: 1.7 $
+ * $Revision: 1.8 $
*
- * last change: $Author: er $ $Date: 2001-02-13 18:58:28 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:29:35 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -284,10 +284,11 @@ void ScFormulaCell::GetEnglishFormula( String& rFormula, BOOL bCompileXML ) cons
if( p )
{
ScBaseCell* pCell;
- p->aRef.Ref1.CalcAbsIfRel( aPos );
- if ( p->aRef.Ref1.Valid() )
- pCell = pDocument->GetCell( ScAddress( p->aRef.Ref1.nCol,
- p->aRef.Ref1.nRow, p->aRef.Ref1.nTab ) );
+ SingleRefData& rRef = p->GetSingleRef();
+ rRef.CalcAbsIfRel( aPos );
+ if ( rRef.Valid() )
+ pCell = pDocument->GetCell( ScAddress( rRef.nCol,
+ rRef.nRow, rRef.nTab ) );
else
pCell = NULL;
if (pCell && pCell->GetCellType() == CELLTYPE_FORMULA)
@@ -390,10 +391,11 @@ BOOL ScFormulaCell::GetMatrixOrigin( ScAddress& rPos ) const
ScToken* t = pCode->GetNextReferenceRPN();
if( t )
{
- t->aRef.Ref1.CalcAbsIfRel( aPos );
- if ( t->aRef.Ref1.Valid() )
+ SingleRefData& rRef = t->GetSingleRef();
+ rRef.CalcAbsIfRel( aPos );
+ if ( rRef.Valid() )
{
- rPos.Set( t->aRef.Ref1.nCol, t->aRef.Ref1.nRow, t->aRef.Ref1.nTab );
+ rPos.Set( rRef.nCol, rRef.nRow, rRef.nTab );
return TRUE;
}
}
@@ -554,13 +556,14 @@ BOOL ScFormulaCell::HasOneReference( ScRange& r ) const
ScToken* p = pCode->GetNextReferenceRPN();
if( p && !pCode->GetNextReferenceRPN() ) // nur eine!
{
- p->aRef.CalcAbsIfRel( aPos );
- r.aStart.Set( p->aRef.Ref1.nCol,
- p->aRef.Ref1.nRow,
- p->aRef.Ref1.nTab );
- r.aEnd.Set( p->aRef.Ref2.nCol,
- p->aRef.Ref2.nRow,
- p->aRef.Ref2.nTab );
+ p->CalcAbsIfRel( aPos );
+ SingleDoubleRefProvider aProv( *p );
+ r.aStart.Set( aProv.Ref1.nCol,
+ aProv.Ref1.nRow,
+ aProv.Ref1.nTab );
+ r.aEnd.Set( aProv.Ref2.nCol,
+ aProv.Ref2.nRow,
+ aProv.Ref2.nTab );
return TRUE;
}
else
@@ -573,7 +576,9 @@ BOOL ScFormulaCell::HasRelNameReference() const
for( ScToken* t = pCode->GetNextReferenceRPN(); t;
t = pCode->GetNextReferenceRPN() )
{
- if ( t->aRef.Ref1.IsRelName() || t->aRef.Ref2.IsRelName() )
+ if ( t->GetSingleRef().IsRelName() ||
+ (t->GetType() == svDoubleRef &&
+ t->GetDoubleRef().Ref2.IsRelName()) )
return TRUE;
}
return FALSE;
@@ -715,9 +720,9 @@ void ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode,
pCode->Reset();
while ( !bColRowNameCompile && (t = pCode->GetNextColRowName()) )
{
- if ( nDy > 0 && t->aRef.Ref1.IsColRel() )
+ SingleRefData& rRef = t->GetSingleRef();
+ if ( nDy > 0 && rRef.IsColRel() )
{ // ColName
- SingleRefData& rRef = t->aRef.Ref1;
rRef.CalcAbsIfRel( aPos );
ScAddress aAdr( rRef.nCol, rRef.nRow, rRef.nTab );
ScRangePair* pR = pColList->Find( aAdr );
@@ -728,13 +733,12 @@ void ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode,
}
else
{ // on the fly
- if ( t->aRef.Ref1.nRow + 1 == nRow1 )
+ if ( rRef.nRow + 1 == nRow1 )
bColRowNameCompile = TRUE;
}
}
- if ( nDx > 0 && t->aRef.Ref1.IsRowRel() )
+ if ( nDx > 0 && rRef.IsRowRel() )
{ // RowName
- SingleRefData& rRef = t->aRef.Ref1;
rRef.CalcAbsIfRel( aPos );
ScAddress aAdr( rRef.nCol, rRef.nRow, rRef.nTab );
ScRangePair* pR = pRowList->Find( aAdr );
@@ -745,7 +749,7 @@ void ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode,
}
else
{ // on the fly
- if ( t->aRef.Ref1.nCol + 1 == nCol1 )
+ if ( rRef.nCol + 1 == nCol1 )
bColRowNameCompile = TRUE;
}
}
@@ -764,7 +768,7 @@ void ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode,
bColRowNameCompile = TRUE;
while ( t && !bColRowNameCompile )
{
- SingleRefData& rRef = t->aRef.Ref1;
+ SingleRefData& rRef = t->GetSingleRef();
rRef.CalcAbsIfRel( aPos );
if ( rRef.Valid() )
{
@@ -965,15 +969,15 @@ void ScFormulaCell::UpdateInsertTabAbs(USHORT nTable)
ScToken* p = pCode->GetNextReferenceRPN();
while( p )
{
- if( !p->aRef.Ref1.IsTabRel() && (short) nTable <= p->aRef.Ref1.nTab )
- p->aRef.Ref1.nTab++;
+ SingleRefData& rRef1 = p->GetSingleRef();
+ if( !rRef1.IsTabRel() && (short) nTable <= rRef1.nTab )
+ rRef1.nTab++;
if( p->GetType() == svDoubleRef )
{
- if( !p->aRef.Ref2.IsTabRel() && (short) nTable <= p->aRef.Ref2.nTab )
- p->aRef.Ref2.nTab++;
+ SingleRefData& rRef2 = p->GetDoubleRef().Ref2;
+ if( !rRef2.IsTabRel() && (short) nTable <= rRef2.nTab )
+ rRef2.nTab++;
}
- else
- p->aRef.Ref2.nTab = p->aRef.Ref1.nTab;
p = pCode->GetNextReferenceRPN();
}
}
@@ -988,25 +992,25 @@ BOOL ScFormulaCell::TestTabRefAbs(USHORT nTable)
ScToken* p = pCode->GetNextReferenceRPN();
while( p )
{
- if( !p->aRef.Ref1.IsTabRel() )
+ SingleRefData& rRef1 = p->GetSingleRef();
+ if( !rRef1.IsTabRel() )
{
- if( (short) nTable != p->aRef.Ref1.nTab )
+ if( (short) nTable != rRef1.nTab )
bRet = TRUE;
else if (nTable != aPos.Tab())
- p->aRef.Ref1.nTab = aPos.Tab();
+ rRef1.nTab = aPos.Tab();
}
if( p->GetType() == svDoubleRef )
{
- if( !p->aRef.Ref2.IsTabRel() )
+ SingleRefData& rRef2 = p->GetDoubleRef().Ref2;
+ if( !rRef2.IsTabRel() )
{
- if( (short)nTable != p->aRef.Ref1.nTab )
+ if( (short) nTable != rRef2.nTab )
bRet = TRUE;
else if (nTable != aPos.Tab())
- p->aRef.Ref2.nTab = aPos.Tab();
+ rRef2.nTab = aPos.Tab();
}
}
- else
- p->aRef.Ref2.nTab = p->aRef.Ref1.nTab;
p = pCode->GetNextReferenceRPN();
}
}
@@ -1031,20 +1035,28 @@ void ScFormulaCell::TransposeReference()
for( ScToken* t = pCode->GetNextReference(); t;
t = pCode->GetNextReference() )
{
- if ( t->aRef.Ref1.IsColRel() && t->aRef.Ref1.IsRowRel() &&
- t->aRef.Ref2.IsColRel() && t->aRef.Ref2.IsRowRel() )
+ SingleRefData& rRef1 = t->GetSingleRef();
+ if ( rRef1.IsColRel() && rRef1.IsRowRel() )
{
- INT16 nTemp;
+ BOOL bDouble = (t->GetType() == svDoubleRef);
+ SingleRefData& rRef2 = (bDouble ? t->GetDoubleRef().Ref2 : rRef1);
+ if ( !bDouble || (rRef2.IsColRel() && rRef2.IsRowRel()) )
+ {
+ INT16 nTemp;
- nTemp = t->aRef.Ref1.nRelCol;
- t->aRef.Ref1.nRelCol = t->aRef.Ref1.nRelRow;
- t->aRef.Ref1.nRelRow = nTemp;
+ nTemp = rRef1.nRelCol;
+ rRef1.nRelCol = rRef1.nRelRow;
+ rRef1.nRelRow = nTemp;
- nTemp = t->aRef.Ref2.nRelCol;
- t->aRef.Ref2.nRelCol = t->aRef.Ref2.nRelRow;
- t->aRef.Ref2.nRelRow = nTemp;
+ if ( bDouble )
+ {
+ nTemp = rRef2.nRelCol;
+ rRef2.nRelCol = rRef2.nRelRow;
+ rRef2.nRelRow = nTemp;
+ }
- bFound = TRUE;
+ bFound = TRUE;
+ }
}
}
@@ -1085,7 +1097,7 @@ void ScFormulaCell::UpdateTranspose( const ScRange& rSource, const ScAddress& rD
{
if( t->GetOpCode() == ocName )
{
- ScRangeData* pName = pDocument->GetRangeName()->FindIndex( t->nIndex );
+ ScRangeData* pName = pDocument->GetRangeName()->FindIndex( t->GetIndex() );
if (pName)
{
if (pName->IsModified())
@@ -1096,11 +1108,19 @@ void ScFormulaCell::UpdateTranspose( const ScRange& rSource, const ScAddress& rD
}
else if( t->GetType() != svIndex )
{
- t->aRef.CalcAbsIfRel( aOldPos );
- if ( ScRefUpdate::UpdateTranspose( pDocument, rSource, rDest, t->aRef ) != UR_NOTHING
- || bPosChanged )
+ t->CalcAbsIfRel( aOldPos );
+ BOOL bMod;
+ { // own scope for SingleDoubleRefModifier dtor if SingleRef
+ SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ?
+ SingleDoubleRefModifier( t->GetSingleRef() ) :
+ SingleDoubleRefModifier( t->GetDoubleRef() ));
+ ComplRefData& rRef = rMod.Ref();
+ bMod = (ScRefUpdate::UpdateTranspose( pDocument, rSource,
+ rDest, rRef ) != UR_NOTHING || bPosChanged);
+ }
+ if ( bMod )
{
- t->aRef.CalcRelFromAbs( aPos );
+ t->CalcRelFromAbs( aPos );
bChanged = TRUE;
}
}
@@ -1117,12 +1137,18 @@ void ScFormulaCell::UpdateTranspose( const ScRange& rSource, const ScAddress& rD
{
if( t->GetType() != svIndex )
{
- t->aRef.CalcAbsIfRel( aOldPos );
- if ( ScRefUpdate::UpdateTranspose( pDocument, rSource, rDest, t->aRef ) != UR_NOTHING
- || bPosChanged )
- {
- t->aRef.CalcRelFromAbs( aPos );
+ t->CalcAbsIfRel( aOldPos );
+ BOOL bMod;
+ { // own scope for SingleDoubleRefModifier dtor if SingleRef
+ SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ?
+ SingleDoubleRefModifier( t->GetSingleRef() ) :
+ SingleDoubleRefModifier( t->GetDoubleRef() ));
+ ComplRefData& rRef = rMod.Ref();
+ bMod = (ScRefUpdate::UpdateTranspose( pDocument, rSource,
+ rDest, rRef ) != UR_NOTHING || bPosChanged);
}
+ if ( bMod )
+ t->CalcRelFromAbs( aPos );
}
}
}
@@ -1159,7 +1185,7 @@ void ScFormulaCell::UpdateGrow( const ScRange& rArea, USHORT nGrowX, USHORT nGro
{
if( t->GetOpCode() == ocName )
{
- ScRangeData* pName = pDocument->GetRangeName()->FindIndex( t->nIndex );
+ ScRangeData* pName = pDocument->GetRangeName()->FindIndex( t->GetIndex() );
if (pName)
{
if (pName->IsModified())
@@ -1170,10 +1196,19 @@ void ScFormulaCell::UpdateGrow( const ScRange& rArea, USHORT nGrowX, USHORT nGro
}
else if( t->GetType() != svIndex )
{
- t->aRef.CalcAbsIfRel( aPos );
- if ( ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY, t->aRef ) != UR_NOTHING )
+ t->CalcAbsIfRel( aPos );
+ BOOL bMod;
+ { // own scope for SingleDoubleRefModifier dtor if SingleRef
+ SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ?
+ SingleDoubleRefModifier( t->GetSingleRef() ) :
+ SingleDoubleRefModifier( t->GetDoubleRef() ));
+ ComplRefData& rRef = rMod.Ref();
+ bMod = (ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY,
+ rRef ) != UR_NOTHING);
+ }
+ if ( bMod )
{
- t->aRef.CalcRelFromAbs( aPos );
+ t->CalcRelFromAbs( aPos );
bChanged = TRUE;
}
}
@@ -1190,9 +1225,18 @@ void ScFormulaCell::UpdateGrow( const ScRange& rArea, USHORT nGrowX, USHORT nGro
{
if( t->GetType() != svIndex )
{
- t->aRef.CalcAbsIfRel( aPos );
- if ( ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY, t->aRef ) != UR_NOTHING )
- t->aRef.CalcRelFromAbs( aPos );
+ t->CalcAbsIfRel( aPos );
+ BOOL bMod;
+ { // own scope for SingleDoubleRefModifier dtor if SingleRef
+ SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ?
+ SingleDoubleRefModifier( t->GetSingleRef() ) :
+ SingleDoubleRefModifier( t->GetDoubleRef() ));
+ ComplRefData& rRef = rMod.Ref();
+ bMod = (ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY,
+ rRef ) != UR_NOTHING);
+ }
+ if ( bMod )
+ t->CalcRelFromAbs( aPos );
}
}
}
@@ -1213,12 +1257,12 @@ BOOL lcl_IsRangeNameInUse(USHORT nIndex, ScTokenArray* pCode, ScRangeName* pName
{
if (p->GetOpCode() == ocName)
{
- if (p->nIndex == nIndex)
+ if (p->GetIndex() == nIndex)
return TRUE;
else
{
// RangeData kann Null sein in bestimmten Excel-Dateien (#31168#)
- ScRangeData* pSubName = pNames->FindIndex(p->nIndex);
+ ScRangeData* pSubName = pNames->FindIndex(p->GetIndex());
if (pSubName && lcl_IsRangeNameInUse(nIndex,
pSubName->GetCode(), pNames))
return TRUE;
@@ -1239,10 +1283,11 @@ void ScFormulaCell::ReplaceRangeNamesInUse( const ScIndexMap& rMap )
{
if( p->GetOpCode() == ocName )
{
- USHORT nNewIndex = rMap.Find( p->nIndex );
- if ( p->nIndex != nNewIndex )
+ USHORT nIndex = p->GetIndex();
+ USHORT nNewIndex = rMap.Find( nIndex );
+ if ( nIndex != nNewIndex )
{
- p->nIndex = nNewIndex;
+ p->SetIndex( nNewIndex );
bCompile = TRUE;
}
}
@@ -1256,7 +1301,7 @@ void ScFormulaCell::CompileDBFormula()
for( ScToken* p = pCode->First(); p; p = pCode->Next() )
{
if ( p->GetOpCode() == ocDBArea
- || (p->GetOpCode() == ocName && p->nIndex >= SC_START_INDEX_DB_COLL) )
+ || (p->GetOpCode() == ocName && p->GetIndex() >= SC_START_INDEX_DB_COLL) )
{
bCompile = TRUE;
CompileTokenArray();
@@ -1285,7 +1330,7 @@ void ScFormulaCell::CompileDBFormula( BOOL bCreateFormulaString )
bRecompile = TRUE;
break;
case ocName:
- if ( p->nIndex >= SC_START_INDEX_DB_COLL )
+ if ( p->GetIndex() >= SC_START_INDEX_DB_COLL )
bRecompile = TRUE; // DB-Bereich
}
}
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index 881b0d4ecd4b..693d542b7614 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: conditio.cxx,v $
*
- * $Revision: 1.3 $
+ * $Revision: 1.4 $
*
- * last change: $Author: nn $ $Date: 2000-12-06 09:14:39 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:29:35 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -97,10 +97,15 @@ BOOL lcl_HasRelRef( ScTokenArray* pFormula )
ScToken* t;
for( t = pFormula->GetNextReference(); t; t = pFormula->GetNextReference() )
{
- ComplRefData& rRef = t->GetReference();
- if ( rRef.Ref1.IsColRel() || rRef.Ref1.IsRowRel() || rRef.Ref1.IsTabRel() ||
- rRef.Ref2.IsColRel() || rRef.Ref2.IsRowRel() || rRef.Ref2.IsTabRel() )
+ SingleRefData& rRef1 = t->GetSingleRef();
+ if ( rRef1.IsColRel() || rRef1.IsRowRel() || rRef1.IsTabRel() )
return TRUE;
+ if ( t->GetType() == svDoubleRef )
+ {
+ SingleRefData& rRef2 = t->GetDoubleRef().Ref2;
+ if ( rRef2.IsColRel() || rRef2.IsRowRel() || rRef2.IsTabRel() )
+ return TRUE;
+ }
}
}
return FALSE;
@@ -220,13 +225,13 @@ ScConditionEntry::ScConditionEntry( ScConditionMode eOper,
{
if ( pToken->GetType() == svDouble )
{
- nVal1 = pToken->nValue;
+ nVal1 = pToken->GetDouble();
DELETEZ(pFormula1); // nicht als Formel merken
}
else if ( pToken->GetType() == svString )
{
bIsStr1 = TRUE;
- aStrVal1 = pToken->cStr; // char-ptr
+ aStrVal1 = pToken->GetString();
DELETEZ(pFormula1); // nicht als Formel merken
}
}
@@ -244,13 +249,13 @@ ScConditionEntry::ScConditionEntry( ScConditionMode eOper,
{
if ( pToken->GetType() == svDouble )
{
- nVal2 = pToken->nValue;
+ nVal2 = pToken->GetDouble();
DELETEZ(pFormula2); // nicht als Formel merken
}
else if ( pToken->GetType() == svString )
{
bIsStr2 = TRUE;
- aStrVal2 = pToken->cStr; // char-ptr
+ aStrVal2 = pToken->GetString();
DELETEZ(pFormula2); // nicht als Formel merken
}
}
@@ -406,13 +411,13 @@ void ScConditionEntry::Compile( const String& rExpr1, const String& rExpr2,
{
if ( pToken->GetType() == svDouble )
{
- nVal1 = pToken->nValue;
+ nVal1 = pToken->GetDouble();
DELETEZ(pFormula1); // nicht als Formel merken
}
else if ( pToken->GetType() == svString )
{
bIsStr1 = TRUE;
- aStrVal1 = pToken->cStr; // char-ptr
+ aStrVal1 = pToken->GetString();
DELETEZ(pFormula1); // nicht als Formel merken
}
}
@@ -431,13 +436,13 @@ void ScConditionEntry::Compile( const String& rExpr1, const String& rExpr2,
{
if ( pToken->GetType() == svDouble )
{
- nVal2 = pToken->nValue;
+ nVal2 = pToken->GetDouble();
DELETEZ(pFormula2); // nicht als Formel merken
}
else if ( pToken->GetType() == svString )
{
bIsStr2 = TRUE;
- aStrVal2 = pToken->cStr; // char-ptr
+ aStrVal2 = pToken->GetString();
DELETEZ(pFormula2); // nicht als Formel merken
}
}
@@ -944,56 +949,56 @@ void ScConditionEntry::SourceChanged( const ScAddress& rChanged )
ScToken* t;
for( t = pFormula->GetNextReference(); t; t = pFormula->GetNextReference() )
{
- ComplRefData& rRef = t->GetReference();
- if ( rRef.Ref1.IsColRel() || rRef.Ref1.IsRowRel() || rRef.Ref1.IsTabRel() ||
- rRef.Ref2.IsColRel() || rRef.Ref2.IsRowRel() || rRef.Ref2.IsTabRel() )
+ SingleDoubleRefProvider aProv( *t );
+ if ( aProv.Ref1.IsColRel() || aProv.Ref1.IsRowRel() || aProv.Ref1.IsTabRel() ||
+ aProv.Ref2.IsColRel() || aProv.Ref2.IsRowRel() || aProv.Ref2.IsTabRel() )
{
// absolut muss getroffen sein, relativ bestimmt Bereich
BOOL bHit = TRUE;
INT16 nCol1, nRow1, nTab1, nCol2, nRow2, nTab2;
- if ( rRef.Ref1.IsColRel() )
- nCol2 = rChanged.Col() - rRef.Ref1.nRelCol;
+ if ( aProv.Ref1.IsColRel() )
+ nCol2 = rChanged.Col() - aProv.Ref1.nRelCol;
else
{
- bHit &= ( rChanged.Col() >= rRef.Ref1.nCol );
+ bHit &= ( rChanged.Col() >= aProv.Ref1.nCol );
nCol2 = MAXCOL;
}
- if ( rRef.Ref1.IsRowRel() )
- nRow2 = rChanged.Row() - rRef.Ref1.nRelRow;
+ if ( aProv.Ref1.IsRowRel() )
+ nRow2 = rChanged.Row() - aProv.Ref1.nRelRow;
else
{
- bHit &= ( rChanged.Row() >= rRef.Ref1.nRow );
+ bHit &= ( rChanged.Row() >= aProv.Ref1.nRow );
nRow2 = MAXROW;
}
- if ( rRef.Ref1.IsTabRel() )
- nTab2 = rChanged.Tab() - rRef.Ref1.nRelTab;
+ if ( aProv.Ref1.IsTabRel() )
+ nTab2 = rChanged.Tab() - aProv.Ref1.nRelTab;
else
{
- bHit &= ( rChanged.Tab() >= rRef.Ref1.nTab );
+ bHit &= ( rChanged.Tab() >= aProv.Ref1.nTab );
nTab2 = MAXTAB;
}
- if ( rRef.Ref2.IsColRel() )
- nCol1 = rChanged.Col() - rRef.Ref2.nRelCol;
+ if ( aProv.Ref2.IsColRel() )
+ nCol1 = rChanged.Col() - aProv.Ref2.nRelCol;
else
{
- bHit &= ( rChanged.Col() <= rRef.Ref2.nCol );
+ bHit &= ( rChanged.Col() <= aProv.Ref2.nCol );
nCol1 = 0;
}
- if ( rRef.Ref2.IsRowRel() )
- nRow1 = rChanged.Row() - rRef.Ref2.nRelRow;
+ if ( aProv.Ref2.IsRowRel() )
+ nRow1 = rChanged.Row() - aProv.Ref2.nRelRow;
else
{
- bHit &= ( rChanged.Row() <= rRef.Ref2.nRow );
+ bHit &= ( rChanged.Row() <= aProv.Ref2.nRow );
nRow1 = 0;
}
- if ( rRef.Ref2.IsTabRel() )
- nTab1 = rChanged.Tab() - rRef.Ref2.nRelTab;
+ if ( aProv.Ref2.IsTabRel() )
+ nTab1 = rChanged.Tab() - aProv.Ref2.nRelTab;
else
{
- bHit &= ( rChanged.Tab() <= rRef.Ref2.nTab );
+ bHit &= ( rChanged.Tab() <= aProv.Ref2.nTab );
nTab1 = 0;
}
diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx
index dd1af18c7c6e..85162904612f 100644
--- a/sc/source/core/data/documen4.cxx
+++ b/sc/source/core/data/documen4.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: documen4.cxx,v $
*
- * $Revision: 1.6 $
+ * $Revision: 1.7 $
*
- * last change: $Author: dr $ $Date: 2001-02-13 17:12:29 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:29:35 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -209,8 +209,7 @@ void ScDocument::InsertMatrixFormula(USHORT nCol1, USHORT nRow1,
{
aRefData.nTab = i;
aRefData.nRelTab = i - nTab1;
- t->SetSingleReference( aRefData );
- t->NewOpCode( ocMatRef );
+ t->GetSingleRef() = aRefData;
}
for (j = nCol1; j <= nCol2; j++)
{
@@ -221,7 +220,7 @@ void ScDocument::InsertMatrixFormula(USHORT nCol1, USHORT nRow1,
// Array muss geklont werden, damit jede
// Zelle ein eigenes Array erhaelt!
aPos = ScAddress( j, k, i );
- t->aRef.CalcRelFromAbs( aPos );
+ t->CalcRelFromAbs( aPos );
pCell = new ScFormulaCell( this, aPos, aArr.Clone(), MM_REFERENCE );
pTab[i]->PutCell(j, k, (ScBaseCell*) pCell);
}
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 571ebcad9d01..7ebc96918fde 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: interpre.hxx,v $
*
- * $Revision: 1.3 $
+ * $Revision: 1.4 $
*
- * last change: $Author: er $ $Date: 2001-02-13 19:01:00 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:31:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -135,7 +135,7 @@ struct ScCompare
}
};
-struct ScToken;
+class ScToken;
#define MAXSTACK (4096 / sizeof(ScToken*))
@@ -192,7 +192,6 @@ private:
static ScTokenStack* pGlobalStack;
static ScErrorStack* pGlobalErrorStack;
static BOOL bGlobalStackInUse;
- static const sal_Unicode cEmptyString; // =0 for return &cEmptyString
ScTokenIterator aCode;
ScAddress aPos;
@@ -275,12 +274,12 @@ BOOL CreateCellArr(USHORT nCol1, USHORT nRow1, USHORT nTab1,
//-----------------------------------------------------------------------------
void Push( ScToken& r );
void PushTempToken( const ScToken& );
-void PushTempToken( ScDoubleToken* ); //! see warnings in interpr4.cxx
+void PushTempToken( ScToken* ); //! see warnings in interpr4.cxx
void Pop();
void PopError();
BYTE PopByte();
double PopDouble();
-const sal_Unicode* PopString();
+const String& PopString();
void PopSingleRef( ScAddress& );
void PopSingleRef(USHORT& rCol, USHORT &rRow, USHORT& rTab);
void PopDoubleRef( ScRange&, BOOL bDontCheckForTableOp = FALSE );
@@ -294,8 +293,8 @@ ScMatrix* PopMatrix();
//void PushByte(BYTE nVal);
void PushDouble(double nVal);
void PushInt( int nVal );
-void PushString(const sal_Unicode* cString);
-void PushStringObject(const String& aString);
+void PushStringBuffer( const sal_Unicode* pString );
+void PushString( const String& rString );
void PushSingleRef(USHORT nCol, USHORT nRow, USHORT nTab);
void PushDoubleRef(USHORT nCol1, USHORT nRow1, USHORT nTab1,
USHORT nCol2, USHORT nRow2, USHORT nTab2);
@@ -312,7 +311,7 @@ double GetLong();
BOOL DoubleRefToPosSingleRef( const ScRange& rRange, ScAddress& rAdr );
double GetDouble();
BOOL GetBool() { return GetDouble() != 0.0; }
-const sal_Unicode* GetString();
+const String& GetString();
ScMatrix* GetMatrix(USHORT& nMatInd); // in interpr2.cxx
void ScTableOp(); // Mehrfachoperationen
void ScErrCell(); // Sonderbehandlung
@@ -322,6 +321,9 @@ void ScDefPar(); // DefaultParameter
void SetMaxIterationCount(USHORT n);
inline void CurFmtToFuncFmt()
{ nFuncFmtType = nCurFmtType; nFuncFmtIndex = nCurFmtIndex; }
+// Check for String overflow of rResult+rAdd and set error and erase rResult
+// if so. Return TRUE if ok, FALSE if overflow
+inline BOOL CheckStringResultLen( String& rResult, const String& rAdd );
//---------------------------------Funktionen in interpr1.cxx---------
//-----------------------------Textfunktionen
void ScIfJump();
@@ -741,4 +743,15 @@ inline BOOL ScInterpreter::MustHaveParamCountMin( BYTE nAct, BYTE nMin )
}
+inline BOOL ScInterpreter::CheckStringResultLen( String& rResult, const String& rAdd )
+{
+ if ( (ULONG) rResult.Len() + rAdd.Len() > STRING_MAXLEN )
+ {
+ SetError( errStringOverflow );
+ rResult.Erase();
+ return FALSE;
+ }
+ return TRUE;
+}
+
#endif
diff --git a/sc/source/core/tool/chgtrack.cxx b/sc/source/core/tool/chgtrack.cxx
index 1fdfd30b31ed..35439503387b 100644
--- a/sc/source/core/tool/chgtrack.cxx
+++ b/sc/source/core/tool/chgtrack.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: chgtrack.cxx,v $
*
- * $Revision: 1.11 $
+ * $Revision: 1.12 $
*
- * last change: $Author: er $ $Date: 2001-02-16 17:48:54 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -2314,34 +2314,48 @@ void ScChangeActionContent::PutValueToDoc( ScBaseCell* pCell,
}
-void lcl_InvalidateReference( ComplRefData& rRef, const ScBigAddress& rPos )
+void lcl_InvalidateReference( ScToken& rTok, const ScBigAddress& rPos )
{
+ SingleRefData& rRef1 = rTok.GetSingleRef();
if ( rPos.Col() < 0 || MAXCOL < rPos.Col() )
{
- rRef.Ref1.nCol = (INT16)(~0);
- rRef.Ref1.nRelCol = (INT16)(~0);
- rRef.Ref1.SetColDeleted( TRUE );
- rRef.Ref2.nCol = (INT16)(~0);
- rRef.Ref2.nRelCol = (INT16)(~0);
- rRef.Ref2.SetColDeleted( TRUE );
+ rRef1.nCol = (INT16)(~0);
+ rRef1.nRelCol = (INT16)(~0);
+ rRef1.SetColDeleted( TRUE );
}
if ( rPos.Row() < 0 || MAXROW < rPos.Row() )
{
- rRef.Ref1.nRow = (INT16)(~0);
- rRef.Ref1.nRelRow = (INT16)(~0);
- rRef.Ref1.SetRowDeleted( TRUE );
- rRef.Ref2.nRow = (INT16)(~0);
- rRef.Ref2.nRelRow = (INT16)(~0);
- rRef.Ref2.SetRowDeleted( TRUE );
+ rRef1.nRow = (INT16)(~0);
+ rRef1.nRelRow = (INT16)(~0);
+ rRef1.SetRowDeleted( TRUE );
}
if ( rPos.Tab() < 0 || MAXTAB < rPos.Tab() )
{
- rRef.Ref1.nTab = (INT16)(~0);
- rRef.Ref1.nRelTab = (INT16)(~0);
- rRef.Ref1.SetTabDeleted( TRUE );
- rRef.Ref2.nTab = (INT16)(~0);
- rRef.Ref2.nRelTab = (INT16)(~0);
- rRef.Ref2.SetTabDeleted( TRUE );
+ rRef1.nTab = (INT16)(~0);
+ rRef1.nRelTab = (INT16)(~0);
+ rRef1.SetTabDeleted( TRUE );
+ }
+ if ( rTok.GetType() == svDoubleRef )
+ {
+ SingleRefData& rRef2 = rTok.GetDoubleRef().Ref2;
+ if ( rPos.Col() < 0 || MAXCOL < rPos.Col() )
+ {
+ rRef2.nCol = (INT16)(~0);
+ rRef2.nRelCol = (INT16)(~0);
+ rRef2.SetColDeleted( TRUE );
+ }
+ if ( rPos.Row() < 0 || MAXROW < rPos.Row() )
+ {
+ rRef2.nRow = (INT16)(~0);
+ rRef2.nRelRow = (INT16)(~0);
+ rRef2.SetRowDeleted( TRUE );
+ }
+ if ( rPos.Tab() < 0 || MAXTAB < rPos.Tab() )
+ {
+ rRef2.nTab = (INT16)(~0);
+ rRef2.nRelTab = (INT16)(~0);
+ rRef2.SetTabDeleted( TRUE );
+ }
}
}
@@ -2440,10 +2454,10 @@ void ScChangeActionContent::UpdateReference( const ScChangeTrack* pTrack,
ScTokenArray* pArr = ((ScFormulaCell*)pOldCell)->GetCode();
pArr->Reset();
while ( t = pArr->GetNextReference() )
- lcl_InvalidateReference( t->aRef, rPos );
+ lcl_InvalidateReference( *t, rPos );
pArr->Reset();
while ( t = pArr->GetNextReferenceRPN() )
- lcl_InvalidateReference( t->aRef, rPos );
+ lcl_InvalidateReference( *t, rPos );
}
if ( bNewFormula )
{
@@ -2451,10 +2465,10 @@ void ScChangeActionContent::UpdateReference( const ScChangeTrack* pTrack,
ScTokenArray* pArr = ((ScFormulaCell*)pNewCell)->GetCode();
pArr->Reset();
while ( t = pArr->GetNextReference() )
- lcl_InvalidateReference( t->aRef, rPos );
+ lcl_InvalidateReference( *t, rPos );
pArr->Reset();
while ( t = pArr->GetNextReferenceRPN() )
- lcl_InvalidateReference( t->aRef, rPos );
+ lcl_InvalidateReference( *t, rPos );
}
}
}
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 0e7a65b8c82f..e50ad2db0c50 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: compiler.cxx,v $
*
- * $Revision: 1.5 $
+ * $Revision: 1.6 $
*
- * last change: $Author: er $ $Date: 2001-01-30 15:10:44 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -693,7 +693,7 @@ xub_StrLen ScCompiler::NextSymbol()
else
{
aSymbol.Append( pStart + nSrcPos, aRes.EndPos - nSrcPos );
- nSrcPos = aRes.EndPos;
+ nSrcPos = (xub_StrLen) aRes.EndPos;
if ( aRes.TokenType & KParseType::SINGLE_QUOTE_NAME )
{ // special cases 'sheetname'. 'filename'#
c = pStart[nSrcPos];
@@ -739,9 +739,9 @@ BOOL ScCompiler::IsOpCode( const String& rName )
if (bFound)
{
- ScToken aToken;
+ ScRawToken aToken;
aToken.SetOpCode( (OpCode) --i );
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
}
else
{
@@ -749,9 +749,9 @@ BOOL ScCompiler::IsOpCode( const String& rName )
bFound = ScGlobal::GetFuncCollection()->SearchFunc(cSymbol, nIndex);
if( bFound )
{
- ScToken aToken;
+ ScRawToken aToken;
aToken.SetExternal( cSymbol );
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
}
else
{
@@ -760,17 +760,17 @@ BOOL ScCompiler::IsOpCode( const String& rName )
FindFunction( cSymbol, ( pSymbolTable != pSymbolTableEnglish ) );
if (aIntName.Len())
{
- ScToken aToken;
+ ScRawToken aToken;
aToken.SetExternal( aIntName.GetBuffer() ); // international name
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
bFound = TRUE;
}
}
}
- if ( bFound && pToken->GetOpCode() == ocSub &&
+ if ( bFound && pRawToken->GetOpCode() == ocSub &&
(eLastOp == ocOpen || eLastOp == ocSep ||
(eLastOp > ocEndDiv && eLastOp < ocEndBinOp /*ocEndUnOp*/)))
- pToken->eOp = ocNegSub;
+ pRawToken->NewOpCode( ocNegSub );
return bFound;
}
@@ -783,9 +783,9 @@ BOOL ScCompiler::IsOpCode2( const String& rName )
if (bFound)
{
- ScToken aToken;
+ ScRawToken aToken;
aToken.SetOpCode( (OpCode) --i );
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
}
return bFound;
}
@@ -813,9 +813,9 @@ BOOL ScCompiler::IsValue( const String& rSym )
if( nType == NUMBERFORMAT_TEXT )
// HACK: Die Zahl ist zu gross!
SetError( errIllegalArgument );
- ScToken aToken;
+ ScRawToken aToken;
aToken.SetDouble( fVal );
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
return TRUE;
}
}
@@ -838,9 +838,9 @@ BOOL ScCompiler::IsString()
if ( bQuote )
{
cSymbol[nLen] = '\0';
- ScToken aToken;
+ ScRawToken aToken;
aToken.SetString( cSymbol+1 );
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
return TRUE;
}
return FALSE;
@@ -890,7 +890,7 @@ BOOL ScCompiler::IsReference( const String& rName )
USHORT nFlags = aRange.Parse( rName, pDoc );
if( nFlags & SCA_VALID )
{
- ScToken aToken;
+ ScRawToken aToken;
ComplRefData aRef;
aRef.InitRange( aRange );
aRef.Ref1.SetColRel( (nFlags & SCA_COL_ABSOLUTE) == 0 );
@@ -907,7 +907,7 @@ BOOL ScCompiler::IsReference( const String& rName )
aRef.Ref2.SetFlag3D( ( nFlags & SCA_TAB2_3D ) != 0 );
aRef.CalcRelFromAbs( aPos );
aToken.SetDoubleReference( aRef );
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
}
else
{
@@ -917,7 +917,7 @@ BOOL ScCompiler::IsReference( const String& rName )
// damit Tabelle1.blah oder blah.a1 als (falsche) ref erkannt wird
if( nFlags & ( SCA_VALID_COL|SCA_VALID_ROW|SCA_VALID_TAB ) )
{
- ScToken aToken;
+ ScRawToken aToken;
SingleRefData aRef;
aRef.InitAddress( aAddr );
aRef.SetColRel( (nFlags & SCA_COL_ABSOLUTE) == 0 );
@@ -937,7 +937,7 @@ BOOL ScCompiler::IsReference( const String& rName )
}
aRef.CalcRelFromAbs( aPos );
aToken.SetSingleReference( aRef );
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
}
}
return ( nFlags & SCA_VALID ) != 0;
@@ -970,10 +970,10 @@ BOOL ScCompiler::IsMacro( const String& rName )
pSfxApp->LeaveBasicCall();
return FALSE;
}
- ScToken aToken;
+ ScRawToken aToken;
aToken.SetExternal( rName.GetBuffer() );
aToken.eOp = ocMacro;
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
pSfxApp->LeaveBasicCall();
return TRUE;
}
@@ -985,9 +985,9 @@ BOOL ScCompiler::IsNamedRange( const String& rName )
if (pRangeName->SearchName( rName, n ) )
{
ScRangeData* pData = (*pRangeName)[n];
- ScToken aToken;
+ ScRawToken aToken;
aToken.SetName( pData->GetIndex() );
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
return TRUE;
}
else
@@ -1001,10 +1001,10 @@ BOOL ScCompiler::IsDBRange( const String& rName )
if (pDBColl->SearchName( rName, n ) )
{
ScDBData* pData = (*pDBColl)[n];
- ScToken aToken;
+ ScRawToken aToken;
aToken.SetName( pData->GetIndex() );
aToken.eOp = ocDBArea;
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
return TRUE;
}
else
@@ -1202,10 +1202,10 @@ BOOL ScCompiler::IsColRowName( const String& rName )
}
if ( bFound )
{
- ScToken aToken;
+ ScRawToken aToken;
aToken.SetSingleReference( aRef );
aToken.eOp = ocColRowName;
- pToken = aToken.Clone();
+ pRawToken = aToken.Clone();
return TRUE;
}
else
@@ -1407,7 +1407,7 @@ void ScCompiler::AutoCorrectParsedSymbol()
BOOL ScCompiler::NextNewToken()
{
xub_StrLen nSpaces = NextSymbol();
- ScToken aToken;
+ ScRawToken aToken;
if( cSymbol[0] )
{
if( nSpaces )
@@ -1449,8 +1449,8 @@ BOOL ScCompiler::NextNewToken()
SetError( errNoName );
ScGlobal::pCharClass->toLower( aUpper );
aToken.SetString( aUpper.GetBuffer() );
- aToken.eOp = ocBad;
- pToken = aToken.Clone();
+ aToken.NewOpCode( ocBad );
+ pRawToken = aToken.Clone();
if ( bAutoCorrect )
AutoCorrectParsedSymbol();
}
@@ -1494,9 +1494,9 @@ ScTokenArray* ScCompiler::CompileString( const String& rFormula )
eLastOp = ocOpen;
while( NextNewToken() )
{
- if( pToken->GetOpCode() == ocOpen )
+ if( pRawToken->GetOpCode() == ocOpen )
nBrackets++;
- else if( pToken->GetOpCode() == ocClose )
+ else if( pRawToken->GetOpCode() == ocClose )
{
if( !nBrackets )
{
@@ -1510,19 +1510,18 @@ ScTokenArray* ScCompiler::CompileString( const String& rFormula )
else
nBrackets--;
}
- if( !pArr->Add( pToken ) )
+ if( !pArr->Add( pRawToken->CreateToken() ) )
{
SetError(errCodeOverflow); break;
}
- eLastOp = pToken->GetOpCode();
+ eLastOp = pRawToken->GetOpCode();
if ( bAutoCorrect )
aCorrectedFormula += aCorrectedSymbol;
}
if ( eLastOp != ocBad )
{ // bei ocBad ist der Rest der Formel String, es wuerden zuviele
// Klammern erscheinen
- ScToken aToken;
- aToken.SetOpCode( ocClose );
+ ScByteToken aToken( ocClose );
while( nBrackets-- )
{
if( !pArr->AddToken( aToken ) )
@@ -1617,27 +1616,21 @@ BOOL ScCompiler::GetToken()
{
if ( nWasColRowName >= 2 && pToken->GetOpCode() == ocColRowName )
{ // aus einem ocSpaces ein ocIntersect im RPN machen
- ScToken* pRawToken = new ScToken;
- pRawToken->SetOpCode( ocIntersect );
- pToken = pRawToken->Clone();
- delete pRawToken;
+ pToken = new ScByteToken( ocIntersect );
pArr->nIndex--; // ganz schweinisch..
}
}
}
if( bStop )
{
- ScToken* pRawToken = new ScToken;
- pRawToken->SetOpCode( ocStop );
- pToken = pRawToken->Clone();
- delete pRawToken;
+ pToken = new ScByteToken( ocStop );
return FALSE;
}
if( pToken->GetOpCode() == ocSubTotal )
glSubTotal = TRUE;
else if( pToken->GetOpCode() == ocName )
{
- ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex( pToken->nIndex);
+ ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex( pToken->GetIndex() );
if (pRangeData)
{
USHORT nErr = pRangeData->GetErrCode();
@@ -1689,7 +1682,7 @@ BOOL ScCompiler::GetToken()
}
else if( pToken->GetOpCode() == ocColRowName )
{
- SingleRefData& rRef = pToken->aRef.Ref1;
+ SingleRefData& rRef = pToken->GetSingleRef();
rRef.CalcAbsIfRel( aPos );
if ( !rRef.Valid() )
{
@@ -1884,11 +1877,8 @@ BOOL ScCompiler::GetToken()
pNew->AddDoubleReference( aRefData );
else
{ // automagically
- ScToken* pRawToken = new ScToken;
- pRawToken->SetDoubleReference( aRefData );
- pRawToken->eOp = ocColRowNameAuto;
- pNew->AddToken( *pRawToken );
- delete pRawToken;
+ pNew->Add( new ScDoubleRefToken( ocColRowNameAuto,
+ aRefData ) );
}
}
PushTokenArray( pNew, TRUE );
@@ -1901,7 +1891,7 @@ BOOL ScCompiler::GetToken()
}
else if( pToken->GetOpCode() == ocDBArea )
{
- ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex( pToken->nIndex);
+ ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex( pToken->GetIndex() );
if ( !pDBData )
SetError(errNoName);
else if ( !bCompileForFAP )
@@ -2096,6 +2086,11 @@ BOOL ScCompiler::CompileTokenArray()
// Token in den Code Eintragen
//---------------------------------------------------------------------------
+void ScCompiler::PutCode( ScRawToken* p )
+{
+ PutCode( p->CreateToken() );
+}
+
void ScCompiler::PutCode( ScToken* p )
{
if( pc >= MAXCODE )
@@ -2250,11 +2245,7 @@ void ScCompiler::Factor()
}
else
{
- ScToken* pRawToken = new ScToken;
- pRawToken->SetByte( SepCount );
- ScTokenRef pSepToken = pRawToken->Clone();
- delete pRawToken;
- PutCode( pSepToken );
+ PutCode( new ScByteToken( ocPush, SepCount ) );
if ( eOp != ocClose )
eOp = Expression();
}
@@ -2293,7 +2284,7 @@ void ScCompiler::Factor()
SetError(errPairExpected);
else
eOp = NextToken();
- pFacToken->cByte = SepCount;
+ pFacToken->SetByte( SepCount );
PutCode( pFacToken );
// Diese Funktionen muessen immer neu berechnet werden
switch( eFuncOp )
@@ -2323,9 +2314,9 @@ void ScCompiler::Factor()
// Die PC-Staende sind -1
pFacToken = pToken;
if ( eOp == ocIf )
- pFacToken->nJump[ 0 ] = 3; // if, else, behind
+ pFacToken->GetJump()[ 0 ] = 3; // if, else, behind
else
- pFacToken->nJump[ 0 ] = MAXJUMPCOUNT+1;
+ pFacToken->GetJump()[ 0 ] = MAXJUMPCOUNT+1;
eOp = NextToken();
if (eOp == ocOpen)
{
@@ -2337,7 +2328,7 @@ void ScCompiler::Factor()
short nJumpCount = 0;
PutCode( pFacToken );
// #36253# bei AutoCorrect (da pArr->nError ignoriert wird)
- // unbegrenztes ocIf gibt GPF weil ScToken::Clone den JumpBuffer
+ // unbegrenztes ocIf gibt GPF weil ScRawToken::Clone den JumpBuffer
// anhand von nJump[0]*2+2 alloziert, was bei ocIf 3*2+2 ist
const short nJumpMax =
(pFacToken->GetOpCode() == ocIf ? 3 : MAXJUMPCOUNT);
@@ -2345,7 +2336,7 @@ void ScCompiler::Factor()
&& (!pArr->GetError() || bIgnoreErrors) )
{
if ( ++nJumpCount <= nJumpMax )
- pFacToken->nJump[nJumpCount] = pc-1;
+ pFacToken->GetJump()[nJumpCount] = pc-1;
NextToken();
eOp = Expression();
PutCode( pToken ); // Als Terminator des Teilausdrucks
@@ -2359,12 +2350,12 @@ void ScCompiler::Factor()
// mehr als 3 Parametern in ocIf einen Ueberschreiber,
// das war auch schon in der 312 so (jaja, die Tester..)
if ( ++nJumpCount <= nJumpMax )
- pFacToken->nJump[ nJumpCount ] = pc-1;
+ pFacToken->GetJump()[ nJumpCount ] = pc-1;
if ((pFacToken->GetOpCode() == ocIf && (nJumpCount > 3)) ||
(nJumpCount >= MAXJUMPCOUNT))
SetError(errIllegalParameter);
else
- pFacToken->nJump[ 0 ] = nJumpCount;
+ pFacToken->GetJump()[ 0 ] = nJumpCount;
}
}
else if ( eOp == ocBad )
@@ -2507,7 +2498,7 @@ OpCode ScCompiler::Expression()
while (pToken->GetOpCode() == ocAnd || pToken->GetOpCode() == ocOr)
{
ScTokenRef p = pToken;
- pToken->cByte = 2; // 2 Parameter!
+ pToken->SetByte( 2 ); // 2 parameters!
NextToken();
NotLine();
PutCode(p);
@@ -2526,14 +2517,14 @@ BOOL ScCompiler::HasModifiedRange()
OpCode eOpCode = t->GetOpCode();
if ( eOpCode == ocName )
{
- ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex(t->nIndex);
+ ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex(t->GetIndex());
if (pRangeData && pRangeData->IsModified())
return TRUE;
}
else if ( eOpCode == ocDBArea )
{
- ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex(t->nIndex);
+ ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex(t->GetIndex());
if (pDBData && pDBData->IsModified())
return TRUE;
@@ -2573,10 +2564,15 @@ void ScCompiler::SetRelNameReference()
for( ScToken* t = pArr->GetNextReference(); t;
t = pArr->GetNextReference() )
{
- if ( t->aRef.Ref1.IsColRel() || t->aRef.Ref1.IsRowRel() || t->aRef.Ref1.IsTabRel() )
- t->aRef.Ref1.SetRelName( TRUE );
- if ( t->aRef.Ref2.IsColRel() || t->aRef.Ref2.IsRowRel() || t->aRef.Ref2.IsTabRel() )
- t->aRef.Ref2.SetRelName( TRUE );
+ SingleRefData& rRef1 = t->GetSingleRef();
+ if ( rRef1.IsColRel() || rRef1.IsRowRel() || rRef1.IsTabRel() )
+ rRef1.SetRelName( TRUE );
+ if ( t->GetType() == svDoubleRef )
+ {
+ SingleRefData& rRef2 = t->GetDoubleRef().Ref2;
+ if ( rRef2.IsColRel() || rRef2.IsRowRel() || rRef2.IsTabRel() )
+ rRef2.SetRelName( TRUE );
+ }
}
}
@@ -2586,7 +2582,12 @@ void ScCompiler::MoveRelWrap()
pArr->Reset();
for( ScToken* t = pArr->GetNextReference(); t;
t = pArr->GetNextReference() )
- ScRefUpdate::MoveRelWrap( pDoc, aPos, t->aRef );
+ {
+ if ( t->GetType() == svSingleRef )
+ ScRefUpdate::MoveRelWrap( pDoc, aPos, SingleDoubleRefModifier( t->GetSingleRef() ).Ref() );
+ else
+ ScRefUpdate::MoveRelWrap( pDoc, aPos, t->GetDoubleRef() );
+ }
}
// static
@@ -2597,7 +2598,12 @@ void ScCompiler::MoveRelWrap( ScTokenArray& rArr, ScDocument* pDoc,
rArr.Reset();
for( ScToken* t = rArr.GetNextReference(); t;
t = rArr.GetNextReference() )
- ScRefUpdate::MoveRelWrap( pDoc, rPos, t->aRef );
+ {
+ if ( t->GetType() == svSingleRef )
+ ScRefUpdate::MoveRelWrap( pDoc, rPos, SingleDoubleRefModifier( t->GetSingleRef() ).Ref() );
+ else
+ ScRefUpdate::MoveRelWrap( pDoc, rPos, t->GetDoubleRef() );
+ }
}
ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
@@ -2618,7 +2624,7 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
{
if( t->GetOpCode() == ocName )
{
- ScRangeData* pName = pDoc->GetRangeName()->FindIndex( t->nIndex );
+ ScRangeData* pName = pDoc->GetRangeName()->FindIndex( t->GetIndex() );
if (pName && pName->HasType(RT_SHAREDMOD))
{
pRangeData = pName; // => neu kompilieren etc.
@@ -2627,12 +2633,24 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
}
else if( t->GetType() != svIndex ) // es kann ein DB-Bereich sein !!!
{
- t->aRef.CalcAbsIfRel( rOldPos );
- if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
- r, nDx, nDy, nDz, t->aRef )
- != UR_NOTHING
- )
- rChanged = TRUE;
+ t->CalcAbsIfRel( rOldPos );
+ if ( t->GetType() == svSingleRef )
+ {
+ if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
+ r, nDx, nDy, nDz,
+ SingleDoubleRefModifier( t->GetSingleRef() ).Ref() )
+ != UR_NOTHING
+ )
+ rChanged = TRUE;
+ }
+ else
+ {
+ if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
+ r, nDx, nDy, nDz, t->GetDoubleRef() )
+ != UR_NOTHING
+ )
+ rChanged = TRUE;
+ }
}
}
pArr->Reset();
@@ -2641,19 +2659,41 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
{
if ( t->GetRef() == 1 )
{ // bei nRefCnt>1 bereits im Code angepasst
- if ( t->aRef.Ref1.IsRelName() || t->aRef.Ref2.IsRelName() )
+ if ( t->GetType() == svSingleRef )
{
- ScRefUpdate::MoveRelWrap( pDoc, aPos, t->aRef );
- rChanged = TRUE;
+ SingleRefData& rRef = t->GetSingleRef();
+ SingleDoubleRefModifier aMod( rRef );
+ if ( rRef.IsRelName() )
+ {
+ ScRefUpdate::MoveRelWrap( pDoc, aPos, aMod.Ref() );
+ rChanged = TRUE;
+ }
+ else
+ {
+ aMod.Ref().CalcAbsIfRel( rOldPos );
+ if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
+ r, nDx, nDy, nDz, aMod.Ref() )
+ != UR_NOTHING
+ )
+ rChanged = TRUE;
+ }
}
else
{
- t->aRef.CalcAbsIfRel( rOldPos );
- if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
- r, nDx, nDy, nDz, t->aRef )
- != UR_NOTHING
- )
+ ComplRefData& rRef = t->GetDoubleRef();
+ if ( rRef.Ref1.IsRelName() || rRef.Ref2.IsRelName() )
+ {
+ ScRefUpdate::MoveRelWrap( pDoc, aPos, rRef );
rChanged = TRUE;
+ }
+ else
+ {
+ if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
+ r, nDx, nDy, nDz, rRef )
+ != UR_NOTHING
+ )
+ rChanged = TRUE;
+ }
}
}
}
@@ -2672,7 +2712,10 @@ BOOL ScCompiler::UpdateNameReference(UpdateRefMode eUpdateRefMode,
for( ScToken* t = pArr->GetNextReference(); t;
t = pArr->GetNextReference() )
{
- ComplRefData& rRef = t->aRef;
+ SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ?
+ SingleDoubleRefModifier( t->GetSingleRef() ) :
+ SingleDoubleRefModifier( t->GetDoubleRef() ));
+ ComplRefData& rRef = rMod.Ref();
if (!rRef.Ref1.IsColRel() && !rRef.Ref1.IsRowRel() &&
(!rRef.Ref1.IsFlag3D() || !rRef.Ref1.IsTabRel()) &&
( t->GetType() == svSingleRef ||
@@ -2705,49 +2748,56 @@ void ScCompiler::UpdateSharedFormulaReference( UpdateRefMode eUpdateRefMode,
{
if( t->GetType() != svIndex ) // es kann ein DB-Bereich sein !!!
{
- t->aRef.CalcAbsIfRel( rOldPos );
+ t->CalcAbsIfRel( rOldPos );
// Absolute references have been already adjusted in the named
// shared formula itself prior to breaking the shared formula
// and calling this function. Don't readjust them again.
- ComplRefData aBkp = t->aRef;
+ SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ?
+ SingleDoubleRefModifier( t->GetSingleRef() ) :
+ SingleDoubleRefModifier( t->GetDoubleRef() ));
+ ComplRefData& rRef = rMod.Ref();
+ ComplRefData aBkp = rRef;
ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
- r, nDx, nDy, nDz, t->aRef );
+ r, nDx, nDy, nDz, rRef );
// restore absolute parts
if ( !aBkp.Ref1.IsColRel() )
{
- t->aRef.Ref1.nCol = aBkp.Ref1.nCol;
- t->aRef.Ref1.nRelCol = aBkp.Ref1.nRelCol;
- t->aRef.Ref1.SetColDeleted( aBkp.Ref1.IsColDeleted() );
+ rRef.Ref1.nCol = aBkp.Ref1.nCol;
+ rRef.Ref1.nRelCol = aBkp.Ref1.nRelCol;
+ rRef.Ref1.SetColDeleted( aBkp.Ref1.IsColDeleted() );
}
if ( !aBkp.Ref1.IsRowRel() )
{
- t->aRef.Ref1.nRow = aBkp.Ref1.nRow;
- t->aRef.Ref1.nRelRow = aBkp.Ref1.nRelRow;
- t->aRef.Ref1.SetRowDeleted( aBkp.Ref1.IsRowDeleted() );
+ rRef.Ref1.nRow = aBkp.Ref1.nRow;
+ rRef.Ref1.nRelRow = aBkp.Ref1.nRelRow;
+ rRef.Ref1.SetRowDeleted( aBkp.Ref1.IsRowDeleted() );
}
if ( !aBkp.Ref1.IsTabRel() )
{
- t->aRef.Ref1.nTab = aBkp.Ref1.nTab;
- t->aRef.Ref1.nRelTab = aBkp.Ref1.nRelTab;
- t->aRef.Ref1.SetTabDeleted( aBkp.Ref1.IsTabDeleted() );
+ rRef.Ref1.nTab = aBkp.Ref1.nTab;
+ rRef.Ref1.nRelTab = aBkp.Ref1.nRelTab;
+ rRef.Ref1.SetTabDeleted( aBkp.Ref1.IsTabDeleted() );
}
- if ( !aBkp.Ref2.IsColRel() )
- {
- t->aRef.Ref2.nCol = aBkp.Ref2.nCol;
- t->aRef.Ref2.nRelCol = aBkp.Ref2.nRelCol;
- t->aRef.Ref2.SetColDeleted( aBkp.Ref2.IsColDeleted() );
- }
- if ( !aBkp.Ref2.IsRowRel() )
- {
- t->aRef.Ref2.nRow = aBkp.Ref2.nRow;
- t->aRef.Ref2.nRelRow = aBkp.Ref2.nRelRow;
- t->aRef.Ref2.SetRowDeleted( aBkp.Ref2.IsRowDeleted() );
- }
- if ( !aBkp.Ref2.IsTabRel() )
+ if ( t->GetType() == svDoubleRef )
{
- t->aRef.Ref2.nTab = aBkp.Ref2.nTab;
- t->aRef.Ref2.nRelTab = aBkp.Ref2.nRelTab;
- t->aRef.Ref2.SetTabDeleted( aBkp.Ref2.IsTabDeleted() );
+ if ( !aBkp.Ref2.IsColRel() )
+ {
+ rRef.Ref2.nCol = aBkp.Ref2.nCol;
+ rRef.Ref2.nRelCol = aBkp.Ref2.nRelCol;
+ rRef.Ref2.SetColDeleted( aBkp.Ref2.IsColDeleted() );
+ }
+ if ( !aBkp.Ref2.IsRowRel() )
+ {
+ rRef.Ref2.nRow = aBkp.Ref2.nRow;
+ rRef.Ref2.nRelRow = aBkp.Ref2.nRelRow;
+ rRef.Ref2.SetRowDeleted( aBkp.Ref2.IsRowDeleted() );
+ }
+ if ( !aBkp.Ref2.IsTabRel() )
+ {
+ rRef.Ref2.nTab = aBkp.Ref2.nTab;
+ rRef.Ref2.nRelTab = aBkp.Ref2.nRelTab;
+ rRef.Ref2.SetTabDeleted( aBkp.Ref2.IsTabDeleted() );
+ }
}
}
}
@@ -2774,16 +2824,16 @@ ScRangeData* ScCompiler::UpdateInsertTab( USHORT nTable, BOOL bIsName )
{
if (!bIsName)
{
- ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->nIndex);
+ ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->GetIndex());
if (pName && pName->HasType(RT_SHAREDMOD))
pRangeData = pName;
}
}
else if( t->GetType() != svIndex ) // es kann ein DB-Bereich sein !!!
{
- if ( !(bIsName && t->aRef.Ref1.IsTabRel()) )
+ if ( !(bIsName && t->GetSingleRef().IsTabRel()) )
{ // Namen nur absolute anpassen
- SingleRefData& rRef = t->aRef.Ref1;
+ SingleRefData& rRef = t->GetSingleRef();
if ( rRef.IsTabRel() )
nTab = rRef.nRelTab + nOldPosTab;
else
@@ -2791,19 +2841,14 @@ ScRangeData* ScCompiler::UpdateInsertTab( USHORT nTable, BOOL bIsName )
if ( nTable <= nTab )
rRef.nTab = nTab + 1;
rRef.nRelTab = rRef.nTab - nPosTab;
- if( t->GetType() == svSingleRef )
- {
- t->aRef.Ref2.nTab = rRef.nTab;
- t->aRef.Ref2.nRelTab = rRef.nRelTab;
- }
}
else
bIsRel = TRUE;
if ( t->GetType() == svDoubleRef )
{
- if ( !(bIsName && t->aRef.Ref2.IsTabRel()) )
+ if ( !(bIsName && t->GetDoubleRef().Ref2.IsTabRel()) )
{ // Namen nur absolute anpassen
- SingleRefData& rRef = t->aRef.Ref2;
+ SingleRefData& rRef = t->GetDoubleRef().Ref2;
if ( rRef.IsTabRel() )
nTab = rRef.nRelTab + nOldPosTab;
else
@@ -2831,34 +2876,29 @@ ScRangeData* ScCompiler::UpdateInsertTab( USHORT nTable, BOOL bIsName )
{
if ( t->GetRef() == 1 )
{
- if ( !(t->aRef.Ref1.IsRelName() && t->aRef.Ref1.IsTabRel()) )
+ SingleRefData& rRef1 = t->GetSingleRef();
+ if ( !(rRef1.IsRelName() && rRef1.IsTabRel()) )
{ // Namen nur absolute anpassen
- SingleRefData& rRef = t->aRef.Ref1;
- if ( rRef.IsTabRel() )
- nTab = rRef.nRelTab + nOldPosTab;
+ if ( rRef1.IsTabRel() )
+ nTab = rRef1.nRelTab + nOldPosTab;
else
- nTab = rRef.nTab;
+ nTab = rRef1.nTab;
if ( nTable <= nTab )
- rRef.nTab = nTab + 1;
- rRef.nRelTab = rRef.nTab - nPosTab;
- if( t->GetType() == svSingleRef )
- {
- t->aRef.Ref2.nTab = rRef.nTab;
- t->aRef.Ref2.nRelTab = rRef.nRelTab;
- }
+ rRef1.nTab = nTab + 1;
+ rRef1.nRelTab = rRef1.nTab - nPosTab;
}
if ( t->GetType() == svDoubleRef )
{
- if ( !(t->aRef.Ref2.IsRelName() && t->aRef.Ref2.IsTabRel()) )
+ SingleRefData& rRef2 = t->GetDoubleRef().Ref2;
+ if ( !(rRef2.IsRelName() && rRef2.IsTabRel()) )
{ // Namen nur absolute anpassen
- SingleRefData& rRef = t->aRef.Ref2;
- if ( rRef.IsTabRel() )
- nTab = rRef.nRelTab + nOldPosTab;
+ if ( rRef2.IsTabRel() )
+ nTab = rRef2.nRelTab + nOldPosTab;
else
- nTab = rRef.nTab;
+ nTab = rRef2.nTab;
if ( nTable <= nTab )
- rRef.nTab = nTab + 1;
- rRef.nRelTab = rRef.nTab - nPosTab;
+ rRef2.nTab = nTab + 1;
+ rRef2.nRelTab = rRef2.nTab - nPosTab;
}
}
}
@@ -2888,7 +2928,7 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa
{
if (!bIsName)
{
- ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->nIndex);
+ ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->GetIndex());
if (pName && pName->HasType(RT_SHAREDMOD))
pRangeData = pName;
}
@@ -2896,9 +2936,9 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa
}
else if( t->GetType() != svIndex ) // es kann ein DB-Bereich sein !!!
{
- if ( !(bIsName && t->aRef.Ref1.IsTabRel()) )
+ if ( !(bIsName && t->GetSingleRef().IsTabRel()) )
{ // Namen nur absolute anpassen
- SingleRefData& rRef = t->aRef.Ref1;
+ SingleRefData& rRef = t->GetSingleRef();
if ( rRef.IsTabRel() )
nTab = rRef.nRelTab + nOldPosTab;
else
@@ -2912,10 +2952,11 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa
{
if ( t->GetType() == svDoubleRef )
{
- if ( t->aRef.Ref2.IsTabRel() )
- nTab2 = t->aRef.Ref2.nRelTab + nOldPosTab;
+ SingleRefData& rRef2 = t->GetDoubleRef().Ref2;
+ if ( rRef2.IsTabRel() )
+ nTab2 = rRef2.nRelTab + nOldPosTab;
else
- nTab2 = t->aRef.Ref2.nTab;
+ nTab2 = rRef2.nTab;
if ( nTab == nTab2
|| (nTab+1) >= pDoc->GetTableCount() )
{
@@ -2933,19 +2974,14 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa
rChanged = TRUE;
}
rRef.nRelTab = rRef.nTab - nPosTab;
- if( t->GetType() == svSingleRef )
- {
- t->aRef.Ref2.nTab = rRef.nTab;
- t->aRef.Ref2.nRelTab = rRef.nRelTab;
- }
}
else
bIsRel = TRUE;
if ( t->GetType() == svDoubleRef )
{
- if ( !(bIsName && t->aRef.Ref2.IsTabRel()) )
+ if ( !(bIsName && t->GetDoubleRef().Ref2.IsTabRel()) )
{ // Namen nur absolute anpassen
- SingleRefData& rRef = t->aRef.Ref2;
+ SingleRefData& rRef = t->GetDoubleRef().Ref2;
if ( rRef.IsTabRel() )
nTab = rRef.nRelTab + nOldPosTab;
else
@@ -2957,7 +2993,7 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa
}
else if ( nTable == nTab )
{
- if ( !t->aRef.Ref1.IsTabDeleted() )
+ if ( !t->GetDoubleRef().Ref1.IsTabDeleted() )
rRef.nTab = nTab - 1; // Bereich verkleinern
else
{
@@ -2987,75 +3023,71 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa
{
if ( t->GetRef() == 1 )
{
- if ( !(t->aRef.Ref1.IsRelName() && t->aRef.Ref1.IsTabRel()) )
+ SingleRefData& rRef1 = t->GetSingleRef();
+ if ( !(rRef1.IsRelName() && rRef1.IsTabRel()) )
{ // Namen nur absolute anpassen
- SingleRefData& rRef = t->aRef.Ref1;
- if ( rRef.IsTabRel() )
- nTab = rRef.nRelTab + nOldPosTab;
+ if ( rRef1.IsTabRel() )
+ nTab = rRef1.nRelTab + nOldPosTab;
else
- nTab = rRef.nTab;
+ nTab = rRef1.nTab;
if ( nTable < nTab )
{
- rRef.nTab = nTab - 1;
+ rRef1.nTab = nTab - 1;
rChanged = TRUE;
}
else if ( nTable == nTab )
{
if ( t->GetType() == svDoubleRef )
{
- if ( t->aRef.Ref2.IsTabRel() )
- nTab2 = t->aRef.Ref2.nRelTab + nOldPosTab;
+ SingleRefData& rRef2 = t->GetDoubleRef().Ref2;
+ if ( rRef2.IsTabRel() )
+ nTab2 = rRef2.nRelTab + nOldPosTab;
else
- nTab2 = t->aRef.Ref2.nTab;
+ nTab2 = rRef2.nTab;
if ( nTab == nTab2
|| (nTab+1) >= pDoc->GetTableCount() )
{
- rRef.nTab = MAXTAB+1;
- rRef.SetTabDeleted( TRUE );
+ rRef1.nTab = MAXTAB+1;
+ rRef1.SetTabDeleted( TRUE );
}
// else: nTab zeigt spaeter auf jetziges nTable+1
// => Bereich verkleinert
}
else
{
- rRef.nTab = MAXTAB+1;
- rRef.SetTabDeleted( TRUE );
+ rRef1.nTab = MAXTAB+1;
+ rRef1.SetTabDeleted( TRUE );
}
rChanged = TRUE;
}
- rRef.nRelTab = rRef.nTab - nPosTab;
- if( t->GetType() == svSingleRef )
- {
- t->aRef.Ref2.nTab = rRef.nTab;
- t->aRef.Ref2.nRelTab = rRef.nRelTab;
- }
+ rRef1.nRelTab = rRef1.nTab - nPosTab;
}
if ( t->GetType() == svDoubleRef )
{
- if ( !(t->aRef.Ref2.IsRelName() && t->aRef.Ref2.IsTabRel()) )
+ SingleRefData& rRef2 = t->GetDoubleRef().Ref2;
+ if ( !(rRef2.IsRelName() && rRef2.IsTabRel()) )
{ // Namen nur absolute anpassen
- SingleRefData& rRef = t->aRef.Ref2;
- if ( rRef.IsTabRel() )
- nTab = rRef.nRelTab + nOldPosTab;
+ if ( rRef2.IsTabRel() )
+ nTab = rRef2.nRelTab + nOldPosTab;
else
- nTab = rRef.nTab;
+ nTab = rRef2.nTab;
if ( nTable < nTab )
{
- rRef.nTab = nTab - 1;
+ rRef2.nTab = nTab - 1;
rChanged = TRUE;
}
else if ( nTable == nTab )
{
- if ( !t->aRef.Ref1.IsTabDeleted() )
- rRef.nTab = nTab - 1; // Bereich verkleinern
+ if ( !rRef1.IsTabDeleted() )
+ rRef2.nTab = nTab - 1; // Bereich verkleinern
else
{
- rRef.nTab = MAXTAB+1;
- rRef.SetTabDeleted( TRUE );
+ rRef2.nTab = MAXTAB+1;
+ rRef2.SetTabDeleted( TRUE );
}
rChanged = TRUE;
}
- rRef.nRelTab = rRef.nTab - nPosTab;
+ rRef2.nRelTab = rRef2.nTab - nPosTab;
}
}
}
@@ -3107,65 +3139,60 @@ ScRangeData* ScCompiler::UpdateMoveTab( USHORT nOldTab, USHORT nNewTab,
{
if (!bIsName)
{
- ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->nIndex);
+ ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->GetIndex());
if (pName && pName->HasType(RT_SHAREDMOD))
pRangeData = pName;
}
}
else if( t->GetType() != svIndex ) // es kann ein DB-Bereich sein !!!
{
- if ( !(bIsName && t->aRef.Ref1.IsTabRel()) )
+ SingleRefData& rRef1 = t->GetSingleRef();
+ if ( !(bIsName && rRef1.IsTabRel()) )
{ // Namen nur absolute anpassen
- SingleRefData& rRef = t->aRef.Ref1;
- if ( rRef.IsTabRel() )
- nTab = rRef.nRelTab + nOldPosTab;
+ if ( rRef1.IsTabRel() )
+ nTab = rRef1.nRelTab + nOldPosTab;
else
- nTab = rRef.nTab;
+ nTab = rRef1.nTab;
if ( nTab == nOldTab )
- rRef.nTab = nNewTab;
+ rRef1.nTab = nNewTab;
else if ( nStart <= nTab && nTab <= nEnd )
- rRef.nTab = nTab + nDir;
- rRef.nRelTab = rRef.nTab - nPosTab;
- if( t->GetType() == svSingleRef )
- {
- t->aRef.Ref2.nTab = rRef.nTab;
- t->aRef.Ref2.nRelTab = rRef.nRelTab;
- }
+ rRef1.nTab = nTab + nDir;
+ rRef1.nRelTab = rRef1.nTab - nPosTab;
}
else
bIsRel = TRUE;
if ( t->GetType() == svDoubleRef )
{
- if ( !(bIsName && t->aRef.Ref2.IsTabRel()) )
+ SingleRefData& rRef2 = t->GetDoubleRef().Ref2;
+ if ( !(bIsName && rRef2.IsTabRel()) )
{ // Namen nur absolute anpassen
- SingleRefData& rRef = t->aRef.Ref2;
- if ( rRef.IsTabRel() )
- nTab = rRef.nRelTab + nOldPosTab;
+ if ( rRef2.IsTabRel() )
+ nTab = rRef2.nRelTab + nOldPosTab;
else
- nTab = rRef.nTab;
+ nTab = rRef2.nTab;
if ( nTab == nOldTab )
- rRef.nTab = nNewTab;
+ rRef2.nTab = nNewTab;
else if ( nStart <= nTab && nTab <= nEnd )
- rRef.nTab = nTab + nDir;
- rRef.nRelTab = rRef.nTab - nPosTab;
+ rRef2.nTab = nTab + nDir;
+ rRef2.nRelTab = rRef2.nTab - nPosTab;
}
else
bIsRel = TRUE;
INT16 nTab1, nTab2;
- if ( t->aRef.Ref1.IsTabRel() )
- nTab1 = t->aRef.Ref1.nRelTab + nPosTab;
+ if ( rRef1.IsTabRel() )
+ nTab1 = rRef1.nRelTab + nPosTab;
else
- nTab1 = t->aRef.Ref1.nTab;
- if ( t->aRef.Ref2.IsTabRel() )
- nTab2 = t->aRef.Ref2.nRelTab + nPosTab;
+ nTab1 = rRef1.nTab;
+ if ( rRef2.IsTabRel() )
+ nTab2 = rRef2.nRelTab + nPosTab;
else
- nTab2 = t->aRef.Ref1.nTab;
+ nTab2 = rRef1.nTab;
if ( nTab2 < nTab1 )
{ // PutInOrder
- t->aRef.Ref1.nTab = nTab2;
- t->aRef.Ref2.nTab = nTab1;
- t->aRef.Ref1.nRelTab = t->aRef.Ref1.nTab - nPosTab;
- t->aRef.Ref2.nRelTab = t->aRef.Ref2.nTab - nPosTab;
+ rRef1.nTab = nTab2;
+ rRef2.nTab = nTab1;
+ rRef1.nRelTab = rRef1.nTab - nPosTab;
+ rRef2.nRelTab = rRef2.nTab - nPosTab;
}
}
if ( bIsName && bIsRel )
@@ -3185,72 +3212,67 @@ ScRangeData* ScCompiler::UpdateMoveTab( USHORT nOldTab, USHORT nNewTab,
{
if ( t->GetRef() == 1 )
{
- SingleRefData& rRef = t->aRef.Ref1;
- if ( rRef.IsRelName() && rRef.IsTabRel() )
+ SingleRefData& rRef1 = t->GetSingleRef();
+ if ( rRef1.IsRelName() && rRef1.IsTabRel() )
{ // RelName evtl. wrappen, wie lcl_MoveItWrap in refupdat.cxx
- nTab = rRef.nRelTab + nPosTab;
+ nTab = rRef1.nRelTab + nPosTab;
if ( nTab < 0 )
nTab += nMaxTabMod;
else if ( nTab > nMaxTab )
nTab -= nMaxTabMod;
- rRef.nRelTab = nTab - nPosTab;
+ rRef1.nRelTab = nTab - nPosTab;
}
else
{
- if ( rRef.IsTabRel() )
- nTab = rRef.nRelTab + nOldPosTab;
+ if ( rRef1.IsTabRel() )
+ nTab = rRef1.nRelTab + nOldPosTab;
else
- nTab = rRef.nTab;
+ nTab = rRef1.nTab;
if ( nTab == nOldTab )
- rRef.nTab = nNewTab;
+ rRef1.nTab = nNewTab;
else if ( nStart <= nTab && nTab <= nEnd )
- rRef.nTab = nTab + nDir;
- rRef.nRelTab = rRef.nTab - nPosTab;
+ rRef1.nTab = nTab + nDir;
+ rRef1.nRelTab = rRef1.nTab - nPosTab;
}
- if( t->GetType() == svSingleRef )
+ if( t->GetType() == svDoubleRef )
{
- t->aRef.Ref2.nTab = rRef.nTab;
- t->aRef.Ref2.nRelTab = rRef.nRelTab;
- }
- else // svDoubleRef
- {
- SingleRefData& rRef = t->aRef.Ref2;
- if ( rRef.IsRelName() && rRef.IsTabRel() )
+ SingleRefData& rRef2 = t->GetDoubleRef().Ref2;
+ if ( rRef2.IsRelName() && rRef2.IsTabRel() )
{ // RelName evtl. wrappen, wie lcl_MoveItWrap in refupdat.cxx
- nTab = rRef.nRelTab + nPosTab;
+ nTab = rRef2.nRelTab + nPosTab;
if ( nTab < 0 )
nTab += nMaxTabMod;
else if ( nTab > nMaxTab )
nTab -= nMaxTabMod;
- rRef.nRelTab = nTab - nPosTab;
+ rRef2.nRelTab = nTab - nPosTab;
}
else
{
- if ( rRef.IsTabRel() )
- nTab = rRef.nRelTab + nOldPosTab;
+ if ( rRef2.IsTabRel() )
+ nTab = rRef2.nRelTab + nOldPosTab;
else
- nTab = rRef.nTab;
+ nTab = rRef2.nTab;
if ( nTab == nOldTab )
- rRef.nTab = nNewTab;
+ rRef2.nTab = nNewTab;
else if ( nStart <= nTab && nTab <= nEnd )
- rRef.nTab = nTab + nDir;
- rRef.nRelTab = rRef.nTab - nPosTab;
+ rRef2.nTab = nTab + nDir;
+ rRef2.nRelTab = rRef2.nTab - nPosTab;
}
INT16 nTab1, nTab2;
- if ( t->aRef.Ref1.IsTabRel() )
- nTab1 = t->aRef.Ref1.nRelTab + nPosTab;
+ if ( rRef1.IsTabRel() )
+ nTab1 = rRef1.nRelTab + nPosTab;
else
- nTab1 = t->aRef.Ref1.nTab;
- if ( t->aRef.Ref2.IsTabRel() )
- nTab2 = t->aRef.Ref2.nRelTab + nPosTab;
+ nTab1 = rRef1.nTab;
+ if ( rRef2.IsTabRel() )
+ nTab2 = rRef2.nRelTab + nPosTab;
else
- nTab2 = t->aRef.Ref1.nTab;
+ nTab2 = rRef1.nTab;
if ( nTab2 < nTab1 )
{ // PutInOrder
- t->aRef.Ref1.nTab = nTab2;
- t->aRef.Ref2.nTab = nTab1;
- t->aRef.Ref1.nRelTab = t->aRef.Ref1.nTab - nPosTab;
- t->aRef.Ref2.nRelTab = t->aRef.Ref2.nTab - nPosTab;
+ rRef1.nTab = nTab2;
+ rRef2.nTab = nTab1;
+ rRef1.nRelTab = rRef1.nTab - nPosTab;
+ rRef2.nRelTab = rRef2.nTab - nPosTab;
}
}
}
@@ -3281,7 +3303,7 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken,
rFormula += ' ';
if( eOp == ocSpaces )
- rFormula.Expand( rFormula.Len() + t->cByte );
+ rFormula.Expand( rFormula.Len() + t->GetByte() );
else if( eOp >= ocInternalBegin && eOp <= ocInternalEnd )
rFormula.AppendAscii( pInternal[ eOp - ocInternalBegin ] );
else if( (USHORT) eOp < nAnzStrings) // Keyword:
@@ -3299,25 +3321,25 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken,
ULONG nIndex = ( pSymbolTable == pSymbolTableEnglish ?
pDoc->GetFormatTable()->GetStandardIndex( LANGUAGE_ENGLISH_US ) : 0 );
pDoc->GetFormatTable()->
- GetInputLineString(t->nValue,nIndex,aStr);
+ GetInputLineString(t->GetDouble(),nIndex,aStr);
rFormula += aStr;
}
break;
case svString:
if( eOp == ocBad )
- rFormula += t->cStr;
+ rFormula += t->GetString();
else
{
if (bImportXML)
- rFormula += t->cStr;
+ rFormula += t->GetString();
else
{
rFormula += '"';
- if ( ScGlobal::UnicodeStrChr( t->cStr, '"' ) == NULL )
- rFormula += t->cStr;
+ if ( ScGlobal::UnicodeStrChr( t->GetString().GetBuffer(), '"' ) == NULL )
+ rFormula += t->GetString();
else
{
- String aStr( t->cStr );
+ String aStr( t->GetString() );
xub_StrLen nPos = 0;
while ( (nPos = aStr.Search( '"', nPos)) != STRING_NOTFOUND )
{
@@ -3331,9 +3353,12 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken,
}
break;
case svSingleRef:
+ {
+ SingleRefData& rRef = t->GetSingleRef();
+ ComplRefData aRef;
+ aRef.Ref1 = aRef.Ref2 = rRef;
if ( eOp == ocColRowName )
- { // hier kein t->GetReference() weil nicht ocPush oder ocColRowNameAuto
- SingleRefData& rRef = t->aRef.Ref1;
+ {
rRef.CalcAbsIfRel( aPos );
if ( pDoc->HasStringData( rRef.nCol, rRef.nRow, rRef.nTab ) )
{
@@ -3345,16 +3370,17 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken,
else
{
rFormula += ScGlobal::GetRscString(STR_NO_NAME_REF);
- rFormula += MakeRefStr( t->aRef, TRUE );
+ rFormula += MakeRefStr( aRef, TRUE );
}
}
else
{
- rFormula += MakeRefStr( t->GetReference(), TRUE );
+ rFormula += MakeRefStr( aRef, TRUE );
}
+ }
break;
case svDoubleRef:
- rFormula += MakeRefStr( t->GetReference(), FALSE );
+ rFormula += MakeRefStr( t->GetDoubleRef(), FALSE );
break;
case svIndex:
{
@@ -3363,7 +3389,7 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken,
{
case ocName:
{
- ScRangeData* pData = pDoc->GetRangeName()->FindIndex(t->nIndex);
+ ScRangeData* pData = pDoc->GetRangeName()->FindIndex(t->GetIndex());
if (pData)
{
if (pData->HasType(RT_SHARED))
@@ -3377,7 +3403,7 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken,
break;
case ocDBArea:
{
- ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex(t->nIndex);
+ ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex(t->GetIndex());
if (pDBData)
pDBData->GetName(aStr);
}
@@ -3390,14 +3416,13 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken,
break;
}
case svExternal:
- // Byte 0 ist Parameter-Count!!
- {
- // show translated name of StarOne AddIns
- String aAddIn( t->cStr+1 );
- if ( pSymbolTable != pSymbolTableEnglish )
- ScGlobal::GetAddInCollection()->LocalizeString( aAddIn );
- rFormula += aAddIn;
- }
+ {
+ // show translated name of StarOne AddIns
+ String aAddIn( t->GetExternal() );
+ if ( pSymbolTable != pSymbolTableEnglish )
+ ScGlobal::GetAddInCollection()->LocalizeString( aAddIn );
+ rFormula += aAddIn;
+ }
break;
case svByte:
case svJump:
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index cedfc36309a9..77a0eb6e0946 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: interpr1.cxx,v $
*
- * $Revision: 1.3 $
+ * $Revision: 1.4 $
*
- * last change: $Author: er $ $Date: 2001-01-10 18:48:10 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -123,19 +123,20 @@ BOOL ScInterpreter::bGlobalStackInUse = FALSE;
void ScInterpreter::ScIfJump()
{
- short nJumpCount = pCur->nJump[ 0 ];
+ const short* pJump = pCur->GetJump();
+ short nJumpCount = pJump[ 0 ];
if ( GetBool() )
{ // TRUE
if( nJumpCount >= 2 )
{ // then Zweig
nFuncFmtType = NUMBERFORMAT_UNDEFINED;
- aCode.Jump( pCur->nJump[ 1 ], pCur->nJump[ nJumpCount ] );
+ aCode.Jump( pJump[ 1 ], pJump[ nJumpCount ] );
}
else
{ // kein Parameter fuer then
nFuncFmtType = NUMBERFORMAT_LOGICAL;
PushInt(1);
- aCode.Jump( pCur->nJump[ nJumpCount ], pCur->nJump[ nJumpCount ] );
+ aCode.Jump( pJump[ nJumpCount ], pJump[ nJumpCount ] );
}
}
else
@@ -143,13 +144,13 @@ void ScInterpreter::ScIfJump()
if( nJumpCount == 3 )
{ // else Zweig
nFuncFmtType = NUMBERFORMAT_UNDEFINED;
- aCode.Jump( pCur->nJump[ 2 ], pCur->nJump[ nJumpCount ] );
+ aCode.Jump( pJump[ 2 ], pJump[ nJumpCount ] );
}
else
{ // kein Parameter fuer else
nFuncFmtType = NUMBERFORMAT_LOGICAL;
PushInt(0);
- aCode.Jump( pCur->nJump[ nJumpCount ], pCur->nJump[ nJumpCount ] );
+ aCode.Jump( pJump[ nJumpCount ], pJump[ nJumpCount ] );
}
}
}
@@ -157,10 +158,11 @@ void ScInterpreter::ScIfJump()
void ScInterpreter::ScChoseJump()
{
- short nJumpCount = pCur->nJump[ 0 ];
+ const short* pJump = pCur->GetJump();
+ short nJumpCount = pJump[ 0 ];
double nJumpIndex = SolarMath::ApproxFloor( GetDouble() );
if ((nJumpIndex >= 1) && (nJumpIndex < nJumpCount))
- aCode.Jump( pCur->nJump[ (short) nJumpIndex ], pCur->nJump[ nJumpCount ] );
+ aCode.Jump( pJump[ (short) nJumpIndex ], pJump[ nJumpCount ] );
else
SetError(errIllegalArgument);
}
@@ -1224,7 +1226,7 @@ void ScInterpreter::ScFormula()
Pop();
SetError( NOVALUE );
}
- PushStringObject( aFormula );
+ PushString( aFormula );
}
@@ -1419,7 +1421,7 @@ void ScInterpreter::ScTrim()
aStr += *p;
p++;
}
- PushStringObject( aStr );
+ PushString( aStr );
}
@@ -1427,7 +1429,7 @@ void ScInterpreter::ScUpper()
{
String aString = GetString();
ScGlobal::pCharClass->toUpper(aString);
- PushStringObject(aString);
+ PushString(aString);
}
@@ -1454,15 +1456,15 @@ void ScInterpreter::ScPropper()
nPos++;
}
aStr.ReleaseBufferAccess( nLen );
- PushStringObject( aStr );
+ PushString( aStr );
}
void ScInterpreter::ScLower()
{
- String aString = GetString();
+ String aString( GetString() );
ScGlobal::pCharClass->toLower(aString);
- PushStringObject(aString);
+ PushString(aString);
}
@@ -1501,19 +1503,19 @@ void ScInterpreter::ScT()
}
}
if ( bValue )
- PushString( NULL );
+ PushString( EMPTY_STRING );
else
{
// wie GetString()
GetCellString( aTempStr, pCell );
- PushString( aTempStr.GetBuffer() );
+ PushString( aTempStr );
}
}
break;
case svDouble :
{
PopError();
- PushString( NULL );
+ PushString( EMPTY_STRING );
}
break;
case svString :
@@ -1552,15 +1554,15 @@ void ScInterpreter::ScClean()
if ( !lcl_ScInterpreter_IsPrintable( aStr.GetChar( i ) ) )
aStr.Erase(i,1);
}
- PushStringObject(aStr);
+ PushString(aStr);
}
void ScInterpreter::ScCode()
{
//2do: make it full range unicode?
- const sal_Unicode* pStr = GetString();
- PushInt( (sal_uChar) ByteString::ConvertFromUnicode( pStr[0], gsl_getSystemTextEncoding() ) );
+ const String& rStr = GetString();
+ PushInt( (sal_uChar) ByteString::ConvertFromUnicode( rStr.GetChar(0), gsl_getSystemTextEncoding() ) );
}
@@ -1572,10 +1574,9 @@ void ScInterpreter::ScChar()
SetIllegalArgument();
else
{
- sal_Unicode cs[2];
- cs[0] = ByteString::ConvertToUnicode( (sal_Char) fVal, gsl_getSystemTextEncoding() );
- cs[1] = 0;
- PushString(cs);
+ String aStr( '0' );
+ aStr.SetChar( 0, ByteString::ConvertToUnicode( (sal_Char) fVal, gsl_getSystemTextEncoding() ) );
+ PushString( aStr );
}
}
@@ -3370,7 +3371,7 @@ void ScInterpreter::ScLookup()
if (pMat3->IsValue(nDelta))
PushDouble(pMat3->GetDouble(nDelta));
else
- PushStringObject(pMat3->GetString(nDelta));
+ PushString(pMat3->GetString(nDelta));
}
else
{
@@ -3393,7 +3394,7 @@ void ScInterpreter::ScLookup()
{
String aStr;
GetCellString(aStr, pCell);
- PushStringObject(aStr);
+ PushString(aStr);
}
}
}
@@ -3551,14 +3552,14 @@ void ScInterpreter::ScLookup()
if (bSpMatrix)
{
if (pMat1->IsString(nDelta, nR1-1))
- PushStringObject(pMat1->GetString(nDelta, nR1-1));
+ PushString(pMat1->GetString(nDelta, nR1-1));
else
PushDouble(pMat1->GetDouble(nDelta, nR1-1));
}
else
{
if (pMat1->IsString(nC1-1, nDelta))
- PushStringObject(pMat1->GetString(nC1-1, nDelta));
+ PushString(pMat1->GetString(nC1-1, nDelta));
else
PushDouble(pMat1->GetDouble(nC1-1, nDelta));
}
@@ -3767,7 +3768,7 @@ void ScInterpreter::ScHLookup()
if (!pMat->IsString(nDelta, nZIndex))
PushDouble(pMat->GetDouble(nDelta, nZIndex));
else
- PushStringObject(pMat->GetString(nDelta, nZIndex));
+ PushString(pMat->GetString(nDelta, nZIndex));
}
else
SetNV();
@@ -3795,7 +3796,7 @@ void ScInterpreter::ScHLookup()
{
String aStr;
GetCellString(aStr, pCell);
- PushStringObject(aStr);
+ PushString(aStr);
}
}
else
@@ -4009,7 +4010,7 @@ void ScInterpreter::ScVLookup()
if (!pMat->IsString(nSpIndex, nDelta))
PushDouble(pMat->GetDouble(nSpIndex, nDelta));
else
- PushStringObject(pMat->GetString(nSpIndex, nDelta));
+ PushString(pMat->GetString(nSpIndex, nDelta));
}
else
SetNV();
@@ -4035,7 +4036,7 @@ void ScInterpreter::ScVLookup()
{
String aStr;
GetCellString(aStr, pCell);
- PushStringObject(aStr);
+ PushString(aStr);
}
}
else
@@ -4415,12 +4416,10 @@ void ScInterpreter::ScAdress()
BYTE nParamCount = GetByte();
if ( MustHaveParamCount( nParamCount, 2, 4 ) )
{
- const sal_Unicode* sTabStr;
+ String sTabStr;
USHORT nAbs = 1;
if (nParamCount == 4)
sTabStr = GetString();
- else
- sTabStr = NULL;
if (nParamCount >= 3)
nAbs = (USHORT) SolarMath::ApproxFloor(GetDouble());
USHORT nCol = (USHORT) SolarMath::ApproxFloor(GetDouble());
@@ -4449,12 +4448,12 @@ void ScInterpreter::ScAdress()
else if (nAbs == 3)
aRefStr.Erase(aRefStr.Search('$',1),1);
}
- if (sTabStr != NULL)
+ if ( sTabStr.Len() )
{
aRefStr.Insert('.',0);
aRefStr.Insert(sTabStr,0);
}
- PushStringObject(aRefStr);
+ PushString(aRefStr);
}
}
@@ -4614,7 +4613,7 @@ void ScInterpreter::ScIndex()
if (!pMat->IsString(nCol-1, nRow-1))
PushDouble(pMat->GetDouble(nCol-1, nRow-1));
else
- PushStringObject(pMat->GetString(nCol-1, nRow-1));
+ PushString(pMat->GetString(nCol-1, nRow-1));
}
ResetNewMat(nMatInd1);
}
@@ -4743,7 +4742,7 @@ void ScInterpreter::ScCurrency()
BYTE nParamCount = GetByte();
if ( MustHaveParamCount( nParamCount, 1, 2 ) )
{
- String cStr;
+ String aStr;
double fDec;
if (nParamCount == 2)
{
@@ -4784,16 +4783,16 @@ void ScInterpreter::ScCurrency()
1); // 1 Vorkommanull
if (!pFormatter->GetPreviewString(sFormatString,
fVal,
- cStr,
+ aStr,
&pColor,
ScGlobal::eLnge))
SetError(errIllegalParameter);
}
else
{
- pFormatter->GetOutputString(fVal, nIndex, cStr, &pColor);
+ pFormatter->GetOutputString(fVal, nIndex, aStr, &pColor);
}
- PushStringObject(cStr);
+ PushString(aStr);
}
}
@@ -4811,13 +4810,9 @@ void ScInterpreter::ScReplace()
else
{
aOldStr.Erase( nPos-1, nCount );
- aOldStr.Insert( aNewStr, nPos-1 );
- if( aOldStr.Len() >= MAXSTRLEN )
- {
- SetError(errStringOverflow);
- aOldStr.Erase();
- }
- PushStringObject( aOldStr );
+ if ( CheckStringResultLen( aOldStr, aNewStr ) )
+ aOldStr.Insert( aNewStr, nPos-1 );
+ PushString( aOldStr );
}
}
}
@@ -4828,7 +4823,7 @@ void ScInterpreter::ScFixed()
BYTE nParamCount = GetByte();
if ( MustHaveParamCount( nParamCount, 1, 3 ) )
{
- String cStr;
+ String aStr;
double fDec;
BOOL bThousand;
if (nParamCount == 3)
@@ -4872,12 +4867,12 @@ void ScInterpreter::ScFixed()
1); // 1 Vorkommanull
if (!pFormatter->GetPreviewString(sFormatString,
fVal,
- cStr,
+ aStr,
&pColor,
ScGlobal::eLnge))
SetIllegalParameter();
else
- PushStringObject(cStr);
+ PushString(aStr);
}
}
@@ -4928,7 +4923,7 @@ void ScInterpreter::ScLeft()
if (nParamCount == 2)
{
double nVal = SolarMath::ApproxFloor(GetDouble());
- if (nVal < 0.0 || nVal > MAXSTRLEN)
+ if ( nVal < 0.0 || nVal > STRING_MAXLEN )
{
SetIllegalParameter();
return ;
@@ -4940,7 +4935,7 @@ void ScInterpreter::ScLeft()
n = 1;
String aStr( GetString() );
aStr.Erase( n );
- PushStringObject( aStr );
+ PushString( aStr );
}
}
@@ -4954,7 +4949,7 @@ void ScInterpreter::ScRight()
if (nParamCount == 2)
{
double nVal = SolarMath::ApproxFloor(GetDouble());
- if (nVal < 0.0 || nVal > MAXSTRLEN)
+ if ( nVal < 0.0 || nVal > STRING_MAXLEN )
{
SetIllegalParameter();
return ;
@@ -4967,7 +4962,7 @@ void ScInterpreter::ScRight()
String aStr( GetString() );
if( n < aStr.Len() )
aStr.Erase( 0, aStr.Len() - n );
- PushStringObject( aStr );
+ PushString( aStr );
}
}
@@ -5015,11 +5010,11 @@ void ScInterpreter::ScMid()
{
double fAnz = SolarMath::ApproxFloor(GetDouble());
double fAnfang = SolarMath::ApproxFloor(GetDouble());
- String sStr = GetString();
+ const String& rStr = GetString();
if (fAnfang < 1.0 || fAnz < 0.0 || fAnfang > double(STRING_MAXLEN) || fAnz > double(STRING_MAXLEN))
SetIllegalParameter();
else
- PushStringObject(sStr.Copy( (xub_StrLen) fAnfang - 1, (xub_StrLen) fAnz ));
+ PushString(rStr.Copy( (xub_StrLen) fAnfang - 1, (xub_StrLen) fAnz ));
}
}
@@ -5030,7 +5025,7 @@ void ScInterpreter::ScText()
{
String sFormatString = GetString();
double fVal = GetDouble();
- String cStr;
+ String aStr;
Color* pColor = NULL;
LanguageType eCellLang;
const ScPatternAttr* pPattern = pDok->GetPattern(
@@ -5040,11 +5035,11 @@ void ScInterpreter::ScText()
pPattern->GetItem( ATTR_LANGUAGE_FORMAT )).GetValue();
else
eCellLang = ScGlobal::eLnge;
- if ( !pFormatter->GetPreviewStringGuess( sFormatString, fVal, cStr,
+ if ( !pFormatter->GetPreviewStringGuess( sFormatString, fVal, aStr,
&pColor, eCellLang ) )
SetIllegalParameter();
else
- PushStringObject(cStr);
+ PushString(aStr);
}
}
@@ -5058,7 +5053,7 @@ void ScInterpreter::ScSubstitute()
if (nParamCount == 4)
{
double fAnz = SolarMath::ApproxFloor(GetDouble());
- if( fAnz < 1 || fAnz > MAXSTRLEN )
+ if( fAnz < 1 || fAnz > STRING_MAXLEN )
{
SetIllegalParameter();
return;
@@ -5084,9 +5079,12 @@ void ScInterpreter::ScSubstitute()
if( !nAnz || nCount == nAnz )
{
sStr.Erase(nPos,nOldLen);
- sStr.Insert(sNewStr,nPos);
- nPos += nNewLen;
- if( sStr.Len() >= MAXSTRLEN )
+ if ( CheckStringResultLen( sStr, sNewStr ) )
+ {
+ sStr.Insert(sNewStr,nPos);
+ nPos += nNewLen;
+ }
+ else
break;
}
else
@@ -5095,7 +5093,7 @@ void ScInterpreter::ScSubstitute()
else
break;
}
- PushStringObject( sStr );
+ PushString( sStr );
}
}
@@ -5105,23 +5103,29 @@ void ScInterpreter::ScRept()
if ( MustHaveParamCount( GetByte(), 2 ) )
{
double fAnz = SolarMath::ApproxFloor(GetDouble());
+ String aStr( GetString() );
if ( fAnz < 0.0 )
SetIllegalParameter();
- else if ( fAnz > MAXSTRLEN )
+ else if ( fAnz * aStr.Len() > STRING_MAXLEN )
{
SetError( errStringOverflow );
PushInt(0);
}
else if ( fAnz == 0.0 )
- PushString( NULL );
+ PushString( EMPTY_STRING );
else
{
- short n = (short) fAnz;
+ xub_StrLen n = (xub_StrLen) fAnz;
+ const xub_StrLen nLen = aStr.Len();
String aRes;
- String aStr( GetString() );
+ const sal_Unicode* const pSrc = aStr.GetBuffer();
+ sal_Unicode* pDst = aRes.AllocBuffer( n * nLen );
while( n-- )
- aRes += aStr;
- PushStringObject( aRes );
+ {
+ memcpy( pDst, pSrc, nLen * sizeof(sal_Unicode) );
+ pDst += nLen;
+ }
+ PushString( aRes );
}
}
}
@@ -5133,10 +5137,10 @@ void ScInterpreter::ScConcat()
String aRes;
while( nParamCount-- )
{
- const sal_Unicode* p = GetString();
- aRes.Insert( p, 0 );
+ const String& rStr = GetString();
+ aRes.Insert( rStr, 0 );
}
- PushStringObject( aRes );
+ PushString( aRes );
}
diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index 175120ed8f89..48942e34ba20 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: interpr2.cxx,v $
*
- * $Revision: 1.4 $
+ * $Revision: 1.5 $
*
- * last change: $Author: nn $ $Date: 2000-10-31 17:43:04 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -1577,9 +1577,9 @@ void ScInterpreter::ScCurrent()
break;
case svString :
{
- const sal_Unicode* pStr = PopString();
- PushString( pStr );
- PushString( pStr );
+ const String& rStr = PopString();
+ PushString( rStr );
+ PushString( rStr );
}
break;
case svDoubleRef :
@@ -1605,8 +1605,8 @@ void ScInterpreter::ScCurrent()
{
String aStr;
GetCellString( aStr, pCell );
- PushStringObject( aStr );
- PushStringObject( aStr );
+ PushString( aStr );
+ PushString( aStr );
}
}
else
@@ -1794,11 +1794,12 @@ void ScInterpreter::ScBase()
0
};
static const int nDigits = (sizeof(pDigits)/sizeof(sal_Unicode))-1;
+ const size_t nBuf = 384;
USHORT nMinLen;
if ( nParamCount == 3 )
{
double fLen = SolarMath::ApproxFloor( GetDouble() );
- if ( 1 <= fLen && fLen < MAXSTRLEN )
+ if ( 1 <= fLen && fLen < nBuf-1 )
nMinLen = (USHORT) fLen;
else
nMinLen = 0; // Error
@@ -1810,12 +1811,8 @@ void ScInterpreter::ScBase()
if ( !nGlobalError && nMinLen && 2 <= fBase && fBase <= nDigits && 0 <= fVal )
{
- const size_t nBuf = MAXSTRLEN+1;
sal_Unicode pBuf[nBuf];
- for ( size_t j=0; j<nBuf; j++ )
- {
- pBuf[j] = '0';
- }
+ memset( pBuf, '0', nBuf );
sal_Unicode* p = pBuf + nBuf - 1;
*p = 0;
if ( fVal <= (ULONG)(~0) )
@@ -1889,7 +1886,7 @@ void ScInterpreter::ScBase()
{
if ( nBuf - (p - pBuf) <= nMinLen )
p = pBuf + nBuf - 1 - nMinLen;
- PushString( p );
+ PushStringBuffer( p );
}
}
else
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 7837b0623610..c816935bedde 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: interpr4.cxx,v $
*
- * $Revision: 1.6 $
+ * $Revision: 1.7 $
*
- * last change: $Author: er $ $Date: 2001-02-13 19:01:55 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -139,8 +139,6 @@ extern BOOL bOderSo; // in GLOBAL.CXX
//-----------------------------statische Daten-----------------
-const sal_Unicode ScInterpreter::cEmptyString = 0;
-
USHORT ScInterpreter::nGlobalError = 0; // fuer matherr
#if SOMA_FPSIGNAL_JUMP
@@ -453,24 +451,10 @@ void ScInterpreter::GetCellString( String& rStr, const ScBaseCell* pCell )
switch (pCell->GetCellType())
{
case CELLTYPE_STRING:
- {
((ScStringCell*) pCell)->GetString(rStr);
- if (rStr.Len() >= MAXSTRLEN)
- {
- rStr.Erase();
- nErr = errStringOverflow;
- }
- }
break;
case CELLTYPE_EDIT:
- {
((ScEditCell*) pCell)->GetString(rStr);
- if (rStr.Len() >= MAXSTRLEN)
- {
- rStr.Erase();
- nErr = errStringOverflow;
- }
- }
break;
case CELLTYPE_FORMULA:
{
@@ -859,11 +843,11 @@ void ScInterpreter::PushTempToken( const ScToken& r )
}
-//! Nur fuer PushDouble/PushInt!
-//! Das Token wurde per new angelegt und darf nach diesem Aufruf wg.
-//! eventuellem delete bei errStackOverflow nicht mehr benutzt werden, falls
-//! nicht ein RefCount gesetzt wurde!
-void ScInterpreter::PushTempToken( ScDoubleToken* p )
+//! Only for PushDouble/PushInt!
+//! The Token had to be allocated with `new' and must not be used after this
+//! call because eventually it gets deleted in case of a errStackOverflow if
+//! no RefCount was set!
+void ScInterpreter::PushTempToken( ScToken* p )
{
((ScToken*)p)->IncRef();
if ( sp >= MAXSTACK )
@@ -895,12 +879,12 @@ double ScInterpreter::PopDouble()
if ( !nGlobalError )
nGlobalError = pErrorStack[ sp ];
if( p->GetType() == svDouble )
- return p->nValue;
+ return p->GetDouble();
else if( p->GetType() == svMissing )
- return 0;
+ return 0.0;
}
SetError(errUnknownStackVariable);
- return 0;
+ return 0.0;
}
@@ -913,7 +897,7 @@ BYTE ScInterpreter::PopByte()
if ( !nGlobalError )
nGlobalError = pErrorStack[ sp ];
if( p->GetType() == svByte )
- return p->cByte;
+ return p->GetByte();
else if( p->GetType() == svMissing )
SetError( errIllegalParameter );
}
@@ -922,7 +906,7 @@ BYTE ScInterpreter::PopByte()
}
-const sal_Unicode* ScInterpreter::PopString()
+const String& ScInterpreter::PopString()
{
nCurFmtType = NUMBERFORMAT_TEXT;
nCurFmtIndex = 0;
@@ -933,12 +917,12 @@ const sal_Unicode* ScInterpreter::PopString()
if ( !nGlobalError )
nGlobalError = pErrorStack[ sp ];
if( p->GetType() == svString )
- return p->cStr;
+ return p->GetString();
else if( p->GetType() == svMissing )
- return &cEmptyString;
+ return EMPTY_STRING;
}
SetError(errUnknownStackVariable);
- return &cEmptyString;
+ return EMPTY_STRING;
}
@@ -952,24 +936,24 @@ void ScInterpreter::PopSingleRef(USHORT& rCol, USHORT &rRow, USHORT& rTab)
nGlobalError = pErrorStack[ sp ];
if( p->GetType() == svSingleRef )
{
- const SingleRefData& aRef = p->aRef.Ref1;
- if ( aRef.IsColRel() )
- rCol = aPos.Col() + aRef.nRelCol;
+ const SingleRefData& rRef = p->GetSingleRef();
+ if ( rRef.IsColRel() )
+ rCol = aPos.Col() + rRef.nRelCol;
else
- rCol = aRef.nCol;
- if ( aRef.IsRowRel() )
- rRow = aPos.Row() + aRef.nRelRow;
+ rCol = rRef.nCol;
+ if ( rRef.IsRowRel() )
+ rRow = aPos.Row() + rRef.nRelRow;
else
- rRow = aRef.nRow;
- if ( aRef.IsTabRel() )
- rTab = aPos.Tab() + aRef.nRelTab;
+ rRow = rRef.nRow;
+ if ( rRef.IsTabRel() )
+ rTab = aPos.Tab() + rRef.nRelTab;
else
- rTab = aRef.nTab;
- if( rCol < 0 || rCol > MAXCOL || aRef.IsColDeleted() )
+ rTab = rRef.nTab;
+ if( rCol < 0 || rCol > MAXCOL || rRef.IsColDeleted() )
SetError( errNoRef ), rCol = 0;
- if( rRow < 0 || rRow > MAXROW || aRef.IsRowDeleted() )
+ if( rRow < 0 || rRow > MAXROW || rRef.IsRowDeleted() )
SetError( errNoRef ), rRow = 0;
- if( rTab < 0 || rTab >= pDok->GetTableCount() || aRef.IsTabDeleted() )
+ if( rTab < 0 || rTab >= pDok->GetTableCount() || rRef.IsTabDeleted() )
SetError( errNoRef ), rTab = 0;
if ( aTableOpList.Count() > 0 )
ReplaceCell( rCol, rRow, rTab );
@@ -993,24 +977,24 @@ void ScInterpreter::PopSingleRef( ScAddress& rAdr )
if( p->GetType() == svSingleRef )
{
short nCol, nRow, nTab;
- const SingleRefData& aRef = p->aRef.Ref1;
- if ( aRef.IsColRel() )
- nCol = aPos.Col() + aRef.nRelCol;
+ const SingleRefData& rRef = p->GetSingleRef();
+ if ( rRef.IsColRel() )
+ nCol = aPos.Col() + rRef.nRelCol;
else
- nCol = aRef.nCol;
- if ( aRef.IsRowRel() )
- nRow = aPos.Row() + aRef.nRelRow;
+ nCol = rRef.nCol;
+ if ( rRef.IsRowRel() )
+ nRow = aPos.Row() + rRef.nRelRow;
else
- nRow = aRef.nRow;
- if ( aRef.IsTabRel() )
- nTab = aPos.Tab() + aRef.nRelTab;
+ nRow = rRef.nRow;
+ if ( rRef.IsTabRel() )
+ nTab = aPos.Tab() + rRef.nRelTab;
else
- nTab = aRef.nTab;
- if( nCol < 0 || nCol > MAXCOL || aRef.IsColDeleted() )
+ nTab = rRef.nTab;
+ if( nCol < 0 || nCol > MAXCOL || rRef.IsColDeleted() )
SetError( errNoRef ), nCol = 0;
- if( nRow < 0 || nRow > MAXROW || aRef.IsRowDeleted() )
+ if( nRow < 0 || nRow > MAXROW || rRef.IsRowDeleted() )
SetError( errNoRef ), nRow = 0;
- if( nTab < 0 || nTab >= pDok->GetTableCount() || aRef.IsTabDeleted() )
+ if( nTab < 0 || nTab >= pDok->GetTableCount() || rRef.IsTabDeleted() )
SetError( errNoRef ), nTab = 0;
rAdr.Set( (USHORT)nCol, (USHORT)nRow, (USHORT)nTab );
if ( aTableOpList.Count() > 0 )
@@ -1036,47 +1020,48 @@ void ScInterpreter::PopDoubleRef(USHORT& rCol1, USHORT &rRow1, USHORT& rTab1,
nGlobalError = pErrorStack[ sp ];
if( p->GetType() == svDoubleRef )
{
+ const ComplRefData& rCRef = p->GetDoubleRef();
USHORT nMaxTab = pDok->GetTableCount();
{
- const SingleRefData& aRef = p->aRef.Ref1;
- if ( aRef.IsColRel() )
- rCol1 = aPos.Col() + aRef.nRelCol;
+ const SingleRefData& rRef = rCRef.Ref1;
+ if ( rRef.IsColRel() )
+ rCol1 = aPos.Col() + rRef.nRelCol;
else
- rCol1 = aRef.nCol;
- if ( aRef.IsRowRel() )
- rRow1 = aPos.Row() + aRef.nRelRow;
+ rCol1 = rRef.nCol;
+ if ( rRef.IsRowRel() )
+ rRow1 = aPos.Row() + rRef.nRelRow;
else
- rRow1 = aRef.nRow;
- if ( aRef.IsTabRel() )
- rTab1 = aPos.Tab() + aRef.nRelTab;
+ rRow1 = rRef.nRow;
+ if ( rRef.IsTabRel() )
+ rTab1 = aPos.Tab() + rRef.nRelTab;
else
- rTab1 = aRef.nTab;
- if( rCol1 < 0 || rCol1 > MAXCOL || aRef.IsColDeleted() )
+ rTab1 = rRef.nTab;
+ if( rCol1 < 0 || rCol1 > MAXCOL || rRef.IsColDeleted() )
SetError( errNoRef ), rCol1 = 0;
- if( rRow1 < 0 || rRow1 > MAXROW || aRef.IsRowDeleted() )
+ if( rRow1 < 0 || rRow1 > MAXROW || rRef.IsRowDeleted() )
SetError( errNoRef ), rRow1 = 0;
- if( rTab1 < 0 || rTab1 >= nMaxTab || aRef.IsTabDeleted() )
+ if( rTab1 < 0 || rTab1 >= nMaxTab || rRef.IsTabDeleted() )
SetError( errNoRef ), rTab1 = 0;
}
{
- const SingleRefData& aRef = p->aRef.Ref2;
- if ( aRef.IsColRel() )
- rCol2 = aPos.Col() + aRef.nRelCol;
+ const SingleRefData& rRef = rCRef.Ref2;
+ if ( rRef.IsColRel() )
+ rCol2 = aPos.Col() + rRef.nRelCol;
else
- rCol2 = aRef.nCol;
- if ( aRef.IsRowRel() )
- rRow2 = aPos.Row() + aRef.nRelRow;
+ rCol2 = rRef.nCol;
+ if ( rRef.IsRowRel() )
+ rRow2 = aPos.Row() + rRef.nRelRow;
else
- rRow2 = aRef.nRow;
- if ( aRef.IsTabRel() )
- rTab2 = aPos.Tab() + aRef.nRelTab;
+ rRow2 = rRef.nRow;
+ if ( rRef.IsTabRel() )
+ rTab2 = aPos.Tab() + rRef.nRelTab;
else
- rTab2 = aRef.nTab;
- if( rCol2 < 0 || rCol2 > MAXCOL || aRef.IsColDeleted() )
+ rTab2 = rRef.nTab;
+ if( rCol2 < 0 || rCol2 > MAXCOL || rRef.IsColDeleted() )
SetError( errNoRef ), rCol2 = 0;
- if( rRow2 < 0 || rRow2 > MAXROW || aRef.IsRowDeleted() )
+ if( rRow2 < 0 || rRow2 > MAXROW || rRef.IsRowDeleted() )
SetError( errNoRef ), rRow2 = 0;
- if( rTab2 < 0 || rTab2 >= nMaxTab || aRef.IsTabDeleted() )
+ if( rTab2 < 0 || rTab2 >= nMaxTab || rRef.IsTabDeleted() )
SetError( errNoRef ), rTab2 = 0;
}
if ( aTableOpList.Count() > 0 && !bDontCheckForTableOp )
@@ -1104,49 +1089,50 @@ void ScInterpreter::PopDoubleRef( ScRange& rRange, BOOL bDontCheckForTableOp )
nGlobalError = pErrorStack[ sp ];
if( p->GetType() == svDoubleRef )
{
+ const ComplRefData& rCRef = p->GetDoubleRef();
short nCol, nRow, nTab;
USHORT nMaxTab = pDok->GetTableCount();
{
- const SingleRefData& aRef = p->aRef.Ref1;
- if ( aRef.IsColRel() )
- nCol = aPos.Col() + aRef.nRelCol;
+ const SingleRefData& rRef = rCRef.Ref1;
+ if ( rRef.IsColRel() )
+ nCol = aPos.Col() + rRef.nRelCol;
else
- nCol = aRef.nCol;
- if ( aRef.IsRowRel() )
- nRow = aPos.Row() + aRef.nRelRow;
+ nCol = rRef.nCol;
+ if ( rRef.IsRowRel() )
+ nRow = aPos.Row() + rRef.nRelRow;
else
- nRow = aRef.nRow;
- if ( aRef.IsTabRel() )
- nTab = aPos.Tab() + aRef.nRelTab;
+ nRow = rRef.nRow;
+ if ( rRef.IsTabRel() )
+ nTab = aPos.Tab() + rRef.nRelTab;
else
- nTab = aRef.nTab;
- if( nCol < 0 || nCol > MAXCOL || aRef.IsColDeleted() )
+ nTab = rRef.nTab;
+ if( nCol < 0 || nCol > MAXCOL || rRef.IsColDeleted() )
SetError( errNoRef ), nCol = 0;
- if( nRow < 0 || nRow > MAXROW || aRef.IsRowDeleted() )
+ if( nRow < 0 || nRow > MAXROW || rRef.IsRowDeleted() )
SetError( errNoRef ), nRow = 0;
- if( nTab < 0 || nTab >= nMaxTab || aRef.IsTabDeleted() )
+ if( nTab < 0 || nTab >= nMaxTab || rRef.IsTabDeleted() )
SetError( errNoRef ), nTab = 0;
rRange.aStart.Set( (USHORT)nCol, (USHORT)nRow, (USHORT)nTab );
}
{
- const SingleRefData& aRef = p->aRef.Ref2;
- if ( aRef.IsColRel() )
- nCol = aPos.Col() + aRef.nRelCol;
+ const SingleRefData& rRef = rCRef.Ref2;
+ if ( rRef.IsColRel() )
+ nCol = aPos.Col() + rRef.nRelCol;
else
- nCol = aRef.nCol;
- if ( aRef.IsRowRel() )
- nRow = aPos.Row() + aRef.nRelRow;
+ nCol = rRef.nCol;
+ if ( rRef.IsRowRel() )
+ nRow = aPos.Row() + rRef.nRelRow;
else
- nRow = aRef.nRow;
- if ( aRef.IsTabRel() )
- nTab = aPos.Tab() + aRef.nRelTab;
+ nRow = rRef.nRow;
+ if ( rRef.IsTabRel() )
+ nTab = aPos.Tab() + rRef.nRelTab;
else
- nTab = aRef.nTab;
- if( nCol < 0 || nCol > MAXCOL || aRef.IsColDeleted() )
+ nTab = rRef.nTab;
+ if( nCol < 0 || nCol > MAXCOL || rRef.IsColDeleted() )
SetError( errNoRef ), nCol = 0;
- if( nRow < 0 || nRow > MAXROW || aRef.IsRowDeleted() )
+ if( nRow < 0 || nRow > MAXROW || rRef.IsRowDeleted() )
SetError( errNoRef ), nRow = 0;
- if( nTab < 0 || nTab >= nMaxTab || aRef.IsTabDeleted() )
+ if( nTab < 0 || nTab >= nMaxTab || rRef.IsTabDeleted() )
SetError( errNoRef ), nTab = 0;
rRange.aEnd.Set( (USHORT)nCol, (USHORT)nRow, (USHORT)nTab );
}
@@ -1217,7 +1203,7 @@ ScMatrix* ScInterpreter::PopMatrix()
if ( !nGlobalError )
nGlobalError = pErrorStack[ sp ];
if( p->GetType() == svMatrix )
- return p->pMat;
+ return p->GetMatrix();
else if( p->GetType() == svMissing )
SetError( errIllegalParameter );
}
@@ -1236,59 +1222,45 @@ void ScInterpreter::PushDouble(double nVal)
SetError(errIllegalFPOperation);
}
#endif
- ScDoubleToken* pToken = new ScDoubleToken;
- ((ScToken*)pToken)->SetDouble( nVal );
- ((ScToken*)pToken)->bRaw = FALSE;
- PushTempToken( pToken );
+ PushTempToken( new ScDoubleToken( nVal ) );
}
void ScInterpreter::PushInt(int nVal)
{
- ScDoubleToken* pToken = new ScDoubleToken;
- ((ScToken*)pToken)->SetInt( nVal );
- ((ScToken*)pToken)->bRaw = FALSE;
- PushTempToken( pToken );
+ PushTempToken( new ScDoubleToken( nVal ) );
}
-void ScInterpreter::PushString( const sal_Unicode* cString )
+void ScInterpreter::PushStringBuffer( const sal_Unicode* pString )
{
- ScToken aToken;
- aToken.SetString( cString );
- PushTempToken( aToken );
+ if ( pString )
+ PushString( String( pString ) );
+ else
+ PushString( EMPTY_STRING );
}
-void ScInterpreter::PushStringObject(const String& aString)
+void ScInterpreter::PushString( const String& rString )
{
- if( aString.Len() >= MAXSTRLEN )
- {
- SetError( errStringOverflow );
- PushString( NULL );
- }
- else
- PushString( aString.GetBuffer() );
+ PushTempToken( new ScStringToken( rString ) );
}
void ScInterpreter::PushSingleRef(USHORT nCol, USHORT nRow, USHORT nTab)
{
- ScToken aToken;
SingleRefData aRef;
aRef.InitFlags();
aRef.nCol = nCol;
aRef.nRow = nRow;
aRef.nTab = nTab;
- aToken.SetSingleReference( aRef );
- PushTempToken( aToken );
+ PushTempToken( new ScSingleRefToken( aRef ) );
}
void ScInterpreter::PushDoubleRef(USHORT nCol1, USHORT nRow1, USHORT nTab1,
USHORT nCol2, USHORT nRow2, USHORT nTab2)
{
- ScToken aToken;
ComplRefData aRef;
aRef.InitFlags();
aRef.Ref1.nCol = nCol1;
@@ -1297,16 +1269,13 @@ void ScInterpreter::PushDoubleRef(USHORT nCol1, USHORT nRow1, USHORT nTab1,
aRef.Ref2.nCol = nCol2;
aRef.Ref2.nRow = nRow2;
aRef.Ref2.nTab = nTab2;
- aToken.SetDoubleReference( aRef );
- PushTempToken( aToken );
+ PushTempToken( new ScDoubleRefToken( aRef ) );
}
void ScInterpreter::PushMatrix(ScMatrix* pMat)
{
- ScToken aToken;
- aToken.SetMatrix( pMat );
- PushTempToken( aToken );
+ PushTempToken( new ScMatrixToken( pMat ) );
}
@@ -1451,16 +1420,16 @@ double ScInterpreter::GetDouble()
SetError(errIllegalArgument);
nVal = 0.0;
}
- break;
}
+ break;
case svSingleRef:
{
ScAddress aAdr;
PopSingleRef( aAdr );
ScBaseCell* pCell = GetCell( aAdr );
nVal = GetCellValue( aAdr, pCell );
- break;
}
+ break;
case svDoubleRef:
{ // positionsabhaengige SingleRef generieren
ScRange aRange;
@@ -1486,9 +1455,8 @@ double ScInterpreter::GetDouble()
}
-const sal_Unicode* ScInterpreter::GetString()
+const String& ScInterpreter::GetString()
{
- const sal_Unicode* p;
StackVar eRes = (StackVar) GetStackType();
if( eRes == svDouble && pStack[ sp-1 ]->GetType() == svMissing )
eRes = svString;
@@ -1501,11 +1469,12 @@ const sal_Unicode* ScInterpreter::GetString()
NUMBERFORMAT_NUMBER,
ScGlobal::eLnge);
pFormatter->GetInputLineString(fVal, nIndex, aTempStr);
- p = aTempStr.GetBuffer();
- break;
+ return aTempStr;
}
+ break;
case svString:
- p = PopString(); break;
+ return PopString();
+ break;
case svSingleRef:
{
ScAddress aAdr;
@@ -1514,12 +1483,12 @@ const sal_Unicode* ScInterpreter::GetString()
{
ScBaseCell* pCell = GetCell( aAdr );
GetCellString( aTempStr, pCell );
- p = aTempStr.GetBuffer();
+ return aTempStr;
}
else
- p = &cEmptyString;
- break;
+ return EMPTY_STRING;
}
+ break;
case svDoubleRef:
{ // positionsabhaengige SingleRef generieren
ScRange aRange;
@@ -1529,18 +1498,17 @@ const sal_Unicode* ScInterpreter::GetString()
{
ScBaseCell* pCell = GetCell( aAdr );
GetCellString( aTempStr, pCell );
- p = aTempStr.GetBuffer();
+ return aTempStr;
}
else
- p = &cEmptyString;
+ return EMPTY_STRING;
}
break;
default:
Pop();
SetError(errIllegalParameter);
- p = &cEmptyString;
}
- return p;
+ return EMPTY_STRING;
}
@@ -1576,14 +1544,14 @@ void ScInterpreter::ScDBGet()
{
String rString;
((ScStringCell*)pCell)->GetString(rString);
- PushStringObject(rString);
+ PushString(rString);
}
break;
case CELLTYPE_EDIT:
{
String rString;
((ScEditCell*)pCell)->GetString(rString);
- PushStringObject(rString);
+ PushString(rString);
}
break;
case CELLTYPE_FORMULA:
@@ -1603,7 +1571,7 @@ void ScInterpreter::ScDBGet()
{
String rString;
((ScFormulaCell*)pCell)->GetString(rString);
- PushStringObject(rString);
+ PushString(rString);
}
}
break;
@@ -1628,9 +1596,8 @@ void ScInterpreter::ScExternal()
USHORT nIndex;
BYTE nParamCount = GetByte();
String aUnoName;
- // Achtung: Der String faengt im 2. Byte an!!
- const sal_Unicode* pFuncName = pCur->cStr + 1;
- if (ScGlobal::GetFuncCollection()->SearchFunc(pFuncName, nIndex))
+ String aFuncName( pCur->GetExternal() );
+ if (ScGlobal::GetFuncCollection()->SearchFunc(aFuncName, nIndex))
{
FuncData* pFuncData = (FuncData*)ScGlobal::GetFuncCollection()->At(nIndex);
if (nParamCount == pFuncData->GetParamCount() - 1)
@@ -1730,7 +1697,7 @@ void ScInterpreter::ScExternal()
ppParam[0] = pcErg;
pFuncData->Call(ppParam);
String aUni( pcErg, osl_getThreadTextEncoding() );
- PushString( aUni.GetBuffer() );
+ PushString( aUni );
delete[] pcErg;
}
break;
@@ -1775,7 +1742,7 @@ void ScInterpreter::ScExternal()
PushDouble( pAs->GetValue() );
break;
case PTR_STRING :
- PushStringObject( pAs->GetString() );
+ PushString( pAs->GetString() );
break;
default:
SetError( errUnknownState );
@@ -1804,7 +1771,7 @@ void ScInterpreter::ScExternal()
PushInt(0);
}
}
- else if ( ( aUnoName = ScGlobal::GetAddInCollection()->FindFunction(pFuncName, FALSE) ).Len() )
+ else if ( ( aUnoName = ScGlobal::GetAddInCollection()->FindFunction(aFuncName, FALSE) ).Len() )
{
// bLocalFirst=FALSE in FindFunction, cFunc should be the stored internal name
@@ -2144,7 +2111,7 @@ void ScInterpreter::ScExternal()
} // otherwise error code has been set in GetNewMat
}
else if ( aCall.HasString() )
- PushStringObject( aCall.GetString() );
+ PushString( aCall.GetString() );
else
PushDouble( aCall.GetValue() );
}
@@ -2163,9 +2130,7 @@ void ScInterpreter::ScExternal()
void ScInterpreter::ScMissing()
{
- ScToken aToken;
- aToken.SetOpCode( ocMissing );
- PushTempToken( aToken );
+ PushTempToken( new ScMissingToken );
}
@@ -2174,7 +2139,7 @@ void ScInterpreter::ScMacro()
SbxBase::ResetError();
BYTE nParamCount = GetByte();
- const sal_Unicode* pMacro = pCur->cStr + 1; // Achtung: Der String faengt im 2. Byte an!!
+ String aMacro( pCur->GetString() );
SfxObjectShell* pDocSh = pDok->GetDocumentShell();
if ( !pDocSh || !pDok->CheckMacroWarn() )
@@ -2196,7 +2161,7 @@ void ScInterpreter::ScMacro()
// dann aBasicStr, aMacroStr fuer SfxObjectShell::CallBasic zusammenbauen
StarBASIC* pRoot = pDocSh->GetBasic();
- SbxVariable* pVar = pRoot->Find( String( pMacro ), SbxCLASS_METHOD );
+ SbxVariable* pVar = pRoot->Find( aMacro, SbxCLASS_METHOD );
if( !pVar || pVar->GetType() == SbxVOID || !pVar->ISA(SbMethod) )
{
SetError( errNoName );
@@ -2233,7 +2198,7 @@ void ScInterpreter::ScMacro()
pPar->PutDouble( GetDouble() );
break;
case svString:
- pPar->PutString( String( GetString() ) );
+ pPar->PutString( GetString() );
break;
case svSingleRef:
{
@@ -2381,7 +2346,7 @@ void ScInterpreter::ScMacro()
SetNoValue();
}
else
- PushStringObject( refRes->GetString() );
+ PushString( refRes->GetString() );
if( pVar->GetError() )
SetNoValue();
}
@@ -2501,7 +2466,7 @@ void ScInterpreter::ScTableOp()
{
String aCellString;
GetCellString(aCellString, pFCell);
- PushStringObject(aCellString);
+ PushString(aCellString);
}
if (pTableOp)
{
@@ -2540,7 +2505,7 @@ void ScInterpreter::ScDefPar()
void ScInterpreter::ScDBArea()
{
- ScDBData* pDBData = pDok->GetDBCollection()->FindIndex( pCur->nIndex);
+ ScDBData* pDBData = pDok->GetDBCollection()->FindIndex( pCur->GetIndex());
if (pDBData)
{
ComplRefData aRefData;
@@ -2552,9 +2517,7 @@ void ScInterpreter::ScDBArea()
(USHORT&) aRefData.Ref2.nRow);
aRefData.Ref2.nTab = aRefData.Ref1.nTab;
aRefData.CalcRelFromAbs( aPos );
- ScToken aTok;
- aTok.SetDoubleReference( aRefData );
- PushTempToken( aTok );
+ PushTempToken( new ScDoubleRefToken( aRefData ) );
}
else
SetError(errNoName);
@@ -2563,7 +2526,7 @@ void ScInterpreter::ScDBArea()
void ScInterpreter::ScColRowNameAuto()
{
- ComplRefData aRefData( pCur->aRef );
+ ComplRefData aRefData( pCur->GetDoubleRef() );
aRefData.CalcAbsIfRel( aPos );
if ( aRefData.Valid() )
{
@@ -2636,9 +2599,7 @@ void ScInterpreter::ScColRowNameAuto()
}
else
SetError( errNoRef );
- ScToken aTok;
- aTok.SetDoubleReference( aRefData );
- PushTempToken( aTok );
+ PushTempToken( new ScDoubleRefToken( aRefData ) );
}
// --- internals ------------------------------------------------------------
@@ -2666,7 +2627,7 @@ void ScInterpreter::ScCalcTeam()
String aTeam( RTL_CONSTASCII_USTRINGPARAM( "Timm, Ballach, Rathke, Rentz, Nebel" ) );
if ( (GetByte() == 1) && SolarMath::ApproxEqual( GetDouble(), 1996) )
aTeam.AppendAscii( " (a word with 'B': -Olk, -Nietsch, -Daeumling)" );
- PushStringObject( aTeam );
+ PushString( aTeam );
bShown = TRUE;
}
else
@@ -2688,11 +2649,11 @@ void ScInterpreter::ScSpewFunc()
case svSingleRef:
case svDoubleRef:
{
- const sal_Unicode* p = GetString();
- if ( !bRefresh && *p < 256 )
- bRefresh = (tolower( (sal_uChar) *p ) == 'r');
- if ( !bClear && *p < 256 )
- bClear = (tolower( (sal_uChar) *p ) == 'c');
+ const sal_Unicode ch = GetString().GetChar(0);
+ if ( !bRefresh && ch < 256 )
+ bRefresh = (tolower( (sal_uChar) ch ) == 'r');
+ if ( !bClear && ch < 256 )
+ bClear = (tolower( (sal_uChar) ch ) == 'c');
}
break;
default:
@@ -2712,7 +2673,7 @@ void ScInterpreter::ScSpewFunc()
#else
aStr.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "spitted out all spew :-(" ) );
#endif
- PushStringObject( aStr );
+ PushString( aStr );
}
@@ -2893,9 +2854,9 @@ int main()
while ( nParamCount-- )
Pop();
if ( !aResult.Len() )
- PushStringObject( String( pGames[ eGame ], RTL_TEXTENCODING_ASCII_US ) );
+ PushString( String( pGames[ eGame ], RTL_TEXTENCODING_ASCII_US ) );
else
- PushStringObject( aResult );
+ PushString( aResult );
}
void ScInterpreter::ScTTT()
@@ -2929,7 +2890,7 @@ void ScInterpreter::ScTTT()
aFace[2] = sBads[ rand() % ((sizeof( sBads )/sizeof(sal_Unicode)) - 1) ];
}
aFace[3] = 0;
- PushString( aFace );
+ PushStringBuffer( aFace );
}
// -------------------------------------------------------------------------
@@ -3029,7 +2990,7 @@ StackVar ScInterpreter::Interpret()
&& (!nGlobalError || nErrorFunction <= nErrorFunctionCount) )
{
OpCode eOp = pCur->GetOpCode();
- cPar = pCur->cByte;
+ cPar = pCur->GetByte();
if ( eOp == ocPush )
{
Push( (ScToken&) *pCur );
@@ -3466,7 +3427,7 @@ StackVar ScInterpreter::Interpret()
switch( eResult = pCur->GetType() )
{
case svDouble :
- nResult = pCur->nValue;
+ nResult = pCur->GetDouble();
if ( nFuncFmtType == NUMBERFORMAT_UNDEFINED )
{
nRetTypeExpr = NUMBERFORMAT_NUMBER;
diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx
index 001fd64da808..5689c949c262 100644
--- a/sc/source/core/tool/interpr5.cxx
+++ b/sc/source/core/tool/interpr5.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: interpr5.cxx,v $
*
- * $Revision: 1.2 $
+ * $Revision: 1.3 $
*
- * last change: $Author: er $ $Date: 2001-02-13 19:01:55 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -671,7 +671,7 @@ void ScInterpreter::ScMatValue()
BOOL bIsString;
const MatValue* pMatVal = pMat->Get(nC, nR, bIsString);
if (bIsString)
- PushStringObject(*(pMatVal->pS));
+ PushString(*(pMatVal->pS));
else
PushDouble(pMatVal->fVal);
}
@@ -700,7 +700,7 @@ void ScInterpreter::ScMatValue()
{
String aStr;
GetCellString(aStr, pCell);
- PushStringObject(aStr);
+ PushString(aStr);
}
}
else
@@ -719,7 +719,7 @@ void ScInterpreter::ScMatValue()
BOOL bIsString;
const MatValue* pMatVal = pMat->Get(nC, nR, bIsString);
if (bIsString)
- PushStringObject(*(pMatVal->pS));
+ PushString(*(pMatVal->pS));
else
PushDouble(pMatVal->fVal);
}
@@ -1741,11 +1741,9 @@ void ScInterpreter::ScAmpersand()
}
else
{
- sStr1 += sStr2;
- if (sStr1.Len() < MAXSTRLEN)
- PushStringObject(sStr1);
- else
- SetError(errStringOverflow);
+ if ( CheckStringResultLen( sStr1, sStr2 ) )
+ sStr1 += sStr2;
+ PushString(sStr1);
}
}
@@ -4024,7 +4022,7 @@ void ScInterpreter::ScMatRef()
BOOL bIsString;
const MatValue* pMatVal = pMat->Get(nC, nR, bIsString);
if (bIsString)
- PushStringObject(*(pMatVal->pS));
+ PushString(*(pMatVal->pS));
else
{
PushDouble(pMatVal->fVal);
@@ -4047,7 +4045,7 @@ void ScInterpreter::ScMatRef()
{
String aVal;
pCell->GetString( aVal );
- PushStringObject( aVal );
+ PushString( aVal );
}
pDok->GetNumberFormatInfo( nCurFmtType, nCurFmtIndex, aAdr, *pCell );
nFuncFmtType = nCurFmtType;
diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx
index 1fd00b0fb241..77d2202dc759 100644
--- a/sc/source/core/tool/rangenam.cxx
+++ b/sc/source/core/tool/rangenam.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: rangenam.cxx,v $
*
- * $Revision: 1.2 $
+ * $Revision: 1.3 $
*
- * last change: $Author: nn $ $Date: 2000-10-06 13:44:55 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -266,7 +266,9 @@ BOOL ScRangeData::IsBeyond( USHORT nMaxRow ) const
ScToken* t;
pCode->Reset();
while ( t = pCode->GetNextReference() )
- if ( t->aRef.Ref1.nRow > nMaxRow || t->aRef.Ref2.nRow > nMaxRow )
+ if ( t->GetSingleRef().nRow > nMaxRow ||
+ (t->GetType() == svDoubleRef &&
+ t->GetDoubleRef().Ref2.nRow > nMaxRow) )
return TRUE;
return FALSE;
@@ -287,23 +289,23 @@ void ScRangeData::GuessPosition()
pCode->Reset();
while ( t = pCode->GetNextReference() )
{
- ComplRefData& rRef = t->aRef;
-
- if ( rRef.Ref1.IsColRel() && rRef.Ref1.nRelCol < nMinCol )
- nMinCol = rRef.Ref1.nRelCol;
- if ( rRef.Ref1.IsRowRel() && rRef.Ref1.nRelRow < nMinRow )
- nMinRow = rRef.Ref1.nRelRow;
- if ( rRef.Ref1.IsTabRel() && rRef.Ref1.nRelTab < nMinTab )
- nMinTab = rRef.Ref1.nRelTab;
+ SingleRefData& rRef1 = t->GetSingleRef();
+ if ( rRef1.IsColRel() && rRef1.nRelCol < nMinCol )
+ nMinCol = rRef1.nRelCol;
+ if ( rRef1.IsRowRel() && rRef1.nRelRow < nMinRow )
+ nMinRow = rRef1.nRelRow;
+ if ( rRef1.IsTabRel() && rRef1.nRelTab < nMinTab )
+ nMinTab = rRef1.nRelTab;
if ( t->GetType() == svDoubleRef )
{
- if ( rRef.Ref2.IsColRel() && rRef.Ref2.nRelCol < nMinCol )
- nMinCol = rRef.Ref2.nRelCol;
- if ( rRef.Ref2.IsRowRel() && rRef.Ref2.nRelRow < nMinRow )
- nMinRow = rRef.Ref2.nRelRow;
- if ( rRef.Ref2.IsTabRel() && rRef.Ref2.nRelTab < nMinTab )
- nMinTab = rRef.Ref2.nRelTab;
+ SingleRefData& rRef2 = t->GetDoubleRef().Ref2;
+ if ( rRef2.IsColRel() && rRef2.nRelCol < nMinCol )
+ nMinCol = rRef2.nRelCol;
+ if ( rRef2.IsRowRel() && rRef2.nRelRow < nMinRow )
+ nMinRow = rRef2.nRelRow;
+ if ( rRef2.IsTabRel() && rRef2.nRelTab < nMinTab )
+ nMinTab = rRef2.nRelTab;
}
}
@@ -377,14 +379,17 @@ void ScRangeData::UpdateTranspose( const ScRange& rSource, const ScAddress& rDes
{
if( t->GetType() != svIndex )
{
- ComplRefData& rRef = t->GetReference();
+ SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ?
+ SingleDoubleRefModifier( t->GetSingleRef() ) :
+ SingleDoubleRefModifier( t->GetDoubleRef() ));
+ ComplRefData& rRef = rMod.Ref();
if (!rRef.Ref1.IsColRel() && !rRef.Ref1.IsRowRel() &&
(!rRef.Ref1.IsFlag3D() || !rRef.Ref1.IsTabRel()) &&
( t->GetType() == svSingleRef ||
(!rRef.Ref2.IsColRel() && !rRef.Ref2.IsRowRel() &&
(!rRef.Ref2.IsFlag3D() || !rRef.Ref2.IsTabRel()))))
{
- if ( ScRefUpdate::UpdateTranspose( pDoc, rSource, rDest, t->aRef ) != UR_NOTHING )
+ if ( ScRefUpdate::UpdateTranspose( pDoc, rSource, rDest, rRef ) != UR_NOTHING )
bChanged = TRUE;
}
}
@@ -404,14 +409,17 @@ void ScRangeData::UpdateGrow( const ScRange& rArea, USHORT nGrowX, USHORT nGrowY
{
if( t->GetType() != svIndex )
{
- ComplRefData& rRef = t->GetReference();
+ SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ?
+ SingleDoubleRefModifier( t->GetSingleRef() ) :
+ SingleDoubleRefModifier( t->GetDoubleRef() ));
+ ComplRefData& rRef = rMod.Ref();
if (!rRef.Ref1.IsColRel() && !rRef.Ref1.IsRowRel() &&
(!rRef.Ref1.IsFlag3D() || !rRef.Ref1.IsTabRel()) &&
( t->GetType() == svSingleRef ||
(!rRef.Ref2.IsColRel() && !rRef.Ref2.IsRowRel() &&
(!rRef.Ref2.IsFlag3D() || !rRef.Ref2.IsTabRel()))))
{
- if ( ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY, t->aRef ) != UR_NOTHING )
+ if ( ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY, rRef ) != UR_NOTHING )
bChanged = TRUE;
}
}
@@ -610,14 +618,19 @@ void ScRangeData::TransferTabRef( USHORT nOldTab, USHORT nNewTab )
pCode->Reset();
while ( t = pCode->GetNextReference() )
{
- if ( t->aRef.Ref1.IsTabRel() )
- t->aRef.Ref1.nTab += nPosDiff;
- else
- t->aRef.Ref1.nTab += nTabDiff;
- if ( t->aRef.Ref2.IsTabRel() )
- t->aRef.Ref2.nTab += nPosDiff;
+ SingleRefData& rRef1 = t->GetSingleRef();
+ if ( rRef1.IsTabRel() )
+ rRef1.nTab += nPosDiff;
else
- t->aRef.Ref2.nTab += nTabDiff;
+ rRef1.nTab += nTabDiff;
+ if ( t->GetType() == svDoubleRef )
+ {
+ SingleRefData& rRef2 = t->GetDoubleRef().Ref2;
+ if ( rRef2.IsTabRel() )
+ rRef2.nTab += nPosDiff;
+ else
+ rRef2.nTab += nTabDiff;
+ }
}
}
@@ -629,10 +642,11 @@ void ScRangeData::ReplaceRangeNamesInUse( const ScIndexMap& rMap )
{
if ( p->GetOpCode() == ocName )
{
- USHORT nNewIndex = rMap.Find( p->nIndex );
- if ( p->nIndex != nNewIndex )
+ USHORT nIndex = p->GetIndex();
+ USHORT nNewIndex = rMap.Find( nIndex );
+ if ( nIndex != nNewIndex )
{
- p->nIndex = nNewIndex;
+ p->SetIndex( nNewIndex );
bCompile = TRUE;
}
}
diff --git a/sc/source/core/tool/refdata.cxx b/sc/source/core/tool/refdata.cxx
index fb482fb07cb4..92513177d068 100644
--- a/sc/source/core/tool/refdata.cxx
+++ b/sc/source/core/tool/refdata.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: refdata.cxx,v $
*
- * $Revision: 1.1.1.1 $
+ * $Revision: 1.2 $
*
- * last change: $Author: hr $ $Date: 2000-09-19 00:16:18 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -65,14 +65,8 @@
#pragma hdrstop
-#include <segmentc.hxx>
+#include "refdata.hxx"
-#include "compiler.hxx"
-
-SEG_EOFGLOBALS()
-
-
-#pragma SEG_FUNCDEF(refdata_01)
void SingleRefData::CalcRelFromAbs( const ScAddress& rPos )
{
@@ -82,8 +76,6 @@ void SingleRefData::CalcRelFromAbs( const ScAddress& rPos )
}
-#pragma SEG_FUNCDEF(refdata_02)
-
void SingleRefData::SmartRelAbs( const ScAddress& rPos )
{
if ( Flags.bColRel )
@@ -103,8 +95,6 @@ void SingleRefData::SmartRelAbs( const ScAddress& rPos )
}
-#pragma SEG_FUNCDEF(refdata_06)
-
void SingleRefData::CalcAbsIfRel( const ScAddress& rPos )
{
if ( Flags.bColRel )
@@ -128,8 +118,6 @@ void SingleRefData::CalcAbsIfRel( const ScAddress& rPos )
}
-#pragma SEG_FUNCDEF(refdata_03)
-
void SingleRefData::OldBoolsToNewFlags( const OldSingleRefBools& rBools )
{
switch ( rBools.bRelCol )
@@ -208,8 +196,6 @@ void SingleRefData::OldBoolsToNewFlags( const OldSingleRefBools& rBools )
Aber immer noch nCol > MAXCOL und gut sollte sein..
*/
-#pragma SEG_FUNCDEF(refdata_04)
-
BYTE SingleRefData::CreateStoreByteFromFlags() const
{
return (BYTE)(
@@ -225,8 +211,6 @@ BYTE SingleRefData::CreateStoreByteFromFlags() const
}
-#pragma SEG_FUNCDEF(refdata_05)
-
void SingleRefData::CreateFlagsFromLoadByte( BYTE n )
{
Flags.bColRel = (n & 0x01 );
@@ -240,7 +224,14 @@ void SingleRefData::CreateFlagsFromLoadByte( BYTE n )
}
-#pragma SEG_FUNCDEF(refdata_07)
+BOOL SingleRefData::operator==( const SingleRefData& r ) const
+{
+ return bFlags == r.bFlags &&
+ (Flags.bColRel ? nRelCol == r.nRelCol : nCol == r.nCol) &&
+ (Flags.bRowRel ? nRelRow == r.nRelRow : nRow == r.nRow) &&
+ (Flags.bTabRel ? nRelTab == r.nRelTab : nTab == r.nTab);
+}
+
// Abs-Refs muessen vorher aktualisiert werden!
// wird in refupdat.cxx mit MoveRelWrap verwendet
@@ -336,42 +327,3 @@ void ComplRefData::PutInOrder()
Ref2.Flags.bRelName = ( nRelState2 ? TRUE : FALSE );
}
-/*------------------------------------------------------------------------
-
- $Log: not supported by cvs2svn $
- Revision 1.10 2000/09/17 14:08:42 willem.vandorp
- OpenOffice header added.
-
- Revision 1.9 2000/08/31 16:38:04 willem.vandorp
- Header and footer replaced
-
- Revision 1.8 1997/11/13 20:06:50 NN
- ifndef PCH raus
-
-
- Rev 1.7 13 Nov 1997 21:06:50 NN
- ifndef PCH raus
-
- Rev 1.6 08 Jan 1997 20:11:54 ER
- ScAddress als Reference (keine temporaeren Objekte ohne inlining)
-
- Rev 1.5 14 May 1996 13:59:32 ER
- ComplRefData PutInOrder
-
- Rev 1.4 24 Apr 1996 21:30:48 ER
- CalcAbsIfRel: !valid => flag deleted
-
- Rev 1.3 24 Apr 1996 12:23:04 ER
- unbenamster struct geht nicht
-
- Rev 1.2 23 Apr 1996 19:23:06 ER
- ScTokenArray::Store mit Position, CalcAbsIfRel vor ScToken::Store
-
- Rev 1.1 23 Apr 1996 13:49:04 ER
- RelRefs, zweite Runde
-
- Rev 1.0 22 Apr 1996 11:29:28 ER
- *RefData: token.cxx --> refdata.cxx
-
-------------------------------------------------------------------------*/
-#pragma SEG_EOFMODULE
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 2dbfad0bba20..8510a59820d1 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: token.cxx,v $
*
- * $Revision: 1.5 $
+ * $Revision: 1.6 $
*
- * last change: $Author: er $ $Date: 2001-02-16 19:09:06 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -97,13 +97,33 @@ struct ImpTokenIterator
// SubCode via ScTokenIterator Push/Pop moeglich
IMPL_FIXEDMEMPOOL_NEWDEL( ImpTokenIterator, 32, 16 );
-// Raw-ScToken Groesse ist FixMembers + MAXSTRLEN ~= 264
-IMPL_FIXEDMEMPOOL_NEWDEL( ScToken, 8, 4 );
-// ScDoubleToken werden evtl. massig gebraucht, FixMembers + sizeof(double) ~= 16
-const USHORT nMemPoolDoubleToken = (0x4000 - 64) / sizeof(ScDoubleToken);
+// Align MemPools on 4k boundaries - 64 bytes (4k is a MUST for OS/2)
+
+// Since RawTokens are temporary for the compiler, don't align on 4k and waste memory.
+// ScRawToken size is FixMembers + MAXSTRLEN ~= 264
+IMPL_FIXEDMEMPOOL_NEWDEL( ScRawToken, 8, 4 );
+// Some ScDoubleRawToken, FixMembers + sizeof(double) ~= 16
+const USHORT nMemPoolDoubleRawToken = 0x0400 / sizeof(ScDoubleRawToken);
+IMPL_FIXEDMEMPOOL_NEWDEL( ScDoubleRawToken, nMemPoolDoubleRawToken, nMemPoolDoubleRawToken );
+
+// Need a whole bunch of ScSingleRefToken
+const USHORT nMemPoolSingleRefToken = (0x4000 - 64) / sizeof(ScSingleRefToken);
+IMPL_FIXEDMEMPOOL_NEWDEL( ScSingleRefToken, nMemPoolSingleRefToken, nMemPoolSingleRefToken );
+// Need a lot of ScDoubleToken
+const USHORT nMemPoolDoubleToken = (0x3000 - 64) / sizeof(ScDoubleToken);
IMPL_FIXEDMEMPOOL_NEWDEL( ScDoubleToken, nMemPoolDoubleToken, nMemPoolDoubleToken );
+// Need a lot of ScByteToken
+const USHORT nMemPoolByteToken = (0x3000 - 64) / sizeof(ScByteToken);
+IMPL_FIXEDMEMPOOL_NEWDEL( ScByteToken, nMemPoolByteToken, nMemPoolByteToken );
+// Need quite a lot of ScDoubleRefToken
+const USHORT nMemPoolDoubleRefToken = (0x2000 - 64) / sizeof(ScDoubleRefToken);
+IMPL_FIXEDMEMPOOL_NEWDEL( ScDoubleRefToken, nMemPoolDoubleRefToken, nMemPoolDoubleRefToken );
+// Need several ScStringToken
+const USHORT nMemPoolStringToken = (0x1000 - 64) / sizeof(ScStringToken);
+IMPL_FIXEDMEMPOOL_NEWDEL( ScStringToken, nMemPoolStringToken, nMemPoolStringToken );
+
-//-----------------------Funktionen der Klasse ScToken------------------------
+// --- helpers --------------------------------------------------------------
inline BOOL lcl_IsReference( OpCode eOp, StackVar eType )
{
@@ -116,7 +136,9 @@ inline BOOL lcl_IsReference( OpCode eOp, StackVar eType )
}
-xub_StrLen ScToken::GetStrLen( const sal_Unicode* pStr )
+// --- class ScRawToken -----------------------------------------------------
+
+xub_StrLen ScRawToken::GetStrLen( const sal_Unicode* pStr )
{
if ( !pStr )
return 0;
@@ -127,69 +149,7 @@ xub_StrLen ScToken::GetStrLen( const sal_Unicode* pStr )
}
-BOOL ScToken::IsFunction() const
-{
- return (eOp != ocPush && eOp != ocBad && eOp != ocColRowName &&
- eOp != ocColRowNameAuto && eOp != ocName && eOp != ocDBArea &&
- (cByte != 0 // x Parameter
- || (ocEndUnOp < eOp && eOp <= ocEndNoPar) // kein Parameter
- || (ocIf == eOp || ocChose == eOp ) //@ Sprung Kommandos
- || (ocEndNoPar < eOp && eOp <= ocEnd1Par) // ein Parameter
- || (ocEnd1Par < eOp && eOp <= ocEnd2Par) // x Parameter (cByte==0 in
- // FuncAutoPilot)
- || eOp == ocMacro || eOp == ocExternal // Makros, AddIns
- || eOp == ocAnd || eOp == ocOr // ehemals binaer, jetzt x Params
- || eOp == ocNot || eOp == ocNeg // unaer aber Function
- || (eOp >= ocInternalBegin && eOp <= ocInternalEnd) // Internal
- ));
-}
-
-
-BYTE ScToken::GetParamCount() const
-{
- if ( eOp <= ocEndDiv && eOp != ocExternal && eOp != ocMacro &&
- eOp != ocIf && eOp != ocChose )
- return 0; // Parameter und Specials
- // ocIf und ocChose fuer FAP nicht, haben dann cByte
-//2do: BOOL-Parameter ob FAP oder nicht?
- else if ( cByte )
- return cByte; // alle Funktionen, gilt auch fuer ocExternal und ocMacro
- else if ( ocEndDiv < eOp && eOp <= ocEndBinOp )
- return 2; // binaer
- else if ( ocEndBinOp < eOp && eOp <= ocEndUnOp )
- return 1; // unaer
- else if ( ocEndUnOp < eOp && eOp <= ocEndNoPar )
- return 0; // kein Parameter
- else if ( ocEndNoPar < eOp && eOp <= ocEnd1Par )
- return 1; // ein Parameter
- else
- return 0; // der Rest, kein Parameter, oder
- // wenn dann sollte er in cByte sein
-}
-
-
-BOOL ScToken::IsMatrixFunction() const
-{
- switch ( eOp )
- {
- case ocDde :
- case ocGrowth :
- case ocTrend :
- case ocRKP :
- case ocRGP :
- case ocFrequency :
- case ocMatTrans :
- case ocMatMult :
- case ocMatInv :
- case ocMatrixUnit :
- return TRUE;
- break;
- }
- return FALSE;
-}
-
-
-void ScToken::SetOpCode( OpCode e )
+void ScRawToken::SetOpCode( OpCode e )
{
eOp = e;
if( eOp == ocIf )
@@ -207,7 +167,7 @@ void ScToken::SetOpCode( OpCode e )
nRefCnt = 0;
}
-void ScToken::SetString( const sal_Unicode* pStr )
+void ScRawToken::SetString( const sal_Unicode* pStr )
{
eOp = ocPush;
eType = svString;
@@ -224,7 +184,7 @@ void ScToken::SetString( const sal_Unicode* pStr )
nRefCnt = 0;
}
-void ScToken::SetSingleReference( const SingleRefData& rRef )
+void ScRawToken::SetSingleReference( const SingleRefData& rRef )
{
eOp = ocPush;
eType = svSingleRef;
@@ -233,7 +193,7 @@ void ScToken::SetSingleReference( const SingleRefData& rRef )
nRefCnt = 0;
}
-void ScToken::SetDoubleReference( const ComplRefData& rRef )
+void ScRawToken::SetDoubleReference( const ComplRefData& rRef )
{
eOp = ocPush;
eType = svDoubleRef;
@@ -241,7 +201,7 @@ void ScToken::SetDoubleReference( const ComplRefData& rRef )
nRefCnt = 0;
}
-void ScToken::SetReference( ComplRefData& rRef )
+void ScRawToken::SetReference( ComplRefData& rRef )
{
DBG_ASSERT( lcl_IsReference( eOp, GetType() ), "SetReference: no Ref" );
aRef = rRef;
@@ -249,7 +209,7 @@ void ScToken::SetReference( ComplRefData& rRef )
aRef.Ref2 = aRef.Ref1;
}
-void ScToken::SetByte( BYTE c )
+void ScRawToken::SetByte( BYTE c )
{
eOp = ocPush;
eType = svByte;
@@ -257,7 +217,7 @@ void ScToken::SetByte( BYTE c )
nRefCnt = 0;
}
-void ScToken::SetDouble(double rVal)
+void ScRawToken::SetDouble(double rVal)
{
eOp = ocPush;
eType = svDouble;
@@ -265,7 +225,7 @@ void ScToken::SetDouble(double rVal)
nRefCnt = 0;
}
-void ScToken::SetInt(int rVal)
+void ScRawToken::SetInt(int rVal)
{
eOp = ocPush;
eType = svDouble;
@@ -273,7 +233,7 @@ void ScToken::SetInt(int rVal)
nRefCnt = 0;
}
-void ScToken::SetName( USHORT n )
+void ScRawToken::SetName( USHORT n )
{
eOp = ocName;
eType = svIndex;
@@ -281,13 +241,13 @@ void ScToken::SetName( USHORT n )
nRefCnt = 0;
}
-ComplRefData& ScToken::GetReference()
+ComplRefData& ScRawToken::GetReference()
{
DBG_ASSERT( lcl_IsReference( eOp, GetType() ), "GetReference: no Ref" );
return aRef;
}
-void ScToken::SetExternal( const sal_Unicode* pStr )
+void ScRawToken::SetExternal( const sal_Unicode* pStr )
{
eOp = ocExternal;
eType = svExternal;
@@ -300,7 +260,7 @@ void ScToken::SetExternal( const sal_Unicode* pStr )
nRefCnt = 0;
}
-void ScToken::SetMatrix( ScMatrix* p )
+void ScRawToken::SetMatrix( ScMatrix* p )
{
eOp = ocPush;
eType = svMatrix;
@@ -308,19 +268,19 @@ void ScToken::SetMatrix( ScMatrix* p )
nRefCnt = 0;
}
-ScToken* ScToken::Clone() const
+ScRawToken* ScRawToken::Clone() const
{
- ScToken* p;
+ ScRawToken* p;
if ( eType == svDouble )
{
- p = (ScToken*) new ScDoubleToken;
+ p = (ScRawToken*) new ScDoubleRawToken;
p->eOp = eOp;
p->eType = eType;
p->nValue = nValue;
}
else
{
- USHORT n = offsetof( ScToken, cByte );
+ USHORT n = offsetof( ScRawToken, cByte );
switch( eType )
{
case svByte: n++; break;
@@ -334,7 +294,7 @@ ScToken* ScToken::Clone() const
case svExternal: n += GetStrLenBytes( cStr+1 ) + GetStrLenBytes( 2 ); break;
default: n += (BYTE) cStr[ 0 ]; // unbekannt eingelesen!
}
- p = (ScToken*) new BYTE[ n ];
+ p = (ScRawToken*) new BYTE[ n ];
memcpy( p, this, n * sizeof(BYTE) );
}
p->nRefCnt = 0;
@@ -342,38 +302,61 @@ ScToken* ScToken::Clone() const
return p;
}
-BOOL ScToken::operator== (const ScToken& rToken) const
-{
- // Ref-Count und bRaw darf hier nicht mit verglichen werden!!!
- USHORT n = 0;
- switch( eType )
+ScToken* ScRawToken::CreateToken() const
+{
+ switch ( GetType() )
{
- case svByte: n++; break;
- case svDouble: n += sizeof(double); break;
- case svString: n += GetStrLenBytes( cStr ) + GetStrLenBytes( 1 ); break;
- case svSingleRef:
- case svDoubleRef: n += sizeof(aRef); break;
- case svMatrix: n += sizeof(ScMatrix*); break;
- case svIndex: n += sizeof(USHORT); break;
- case svJump: n += nJump[ 0 ] * 2 + 2; break;
- case svExternal: n += GetStrLenBytes( cStr+1 ) + GetStrLenBytes( 2 ); break;
- default: n += (BYTE) cStr[ 0 ]; // unbekannt eingelesen!
+ case svByte :
+ return new ScByteToken( eOp, cByte );
+ break;
+ case svDouble :
+ return new ScDoubleToken( eOp, nValue );
+ break;
+ case svString :
+ return new ScStringToken( eOp, String( cStr ) );
+ break;
+ case svSingleRef :
+ return new ScSingleRefToken( eOp, aRef.Ref1 );
+ break;
+ case svDoubleRef :
+ return new ScDoubleRefToken( eOp, aRef );
+ break;
+ case svMatrix :
+ return new ScMatrixToken( eOp, pMat );
+ break;
+ case svIndex :
+ return new ScIndexToken( eOp, nIndex );
+ break;
+ case svJump :
+ return new ScJumpToken( eOp, (short*) nJump );
+ break;
+ case svExternal :
+ return new ScExternalToken( eOp, (BYTE) cStr[0], String( cStr[1] ) );
+ break;
+ case svMissing :
+ return new ScMissingToken( eOp );
+ break;
+ case svErr :
+ return new ScErrToken( eOp );
+ break;
+ default:
+ // read in unknown!
+ return new ScUnknownToken( eOp, GetType(), (BYTE*) cStr );
}
- return eOp == rToken.eOp && eType == rToken.eType &&
- ( n == 0 || memcmp( &cByte, &rToken.cByte, n ) == 0 );
}
-void ScToken::Delete()
+
+void ScRawToken::Delete()
{
if ( bRaw )
- delete this; // FixedMemPool ScToken
+ delete this; // FixedMemPool ScRawToken
else
- { // per Clone erzeugt
+ { // created per Clone
switch ( eType )
{
case svDouble :
- delete (ScDoubleToken*) this; // FixedMemPool ScDoubleToken
+ delete (ScDoubleRawToken*) this; // FixedMemPool ScDoubleRawToken
break;
default:
delete [] (BYTE*) this;
@@ -381,26 +364,180 @@ void ScToken::Delete()
}
}
-// TextEqual: gleiche Formel eingegeben (fuer Optimierung beim Sortieren)
-BOOL ScToken::TextEqual(const ScToken& rToken) const
+// --- class ScToken --------------------------------------------------------
+
+SingleRefData lcl_ScToken_InitSingleRef()
+{
+ SingleRefData aRef;
+ aRef.InitAddress( ScAddress() );
+ return aRef;
+}
+
+ComplRefData lcl_ScToken_InitDoubleRef()
+{
+ ComplRefData aRef;
+ aRef.Ref1 = lcl_ScToken_InitSingleRef();
+ aRef.Ref2 = aRef.Ref1;
+ return aRef;
+}
+
+SingleRefData ScToken::aDummySingleRef = lcl_ScToken_InitSingleRef();
+ComplRefData ScToken::aDummyDoubleRef = lcl_ScToken_InitDoubleRef();
+String ScToken::aDummyString;
+
+
+ScToken::~ScToken()
+{
+}
+
+
+BOOL ScToken::IsFunction() const
+{
+ return (eOp != ocPush && eOp != ocBad && eOp != ocColRowName &&
+ eOp != ocColRowNameAuto && eOp != ocName && eOp != ocDBArea &&
+ (GetByte() != 0 // x parameters
+ || (ocEndUnOp < eOp && eOp <= ocEndNoPar) // no parameter
+ || (ocIf == eOp || ocChose == eOp ) // @ jump commands
+ || (ocEndNoPar < eOp && eOp <= ocEnd1Par) // one parameter
+ || (ocEnd1Par < eOp && eOp <= ocEnd2Par) // x parameters (cByte==0 in
+ // FuncAutoPilot)
+ || eOp == ocMacro || eOp == ocExternal // macros, AddIns
+ || eOp == ocAnd || eOp == ocOr // former binary, now x parameters
+ || eOp == ocNot || eOp == ocNeg // unary but function
+ || (eOp >= ocInternalBegin && eOp <= ocInternalEnd) // internal
+ ));
+}
+
+
+BYTE ScToken::GetParamCount() const
+{
+ if ( eOp <= ocEndDiv && eOp != ocExternal && eOp != ocMacro &&
+ eOp != ocIf && eOp != ocChose )
+ return 0; // parameters and specials
+ // ocIf and ocChose not for FAP, have cByte then
+//2do: BOOL parameter whether FAP or not?
+ else if ( GetByte() )
+ return GetByte(); // all functions, also ocExternal and ocMacro
+ else if ( ocEndDiv < eOp && eOp <= ocEndBinOp )
+ return 2; // binary
+ else if ( ocEndBinOp < eOp && eOp <= ocEndUnOp )
+ return 1; // unary
+ else if ( ocEndUnOp < eOp && eOp <= ocEndNoPar )
+ return 0; // no parameter
+ else if ( ocEndNoPar < eOp && eOp <= ocEnd1Par )
+ return 1; // one parameter
+ else
+ return 0; // all the rest, no Parameter, or
+ // if so then it should be in cByte
+}
+
+
+BOOL ScToken::IsMatrixFunction() const
+{
+ switch ( eOp )
+ {
+ case ocDde :
+ case ocGrowth :
+ case ocTrend :
+ case ocRKP :
+ case ocRGP :
+ case ocFrequency :
+ case ocMatTrans :
+ case ocMatMult :
+ case ocMatInv :
+ case ocMatrixUnit :
+ return TRUE;
+ break;
+ }
+ return FALSE;
+}
+
+
+ScToken* ScToken::Clone() const
+{
+ switch ( GetType() )
+ {
+ case svByte :
+ return new ScByteToken( *static_cast<const ScByteToken*>(this) );
+ break;
+ case svDouble :
+ return new ScDoubleToken( *static_cast<const ScDoubleToken*>(this) );
+ break;
+ case svString :
+ return new ScStringToken( *static_cast<const ScStringToken*>(this) );
+ break;
+ case svSingleRef :
+ return new ScSingleRefToken( *static_cast<const ScSingleRefToken*>(this) );
+ break;
+ case svDoubleRef :
+ return new ScDoubleRefToken( *static_cast<const ScDoubleRefToken*>(this) );
+ break;
+ case svMatrix :
+ return new ScMatrixToken( *static_cast<const ScMatrixToken*>(this) );
+ break;
+ case svIndex :
+ return new ScIndexToken( *static_cast<const ScIndexToken*>(this) );
+ break;
+ case svJump :
+ return new ScJumpToken( *static_cast<const ScJumpToken*>(this) );
+ break;
+ case svExternal :
+ return new ScExternalToken( *static_cast<const ScExternalToken*>(this) );
+ break;
+ case svMissing :
+ return new ScMissingToken( *static_cast<const ScMissingToken*>(this) );
+ break;
+ case svErr :
+ return new ScErrToken( *static_cast<const ScErrToken*>(this) );
+ break;
+ default:
+ // read in unknown!
+ return new ScUnknownToken( *static_cast<const ScUnknownToken*>(this) );
+ }
+}
+
+BOOL ScToken::operator==( const ScToken& rToken ) const
+{
+ // don't compare reference count!
+ return eOp == rToken.eOp && eType == rToken.eType;
+}
+
+
+// TextEqual: if same formula entered (for optimization in sort)
+BOOL ScToken::TextEqual( const ScToken& rToken ) const
{
if ( eType == svSingleRef || eType == svDoubleRef )
{
- // bei relativen Refs auch nur den relativen Teil vergleichen
+ // in relative Refs only compare relative parts
if ( eOp != rToken.eOp || eType != rToken.eType )
return FALSE;
- ComplRefData aTemp1 = aRef;
- ComplRefData aTemp2 = rToken.aRef;
+ ComplRefData aTemp1;
+ if ( eType == svSingleRef )
+ {
+ aTemp1.Ref1 = GetSingleRef();
+ aTemp1.Ref2 = aTemp1.Ref1;
+ }
+ else
+ aTemp1 = GetDoubleRef();
+
+ ComplRefData aTemp2;
+ if ( rToken.eType == svSingleRef )
+ {
+ aTemp2.Ref1 = rToken.GetSingleRef();
+ aTemp2.Ref2 = aTemp2.Ref1;
+ }
+ else
+ aTemp2 = rToken.GetDoubleRef();
ScAddress aPos;
aTemp1.SmartRelAbs(aPos);
aTemp2.SmartRelAbs(aPos);
- // memcmp geht schief wegen des Alignment-Bytes hinter bFlags
- // nach SmartRelAbs muessen nur die absoluten Teile verglichen werden
+ // memcmp doesn't work because of the alignment byte after bFlags.
+ // After SmartRelAbs only absolute parts have to be compared.
return aTemp1.Ref1.nCol == aTemp2.Ref1.nCol &&
aTemp1.Ref1.nRow == aTemp2.Ref1.nRow &&
aTemp1.Ref1.nTab == aTemp2.Ref1.nTab &&
@@ -411,9 +548,218 @@ BOOL ScToken::TextEqual(const ScToken& rToken) const
aTemp1.Ref2.bFlags == aTemp2.Ref2.bFlags;
}
else
- return *this == rToken; // sonst normaler operator==
+ return *this == rToken; // else normal operator==
+}
+
+
+// virtual dummy methods
+
+BYTE ScToken::GetByte() const
+{
+ // ok to be called for any derived class
+ return 0;
+}
+
+void ScToken::SetByte( BYTE n )
+{
+ DBG_ERRORFILE( "ScToken::SetByte: virtual dummy called" );
+}
+
+double ScToken::GetDouble() const
+{
+ DBG_ERRORFILE( "ScToken::GetDouble: virtual dummy called" );
+ return 0.0;
}
+const String& ScToken::GetString() const
+{
+ DBG_ERRORFILE( "ScToken::GetString: virtual dummy called" );
+ return aDummyString;
+}
+
+const SingleRefData& ScToken::GetSingleRef() const
+{
+ DBG_ERRORFILE( "ScToken::GetSingleRef: virtual dummy called" );
+ return aDummySingleRef;
+}
+
+SingleRefData& ScToken::GetSingleRef()
+{
+ DBG_ERRORFILE( "ScToken::GetSingleRef: virtual dummy called" );
+ return aDummySingleRef;
+}
+
+const ComplRefData& ScToken::GetDoubleRef() const
+{
+ DBG_ERRORFILE( "ScToken::GetDoubleRef: virtual dummy called" );
+ return aDummyDoubleRef;
+}
+
+ComplRefData& ScToken::GetDoubleRef()
+{
+ DBG_ERRORFILE( "ScToken::GetDoubleRef: virtual dummy called" );
+ return aDummyDoubleRef;
+}
+
+void ScToken::CalcAbsIfRel( const ScAddress& rPos )
+{
+ DBG_ERRORFILE( "ScToken::CalcAbsIfRel: virtual dummy called" );
+}
+
+void ScToken::CalcRelFromAbs( const ScAddress& rPos )
+{
+ DBG_ERRORFILE( "ScToken::CalcRelFromAbs: virtual dummy called" );
+}
+
+ScMatrix* ScToken::GetMatrix() const
+{
+ DBG_ERRORFILE( "ScToken::GetMatrix: virtual dummy called" );
+ return NULL;
+}
+
+USHORT ScToken::GetIndex() const
+{
+ DBG_ERRORFILE( "ScToken::GetIndex: virtual dummy called" );
+ return 0;
+}
+
+void ScToken::SetIndex( USHORT n )
+{
+ DBG_ERRORFILE( "ScToken::SetIndex: virtual dummy called" );
+}
+
+short* ScToken::GetJump() const
+{
+ DBG_ERRORFILE( "ScToken::GetJump: virtual dummy called" );
+ return NULL;
+}
+
+const String& ScToken::GetExternal() const
+{
+ DBG_ERRORFILE( "ScToken::GetExternal: virtual dummy called" );
+ return aDummyString;
+}
+
+BYTE* ScToken::GetUnknown() const
+{
+ DBG_ERRORFILE( "ScToken::GetUnknown: virtual dummy called" );
+ return NULL;
+}
+
+
+// real implementations of virtual functions
+
+BYTE ScByteToken::GetByte() const { return nByte; }
+void ScByteToken::SetByte( BYTE n ) { nByte = n; }
+BOOL ScByteToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r ) && nByte == r.GetByte();
+}
+
+
+double ScDoubleToken::GetDouble() const { return fDouble; }
+BOOL ScDoubleToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r ) && fDouble == r.GetDouble();
+}
+
+
+const String& ScStringToken::GetString() const { return aString; }
+BOOL ScStringToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r ) && aString == r.GetString();
+}
+
+
+const SingleRefData& ScSingleRefToken::GetSingleRef() const { return aSingleRef; }
+SingleRefData& ScSingleRefToken::GetSingleRef() { return aSingleRef; }
+void ScSingleRefToken::CalcAbsIfRel( const ScAddress& rPos )
+ { aSingleRef.CalcAbsIfRel( rPos ); }
+void ScSingleRefToken::CalcRelFromAbs( const ScAddress& rPos )
+ { aSingleRef.CalcRelFromAbs( rPos ); }
+BOOL ScSingleRefToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r ) && aSingleRef == r.GetSingleRef();
+}
+
+
+const SingleRefData& ScDoubleRefToken::GetSingleRef() const { return aDoubleRef.Ref1; }
+SingleRefData& ScDoubleRefToken::GetSingleRef() { return aDoubleRef.Ref1; }
+const ComplRefData& ScDoubleRefToken::GetDoubleRef() const { return aDoubleRef; }
+ComplRefData& ScDoubleRefToken::GetDoubleRef() { return aDoubleRef; }
+void ScDoubleRefToken::CalcAbsIfRel( const ScAddress& rPos )
+ { aDoubleRef.CalcAbsIfRel( rPos ); }
+void ScDoubleRefToken::CalcRelFromAbs( const ScAddress& rPos )
+ { aDoubleRef.CalcRelFromAbs( rPos ); }
+BOOL ScDoubleRefToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r ) && aDoubleRef == r.GetDoubleRef();
+}
+
+
+ScMatrix* ScMatrixToken::GetMatrix() const { return pMatrix; }
+BOOL ScMatrixToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r ) && pMatrix == r.GetMatrix();
+}
+
+
+USHORT ScIndexToken::GetIndex() const { return nIndex; }
+void ScIndexToken::SetIndex( USHORT n ) { nIndex = n; }
+BOOL ScIndexToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r ) && nIndex == r.GetIndex();
+}
+
+
+short* ScJumpToken::GetJump() const { return pJump; }
+BOOL ScJumpToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r ) && pJump[0] == r.GetJump()[0] &&
+ memcmp( pJump+1, r.GetJump()+1, pJump[0] * sizeof(short) ) == 0;
+}
+ScJumpToken::~ScJumpToken()
+{
+ delete [] pJump;
+}
+
+
+const String& ScExternalToken::GetExternal() const { return aExternal; }
+BYTE ScExternalToken::GetByte() const { return nByte; }
+void ScExternalToken::SetByte( BYTE n ) { nByte = n; }
+BOOL ScExternalToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r ) && nByte == r.GetByte() &&
+ aExternal == r.GetExternal();
+}
+
+
+double ScMissingToken::GetDouble() const { return 0.0; }
+const String& ScMissingToken::GetString() const { return aDummyString; }
+BOOL ScMissingToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r );
+}
+
+
+BOOL ScErrToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r );
+}
+
+
+BYTE* ScUnknownToken::GetUnknown() const { return pUnknown; }
+BOOL ScUnknownToken::operator==( const ScToken& r ) const
+{
+ return ScToken::operator==( r ) && pUnknown[0] == r.GetUnknown()[0] &&
+ memcmp( pUnknown+1, r.GetUnknown()+1, pUnknown[0] * sizeof(BYTE) ) == 0;
+}
+ScUnknownToken::~ScUnknownToken()
+{
+ delete [] pUnknown;
+}
+
+
//////////////////////////////////////////////////////////////////////////
ScToken* ScTokenArray::GetNextReference()
@@ -607,20 +953,20 @@ BOOL ScTokenArray::IsReference( ScRange& rRange ) const
BOOL bIs = FALSE;
if ( pCode && nLen == 1 )
{
- ScToken* pToken = pCode[0];
+ const ScToken* pToken = pCode[0];
if ( pToken )
{
if ( pToken->GetType() == svSingleRef )
{
- SingleRefData& rRef = pToken->GetReference().Ref1;
+ const SingleRefData& rRef = ((const ScSingleRefToken*)pToken)->GetSingleRef();
rRange.aStart = rRange.aEnd = ScAddress( rRef.nCol, rRef.nRow, rRef.nTab );
bIs = TRUE;
}
else if ( pToken->GetType() == svDoubleRef )
{
- ComplRefData& rCompl = pToken->GetReference();
- SingleRefData& rRef1 = rCompl.Ref1;
- SingleRefData& rRef2 = rCompl.Ref2;
+ const ComplRefData& rCompl = ((const ScDoubleRefToken*)pToken)->GetDoubleRef();
+ const SingleRefData& rRef1 = rCompl.Ref1;
+ const SingleRefData& rRef2 = rCompl.Ref2;
rRange.aStart = ScAddress( rRef1.nCol, rRef1.nRow, rRef1.nTab );
rRange.aEnd = ScAddress( rRef2.nCol, rRef2.nRow, rRef2.nTab );
bIs = TRUE;
@@ -630,9 +976,13 @@ BOOL ScTokenArray::IsReference( ScRange& rRange ) const
return bIs;
}
-inline void lcl_GetAddress( ScAddress& rAddress, const ScToken& rToken ) // rToken must be a svSingleRef
+inline void lcl_GetAddress( ScAddress& rAddress, const ScToken& rToken )
{
- rAddress.Set( rToken.aRef.Ref1.nCol, rToken.aRef.Ref1.nRow, rToken.aRef.Ref1.nTab );
+ if ( rToken.GetType() == svSingleRef )
+ {
+ const SingleRefData& rRef = ((const ScSingleRefToken&)rToken).GetSingleRef();
+ rAddress.Set( rRef.nCol, rRef.nRow, rRef.nTab );
+ }
}
BOOL ScTokenArray::GetTableOpRefs(
@@ -735,7 +1085,7 @@ void ScTokenArray::Load30( SvStream& rStream, const ScAddress& rPos )
{
Clear();
ScToken* pToks[ MAXCODE ];
- ScToken t;
+ ScRawToken t;
for( nLen = 0; nLen < MAXCODE; nLen++ )
{
t.Load30( rStream );
@@ -747,7 +1097,7 @@ void ScTokenArray::Load30( SvStream& rStream, const ScAddress& rPos )
nRefs++;
t.aRef.CalcRelFromAbs( rPos );
}
- ScToken* p = pToks[ nLen ] = t.Clone();
+ ScToken* p = pToks[ nLen ] = t.CreateToken();
p->IncRef();
}
pCode = new ScToken*[ nLen ];
@@ -779,7 +1129,7 @@ void ScTokenArray::Load( SvStream& rStream, USHORT nVer, const ScAddress& rPos )
rStream >> nError;
ScToken* pToks[ MAXCODE ];
ScToken** pp = pToks;
- ScToken t;
+ ScRawToken t;
if( cData & 0x40 )
{
rStream >> nLen;
@@ -789,7 +1139,7 @@ void ScTokenArray::Load( SvStream& rStream, USHORT nVer, const ScAddress& rPos )
if ( t.GetType() == svSingleRef || t.GetType() == svDoubleRef )
t.aRef.CalcRelFromAbs( rPos );
// gespeichert wurde und wird immer absolut
- *pp = t.Clone();
+ *pp = t.CreateToken();
(*pp++)->IncRef();
}
pCode = new ScToken*[ nLen ];
@@ -813,7 +1163,7 @@ void ScTokenArray::Load( SvStream& rStream, USHORT nVer, const ScAddress& rPos )
if ( t.GetType() == svSingleRef || t.GetType() == svDoubleRef )
t.aRef.CalcRelFromAbs( rPos );
// gespeichert wurde und wird immer absolut
- *pp = t.Clone();
+ *pp = t.CreateToken();
}
else
{
@@ -874,10 +1224,10 @@ void ScTokenArray::Store( SvStream& rStream, const ScAddress& rPos ) const
switch ( (*p)->GetType() )
{
case svSingleRef :
- (*p)->aRef.Ref1.CalcAbsIfRel( rPos );
+ (*p)->GetSingleRef().CalcAbsIfRel( rPos );
break;
case svDoubleRef :
- (*p)->aRef.CalcAbsIfRel( rPos );
+ (*p)->GetDoubleRef().CalcAbsIfRel( rPos );
break;
}
(*p)->Store( rStream );
@@ -911,10 +1261,10 @@ void ScTokenArray::Store( SvStream& rStream, const ScAddress& rPos ) const
switch ( t->GetType() )
{
case svSingleRef :
- t->aRef.Ref1.CalcAbsIfRel( rPos );
+ t->GetSingleRef().CalcAbsIfRel( rPos );
break;
case svDoubleRef :
- t->aRef.CalcAbsIfRel( rPos );
+ t->GetDoubleRef().CalcAbsIfRel( rPos );
break;
}
rStream << (BYTE) 0xFF;
@@ -1052,6 +1402,11 @@ void ScTokenArray::Clear()
ClearRecalcMode();
}
+ScToken* ScTokenArray::AddToken( const ScRawToken& r )
+{
+ return Add( r.CreateToken() );
+}
+
ScToken* ScTokenArray::AddToken( const ScToken& r )
{
return Add( r.Clone() );
@@ -1081,74 +1436,69 @@ ScToken* ScTokenArray::Add( ScToken* t )
ScToken* ScTokenArray::AddOpCode( OpCode e )
{
- ScToken t;
+ ScRawToken t;
t.SetOpCode( e );
return AddToken( t );
}
ScToken* ScTokenArray::AddString( const sal_Unicode* pStr )
{
- ScToken t;
- t.SetString( pStr );
- return AddToken( t );
+ return AddString( String( pStr ) );
}
-ScToken* ScTokenArray::AddDouble(double rVal )
+ScToken* ScTokenArray::AddString( const String& rStr )
{
- ScToken t;
- t.SetDouble( rVal );
- return AddToken( t );
+ return Add( new ScStringToken( rStr ) );
+}
+
+ScToken* ScTokenArray::AddDouble( double fVal )
+{
+ return Add( new ScDoubleToken( fVal ) );
}
ScToken* ScTokenArray::AddSingleReference( const SingleRefData& rRef )
{
- ScToken t;
- t.SetSingleReference( rRef );
- return AddToken( t );
+ return Add( new ScSingleRefToken( rRef ) );
}
ScToken* ScTokenArray::AddDoubleReference( const ComplRefData& rRef )
{
- ScToken t;
- t.SetDoubleReference( rRef );
- return AddToken( t );
+ return Add( new ScDoubleRefToken( rRef ) );
}
ScToken* ScTokenArray::AddName( USHORT n )
{
- ScToken t;
- t.SetName( n );
- return AddToken( t );
+ return Add( new ScIndexToken( ocName, n ) );
}
ScToken* ScTokenArray::AddExternal( const sal_Unicode* pStr )
{
- ScToken t;
- t.SetExternal( pStr );
- return AddToken( t );
+ return AddExternal( String( pStr ) );
+}
+
+ScToken* ScTokenArray::AddExternal( const String& rStr )
+{
+ return Add( new ScExternalToken( ocExternal, rStr ) );
}
ScToken* ScTokenArray::AddMatrix( ScMatrix* p )
{
- ScToken t;
- t.SetMatrix( p );
- return AddToken( t );
+ return Add( new ScMatrixToken( p ) );
}
ScToken* ScTokenArray::AddColRowName( const SingleRefData& rRef )
{
- ScToken t;
- t.SetSingleReference( rRef );
- t.eOp = ocColRowName;
- return AddToken( t );
+ return Add( new ScSingleRefToken( ocColRowName, rRef ) );
}
ScToken* ScTokenArray::AddBad( const sal_Unicode* pStr )
{
- ScToken t;
- t.SetString( pStr );
- t.eOp = ocBad;
- return AddToken( t );
+ return AddBad( String( pStr ) );
+}
+
+ScToken* ScTokenArray::AddBad( const String& rStr )
+{
+ return Add( new ScStringToken( ocBad, rStr ) );
}
@@ -1191,7 +1541,7 @@ BOOL ScTokenArray::GetAdjacentExtendOfOuterFuncRefs( USHORT& nExtend,
ScToken* t = pRPN[nRPN-1];
if ( t->GetType() == svByte )
{
- BYTE nParamCount = t->cByte;
+ BYTE nParamCount = t->GetByte();
if ( nParamCount && nRPN > nParamCount )
{
BOOL bRet = FALSE;
@@ -1202,9 +1552,49 @@ BOOL ScTokenArray::GetAdjacentExtendOfOuterFuncRefs( USHORT& nExtend,
switch ( p->GetType() )
{
case svSingleRef :
+ {
+ SingleRefData& rRef = p->GetSingleRef();
+ rRef.CalcAbsIfRel( rPos );
+ switch ( eDir )
+ {
+ case DIR_BOTTOM :
+ if ( rRef.nRow == nRow
+ && rRef.nRow > nExtend )
+ {
+ nExtend = rRef.nRow;
+ bRet = TRUE;
+ }
+ break;
+ case DIR_RIGHT :
+ if ( rRef.nCol == nCol
+ && rRef.nCol > nExtend )
+ {
+ nExtend = rRef.nCol;
+ bRet = TRUE;
+ }
+ break;
+ case DIR_TOP :
+ if ( rRef.nRow == nRow
+ && rRef.nRow < nExtend )
+ {
+ nExtend = rRef.nRow;
+ bRet = TRUE;
+ }
+ break;
+ case DIR_LEFT :
+ if ( rRef.nCol == nCol
+ && rRef.nCol < nExtend )
+ {
+ nExtend = rRef.nCol;
+ bRet = TRUE;
+ }
+ break;
+ }
+ }
+ break;
case svDoubleRef :
{
- ComplRefData& rRef = p->GetReference();
+ ComplRefData& rRef = p->GetDoubleRef();
rRef.CalcAbsIfRel( rPos );
switch ( eDir )
{
@@ -1242,6 +1632,7 @@ BOOL ScTokenArray::GetAdjacentExtendOfOuterFuncRefs( USHORT& nExtend,
break;
}
}
+ break;
} // switch
} // for
return bRet;
@@ -1323,8 +1714,7 @@ BOOL ScTokenArray::HasMatrixDoubleRefOps()
// RPN-Interpreter Simulation
// als Ergebnis jeder Funktion wird einfach ein Double angenommen
ScToken** pStack = new ScToken* [nRPN];
- ScToken* pResult = new ScToken;
- pResult->SetDouble( 0.0 );
+ ScToken* pResult = new ScDoubleToken( ocPush, 0.0 );
short sp = 0;
for ( USHORT j = 0; j < nRPN; j++ )
{
@@ -1387,7 +1777,7 @@ BOOL ScTokenArray::HasMatrixDoubleRefOps()
///////////////////////////////////////////////////////////////////////////
-void ScToken::Load30( SvStream& rStream )
+void ScRawToken::Load30( SvStream& rStream )
{
UINT16 nOp;
BYTE n;
@@ -1507,7 +1897,7 @@ void ScToken::Load30( SvStream& rStream )
// Bei unbekannten Tokens steht in cStr (k)ein Pascal-String (cStr[0] = Laenge),
// der nur gepuffert wird. cStr[0] = GESAMT-Laenge inkl. [0] !!!
-void ScToken::Load( SvStream& rStream, USHORT nVer )
+void ScRawToken::Load( SvStream& rStream, USHORT nVer )
{
BYTE n;
UINT16 nOp;
@@ -1637,59 +2027,75 @@ void ScToken::Store( SvStream& rStream ) const
switch( eType )
{
case svByte:
- rStream << cByte;
+ rStream << GetByte();
break;
case svDouble:
- rStream << nValue;
+ rStream << GetDouble();
break;
case svExternal:
{
- ByteString aTmp( cStr+1, rStream.GetStreamCharSet() );
- rStream << cByte
+ ByteString aTmp( GetExternal(), rStream.GetStreamCharSet() );
+ aTmp.Erase( 255 ); // old SO5 can't handle more
+ rStream << GetByte()
<< (UINT8) aTmp.Len();
rStream.Write( aTmp.GetBuffer(), (UINT8) aTmp.Len() );
}
break;
case svString:
{
- ByteString aTmp( cStr, rStream.GetStreamCharSet() );
+ ByteString aTmp( GetString(), rStream.GetStreamCharSet() );
+ aTmp.Erase( 255 ); // old SO5 can't handle more
rStream << (UINT8) aTmp.Len();
rStream.Write( aTmp.GetBuffer(), (UINT8) aTmp.Len() );
}
break;
case svSingleRef:
- case svDoubleRef:
{
- const SingleRefData& r = aRef.Ref1;
+ const SingleRefData& r = GetSingleRef();
BYTE n = r.CreateStoreByteFromFlags();
rStream << (INT16) r.nCol
<< (INT16) r.nRow
<< (INT16) r.nTab
<< (BYTE) n;
- if( eType == svDoubleRef )
- {
- const SingleRefData& r = aRef.Ref2;
- BYTE n = r.CreateStoreByteFromFlags();
- rStream << (INT16) r.nCol
- << (INT16) r.nRow
- << (INT16) r.nTab
- << (BYTE) n;
- }
+ }
break;
+ case svDoubleRef:
+ {
+ const ComplRefData& rRef = GetDoubleRef();
+ const SingleRefData& r1 = rRef.Ref1;
+ BYTE n = r1.CreateStoreByteFromFlags();
+ rStream << (INT16) r1.nCol
+ << (INT16) r1.nRow
+ << (INT16) r1.nTab
+ << (BYTE) n;
+ const SingleRefData& r2 = rRef.Ref2;
+ n = r2.CreateStoreByteFromFlags();
+ rStream << (INT16) r2.nCol
+ << (INT16) r2.nRow
+ << (INT16) r2.nTab
+ << (BYTE) n;
}
+ break;
case svIndex:
- rStream << (UINT16) nIndex;
+ rStream << (UINT16) GetIndex();
break;
case svJump:
- rStream << (BYTE) nJump[ 0 ];
- for( i = 1; i <= nJump[ 0 ]; i++ )
- rStream << (UINT16) nJump[ i ];
+ {
+ short* pJump = GetJump();
+ rStream << (BYTE) pJump[ 0 ];
+ for( i = 1; i <= pJump[ 0 ]; i++ )
+ rStream << (UINT16) pJump[ i ];
+ }
break;
case svMissing:
case svErr:
break;
default:
- rStream.Write( cStr, cStr[ 0 ] );
+ {
+ BYTE* pUnknown = GetUnknown();
+ if ( pUnknown )
+ rStream.Write( pUnknown, pUnknown[ 0 ] );
+ }
}
}
diff --git a/sc/source/filter/inc/imp_op.hxx b/sc/source/filter/inc/imp_op.hxx
index ce6a80704d8b..233125a32faf 100644
--- a/sc/source/filter/inc/imp_op.hxx
+++ b/sc/source/filter/inc/imp_op.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: imp_op.hxx,v $
*
- * $Revision: 1.4 $
+ * $Revision: 1.5 $
*
- * last change: $Author: dr $ $Date: 2001-02-08 14:12:29 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:38:34 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -96,7 +96,7 @@ class SvStream;
class ScFormulaCell;
class SdrObject;
class ScDocument;
-struct ScToken;
+class ScToken;
class ScToken2;
class ScExtDocOptions;
class _ScRangeListTabs;
diff --git a/sc/source/filter/inc/tokstack.hxx b/sc/source/filter/inc/tokstack.hxx
index 63e5680189a7..c930b154b268 100644
--- a/sc/source/filter/inc/tokstack.hxx
+++ b/sc/source/filter/inc/tokstack.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: tokstack.hxx,v $
*
- * $Revision: 1.2 $
+ * $Revision: 1.3 $
*
- * last change: $Author: gt $ $Date: 2000-09-22 14:55:27 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:38:34 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -82,7 +82,7 @@ typedef OpCode DefTokenId;
//------------------------------------------------------------------------
struct ComplRefData;
class TokenStack;
-struct ScToken;
+class ScToken;
enum E_TYPE
diff --git a/sc/source/ui/miscdlgs/anyrefdg.cxx b/sc/source/ui/miscdlgs/anyrefdg.cxx
index 37fba40935eb..a8382ccfa38b 100644
--- a/sc/source/ui/miscdlgs/anyrefdg.cxx
+++ b/sc/source/ui/miscdlgs/anyrefdg.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: anyrefdg.cxx,v $
*
- * $Revision: 1.3 $
+ * $Revision: 1.4 $
*
- * last change: $Author: nn $ $Date: 2000-11-09 19:54:11 $
+ * last change: $Author: er $ $Date: 2001-02-21 18:39:37 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -698,7 +698,7 @@ void ScAnyRefDlg::ShowFormulaReference( const XubString& rStr )
pTabViewShell->ClearHighlightRanges();
pScTokA->Reset();
- ScToken* pToken=pScTokA->GetNextReference();
+ const ScToken* pToken=pScTokA->GetNextReference();
USHORT nIndex=0;
@@ -710,17 +710,19 @@ void ScAnyRefDlg::ShowFormulaReference( const XubString& rStr )
if(pToken->GetType()==svSingleRef || bDoubleRef)
{
ScRange aRange;
- ComplRefData aRef( pToken->GetReference() );
- aRef.Ref1.CalcAbsIfRel( aPos );
if(bDoubleRef)
{
- aRef.Ref2.CalcAbsIfRel( aPos );
- aRange=ScRange( aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab,
- aRef.Ref2.nCol, aRef.Ref2.nRow, aRef.Ref2.nTab);
+ ComplRefData aRef( pToken->GetDoubleRef() );
+ aRef.CalcAbsIfRel( aPos );
+ aRange.aStart.Set( aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab );
+ aRange.aEnd.Set( aRef.Ref2.nCol, aRef.Ref2.nRow, aRef.Ref2.nTab );
}
else
{
- aRange=ScRange( aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab);
+ SingleRefData aRef( pToken->GetSingleRef() );
+ aRef.CalcAbsIfRel( aPos );
+ aRange.aStart.Set( aRef.nCol, aRef.nRow, aRef.nTab );
+ aRange.aEnd = aRange.aStart;
}
ColorData aColName=ScRangeFindList::GetColorName(nIndex++);
pTabViewShell->AddHighlightRange(aRange, aColName);