summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--formula/source/core/api/vectortoken.cxx29
-rw-r--r--include/formula/vectortoken.hxx5
-rw-r--r--sc/source/core/data/column2.cxx20
-rw-r--r--sc/source/core/data/grouptokenconverter.cxx6
4 files changed, 45 insertions, 15 deletions
diff --git a/formula/source/core/api/vectortoken.cxx b/formula/source/core/api/vectortoken.cxx
index bd75efba9e98..c1ff94c82146 100644
--- a/formula/source/core/api/vectortoken.cxx
+++ b/formula/source/core/api/vectortoken.cxx
@@ -11,15 +11,34 @@
namespace formula {
-VectorRefArray::VectorRefArray() : mpNumericArray(NULL), mpStringArray(NULL) {}
-VectorRefArray::VectorRefArray( const double* pArray ) : mpNumericArray(pArray), mpStringArray(NULL) {}
-VectorRefArray::VectorRefArray( rtl_uString** pArray ) : mpNumericArray(NULL), mpStringArray(pArray) {}
+VectorRefArray::VectorRefArray() :
+ mpNumericArray(NULL),
+ mpStringArray(NULL),
+ mbValid(true) {}
+
+VectorRefArray::VectorRefArray( InitInvalid ) :
+ mpNumericArray(NULL),
+ mpStringArray(NULL),
+ mbValid(false) {}
+
+VectorRefArray::VectorRefArray( const double* pArray ) :
+ mpNumericArray(pArray),
+ mpStringArray(NULL),
+ mbValid(true) {}
+
+VectorRefArray::VectorRefArray( rtl_uString** pArray ) :
+ mpNumericArray(NULL),
+ mpStringArray(pArray),
+ mbValid(true) {}
+
VectorRefArray::VectorRefArray( const double* pNumArray, rtl_uString** pStrArray ) :
- mpNumericArray(pNumArray), mpStringArray(pStrArray) {}
+ mpNumericArray(pNumArray),
+ mpStringArray(pStrArray),
+ mbValid(true) {}
bool VectorRefArray::isValid() const
{
- return mpNumericArray || mpStringArray;
+ return mbValid;
}
SingleVectorRefToken::SingleVectorRefToken( const VectorRefArray& rArray, size_t nReqLength, size_t nArrayLength ) :
diff --git a/include/formula/vectortoken.hxx b/include/formula/vectortoken.hxx
index 125dd405e310..0c28f7e9e2c9 100644
--- a/include/formula/vectortoken.hxx
+++ b/include/formula/vectortoken.hxx
@@ -34,10 +34,15 @@ namespace formula {
*/
struct FORMULA_DLLPUBLIC VectorRefArray
{
+ enum InitInvalid { Invalid };
+
const double* mpNumericArray;
rtl_uString** mpStringArray;
+ bool mbValid;
+
VectorRefArray();
+ VectorRefArray( InitInvalid );
VectorRefArray( const double* pArray );
VectorRefArray( rtl_uString** pArray );
VectorRefArray( const double* pNumArray, rtl_uString** pStrArray );
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 56fe643b0732..d6019bed5f30 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -2426,7 +2426,7 @@ bool hasNonEmpty( const sc::FormulaGroupContext::StrArrayType& rArray, SCROW nRo
formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 )
{
if (nRow1 > nRow2)
- return formula::VectorRefArray();
+ return formula::VectorRefArray(formula::VectorRefArray::Invalid);
// See if the requested range is already cached.
sc::FormulaGroupContext& rCxt = pDocument->GetFormulaGroupContext();
@@ -2470,13 +2470,13 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
pColArray = rCxt.setCachedColArray(nTab, nCol, &rArray, NULL);
if (!pColArray)
// Failed to insert a new cached column array.
- return formula::VectorRefArray();
+ return formula::VectorRefArray(formula::VectorRefArray::Invalid);
// Fill the remaining array with values from the following blocks.
size_t nPos = itBlk->size;
++itBlk;
if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end()))
- return formula::VectorRefArray();
+ return formula::VectorRefArray(formula::VectorRefArray::Invalid);
if (pColArray->mpStrArray)
return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]);
@@ -2507,7 +2507,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
size_t nPos = itBlk->size;
++itBlk;
if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end()))
- return formula::VectorRefArray();
+ return formula::VectorRefArray(formula::VectorRefArray::Invalid);
if (pColArray->mpNumArray)
return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]);
@@ -2524,7 +2524,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
pColArray = copyFirstFormulaBlock(rCxt, itBlk, nRow2+1, nTab, nCol);
if (!pColArray)
// Failed to insert a new cached column array.
- return formula::VectorRefArray();
+ return formula::VectorRefArray(formula::VectorRefArray::Invalid);
const double* pNum = NULL;
rtl_uString** pStr = NULL;
@@ -2539,12 +2539,12 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
pColArray = copyFirstFormulaBlock(rCxt, itBlk, nRow2+1, nTab, nCol);
if (!pColArray)
// Failed to insert a new cached column array.
- return formula::VectorRefArray();
+ return formula::VectorRefArray(formula::VectorRefArray::Invalid);
size_t nPos = itBlk->size;
++itBlk;
if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end()))
- return formula::VectorRefArray();
+ return formula::VectorRefArray(formula::VectorRefArray::Invalid);
const double* pNum = NULL;
rtl_uString** pStr = NULL;
@@ -2564,7 +2564,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
pColArray = rCxt.setCachedColArray(nTab, nCol, &rArray, NULL);
if (!pColArray)
// Failed to insert a new cached column array.
- return formula::VectorRefArray();
+ return formula::VectorRefArray(formula::VectorRefArray::Invalid);
if (static_cast<size_t>(nRow2) < itBlk->size)
return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1]);
@@ -2573,7 +2573,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
size_t nPos = itBlk->size;
++itBlk;
if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end()))
- return formula::VectorRefArray();
+ return formula::VectorRefArray(formula::VectorRefArray::Invalid);
if (pColArray->mpStrArray && hasNonEmpty(*pColArray->mpStrArray, nRow1, nRow2))
return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]);
@@ -2585,7 +2585,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
;
}
- return formula::VectorRefArray();
+ return formula::VectorRefArray(formula::VectorRefArray::Invalid);
}
void ScColumn::SetFormulaResults( SCROW nRow, const double* pResults, size_t nLen )
diff --git a/sc/source/core/data/grouptokenconverter.cxx b/sc/source/core/data/grouptokenconverter.cxx
index a43efb05aa31..537bd2154efa 100644
--- a/sc/source/core/data/grouptokenconverter.cxx
+++ b/sc/source/core/data/grouptokenconverter.cxx
@@ -119,6 +119,9 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode)
if (nTrimLen)
aArray = mrDoc.FetchVectorRefArray(aRefPos, nTrimLen);
+ if (!aArray.isValid())
+ return false;
+
formula::SingleVectorRefToken aTok(aArray, nLen, nTrimLen);
mrGroupTokens.AddToken(aTok);
}
@@ -188,6 +191,9 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode)
if (nArrayLength)
aArray = mrDoc.FetchVectorRefArray(aRefPos, nArrayLength);
+ if (!aArray.isValid())
+ return false;
+
aArrays.push_back(aArray);
}