summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--formula/source/core/api/FormulaCompiler.cxx4
-rw-r--r--include/formula/compiler.hrc5
-rw-r--r--include/formula/opcode.hxx1
-rw-r--r--sc/source/core/inc/interpre.hxx1
-rw-r--r--sc/source/core/tool/compiler.cxx4
-rw-r--r--sc/source/core/tool/interpr4.cxx1
-rw-r--r--sc/source/core/tool/interpr7.cxx40
7 files changed, 51 insertions, 5 deletions
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx
index e8c40aa376f2..1051b7367593 100644
--- a/formula/source/core/api/FormulaCompiler.cxx
+++ b/formula/source/core/api/FormulaCompiler.cxx
@@ -39,7 +39,7 @@ namespace formula
{
using namespace ::com::sun::star;
- static const sal_Char* pInternal[ 1 ] = { "TTT" };
+ static const sal_Char* pInternal[2] = { "TTT", "__DEBUG_VAR" };
namespace {
@@ -794,6 +794,8 @@ bool FormulaCompiler::IsOpCodeVolatile( OpCode eOp )
case ocIndirectXL:
// ocOffset results in indirect references.
case ocOffset:
+ // ocDebugVar shows internal value that may change as the internal state changes.
+ case ocDebugVar:
bRet = true;
break;
default:
diff --git a/include/formula/compiler.hrc b/include/formula/compiler.hrc
index 3b7207c5883d..ffab76715c45 100644
--- a/include/formula/compiler.hrc
+++ b/include/formula/compiler.hrc
@@ -450,10 +450,11 @@
/*** Internal ***/
#define SC_OPCODE_INTERNAL_BEGIN 9999
#define SC_OPCODE_TTT 9999
-#define SC_OPCODE_INTERNAL_END 9999
+#define SC_OPCODE_DEBUG_VAR 10000
+#define SC_OPCODE_INTERNAL_END 10000
/*** from here on ExtraData contained ***/
-#define SC_OPCODE_DATA_TOKEN_1 10000
+#define SC_OPCODE_DATA_TOKEN_1 10001
#define SC_OPCODE_NONE 0xFFFF
diff --git a/include/formula/opcode.hxx b/include/formula/opcode.hxx
index d978a2654834..ce6fd1529996 100644
--- a/include/formula/opcode.hxx
+++ b/include/formula/opcode.hxx
@@ -440,6 +440,7 @@ enum OpCodeEnum
// internal stuff
ocInternalBegin = SC_OPCODE_INTERNAL_BEGIN,
ocTTT = SC_OPCODE_TTT,
+ ocDebugVar = SC_OPCODE_DEBUG_VAR,
ocInternalEnd = SC_OPCODE_INTERNAL_END,
// from here on ExtraData
ocDataToken1 = SC_OPCODE_DATA_TOKEN_1,
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index c6aa5ad28d64..49c634fd1512 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -561,6 +561,7 @@ void ScBitXor();
void ScBitRshift();
void ScBitLshift();
void ScTTT();
+void ScDebugVar();
/** Obtain the date serial number for a given date.
@param bStrict
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index ffce53ba5fce..b4b9af31704d 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -89,7 +89,7 @@ enum ScanState
ssStop
};
-static const sal_Char* pInternal[ 1 ] = { "TTT" };
+static const sal_Char* pInternal[2] = { "TTT", "__DEBUG_VAR" };
using namespace ::com::sun::star::i18n;
@@ -3440,7 +3440,7 @@ bool ScCompiler::NextNewToken( bool bInArray )
bool bAsciiNonAlnum; // operators, separators, ...
if ( cSymbol[0] < 128 )
{
- bMayBeFuncName = rtl::isAsciiAlpha( cSymbol[0] );
+ bMayBeFuncName = rtl::isAsciiAlpha( cSymbol[0] ) || cSymbol[0] == '_';
bAsciiNonAlnum = !bMayBeFuncName && !rtl::isAsciiDigit( cSymbol[0] );
}
else
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index ed0f34ae9b88..ba5b24e9c830 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -4228,6 +4228,7 @@ StackVar ScInterpreter::Interpret()
case ocBitRshift : ScBitRshift(); break;
case ocBitLshift : ScBitLshift(); break;
case ocTTT : ScTTT(); break;
+ case ocDebugVar : ScDebugVar(); break;
case ocNone : nFuncFmtType = NUMBERFORMAT_UNDEFINED; break;
default : PushError( errUnknownOpCode); break;
}
diff --git a/sc/source/core/tool/interpr7.cxx b/sc/source/core/tool/interpr7.cxx
index bb647c1eb698..0bcf7ae1a5bc 100644
--- a/sc/source/core/tool/interpr7.cxx
+++ b/sc/source/core/tool/interpr7.cxx
@@ -15,6 +15,8 @@
#include <com/sun/star/io/XInputStream.hpp>
#include "libxml/xpath.h"
+#include <dpobject.hxx>
+#include <document.hxx>
#include <boost/shared_ptr.hpp>
#include <cstring>
@@ -205,4 +207,42 @@ void ScInterpreter::ScWebservice()
}
}
+void ScInterpreter::ScDebugVar()
+{
+ // This is to be used by developers only! Never document this for end
+ // users. This is a convenient way to extract arbitrary internal state to
+ // a cell for easier debugging.
+
+ if (!MustHaveParamCount(GetByte(), 1))
+ {
+ PushIllegalParameter();
+ return;
+ }
+
+ rtl_uString* p = GetString().getDataIgnoreCase();
+ if (!p)
+ {
+ PushIllegalParameter();
+ return;
+ }
+
+ OUString aStrUpper(p);
+
+ if (aStrUpper == "PIVOTCOUNT")
+ {
+ // Set the number of pivot tables in the document.
+
+ double fVal = 0.0;
+ if (pDok->HasPivotTable())
+ {
+ const ScDPCollection* pDPs = pDok->GetDPCollection();
+ fVal = pDPs->GetCount();
+ }
+ PushDouble(fVal);
+ return;
+ }
+
+ PushIllegalParameter();
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */