summaryrefslogtreecommitdiffstats
path: root/src/kvirc/kvs/kvi_kvs_treenode_arrayelement.cpp
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-24 02:13:59 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-24 02:13:59 +0000
commita6d58bb6052ac8cb01805a48c4ad2f129126116f (patch)
treedd867a099fcbb263a8009a9fb22695b87855dad6 /src/kvirc/kvs/kvi_kvs_treenode_arrayelement.cpp
downloadkvirc-a6d58bb6052ac8cb01805a48c4ad2f129126116f.tar.gz
kvirc-a6d58bb6052ac8cb01805a48c4ad2f129126116f.zip
Added KDE3 version of kvirc
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kvirc@1095341 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'src/kvirc/kvs/kvi_kvs_treenode_arrayelement.cpp')
-rw-r--r--src/kvirc/kvs/kvi_kvs_treenode_arrayelement.cpp161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/kvirc/kvs/kvi_kvs_treenode_arrayelement.cpp b/src/kvirc/kvs/kvi_kvs_treenode_arrayelement.cpp
new file mode 100644
index 0000000..ada9fd8
--- /dev/null
+++ b/src/kvirc/kvs/kvi_kvs_treenode_arrayelement.cpp
@@ -0,0 +1,161 @@
+//=============================================================================
+//
+// File : kvi_kvs_treenode_arrayelement.cpp
+// Created on Tue 07 Oct 2003 02:58:41 by Szymon Stefanek
+//
+// This file is part of the KVIrc IRC client distribution
+// Copyright (C) 2003 Szymon Stefanek <pragma at kvirc dot net>
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your opinion) any later version.
+//
+// This program is distributed in the HOPE that it will be USEFUL,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, write to the Free Software Foundation,
+// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+//=============================================================================
+
+#define __KVIRC__
+
+#include "kvi_kvs_treenode_arrayelement.h"
+#include "kvi_kvs_runtimecontext.h"
+#include "kvi_locale.h"
+#include "kvi_kvs_array.h"
+#include "kvi_kvs_object.h"
+
+KviKvsTreeNodeArrayElement::KviKvsTreeNodeArrayElement(const QChar * pLocation,KviKvsTreeNodeData * pSource,KviKvsTreeNodeExpression * pIndex)
+: KviKvsTreeNodeArrayOrHashElement(pLocation,pSource)
+{
+#ifdef COMPILE_NEW_KVS
+ m_pIndex = pIndex;
+ m_pIndex->setParent(this);
+#endif
+}
+
+
+KviKvsTreeNodeArrayElement::~KviKvsTreeNodeArrayElement()
+{
+#ifdef COMPILE_NEW_KVS
+ delete m_pIndex;
+#endif
+}
+
+void KviKvsTreeNodeArrayElement::contextDescription(QString &szBuffer)
+{
+ szBuffer = "Array Element Evaluation";
+}
+
+void KviKvsTreeNodeArrayElement::dump(const char * prefix)
+{
+#ifdef COMPILE_NEW_KVS
+ debug("%s ArrayElement",prefix);
+ QString tmp = prefix;
+ tmp.append(" ");
+ m_pSource->dump(tmp.utf8().data());
+ m_pIndex->dump(tmp.utf8().data());
+#endif
+}
+
+bool KviKvsTreeNodeArrayElement::evaluateIndex(KviKvsRunTimeContext *c,kvs_int_t &iVal)
+{
+ KviKvsVariant idx;
+ if(!m_pIndex->evaluateReadOnly(c,&idx))return false;
+
+ if(!idx.asInteger(iVal))
+ {
+ c->error(this,__tr2qs("Array index didn't evaluate to an integer"));
+ return false;
+ }
+
+ if(iVal < 0)
+ {
+ c->error(this,__tr2qs("Array index evaluated to a negative integer (non negative integer expected)"));
+ return false;
+ }
+ return true;
+}
+
+
+bool KviKvsTreeNodeArrayElement::evaluateReadOnlyInObjectScope(KviKvsObject * o,KviKvsRunTimeContext * c,KviKvsVariant * pBuffer)
+{
+#ifdef COMPILE_NEW_KVS
+ kvs_int_t iVal;
+ if(!evaluateIndex(c,iVal))return false;
+
+ KviKvsVariant val;
+ if(o)
+ {
+ if(!m_pSource->evaluateReadOnlyInObjectScope(o,c,&val))return false;
+ } else {
+ if(!m_pSource->evaluateReadOnly(c,&val))return false;
+ }
+
+ if(!val.isArray())
+ {
+ if(!val.isNothing())
+ {
+ QString szType;
+ val.getTypeName(szType);
+ c->warning(this,__tr2qs("The argument of the [] subscript didn't evaluate to an array: automatic conversion from %Q supplied"),&szType);
+ }
+ pBuffer->setNothing();
+ return true;
+ }
+
+ KviKvsVariant * v = val.array()->at(iVal);
+ if(!v)
+ {
+ pBuffer->setNothing();
+ return true;
+ }
+
+ pBuffer->copyFrom(v);
+#endif
+ return true;
+}
+
+KviKvsRWEvaluationResult * KviKvsTreeNodeArrayElement::evaluateReadWriteInObjectScope(KviKvsObject *o,KviKvsRunTimeContext * c)
+{
+#ifdef COMPILE_NEW_KVS
+ kvs_int_t iVal;
+ if(!evaluateIndex(c,iVal))return false;
+
+ KviKvsRWEvaluationResult * result;
+ if(o)result = m_pSource->evaluateReadWriteInObjectScope(o,c);
+ else result = m_pSource->evaluateReadWrite(c);
+ if(!result)return 0;
+
+ if(!result->result()->isArray())
+ {
+ // convert to hash in some way
+ if(!result->result()->isNothing())
+ {
+ QString szType;
+ result->result()->getTypeName(szType);
+ c->warning(this,__tr2qs("The argument of the [] subscript didn't evaluate to an array: automatic conversion from type '%Q' supplied"),&szType);
+ }
+ result->result()->setArray(new KviKvsArray());
+ }
+ return new KviKvsArrayElement(result,result->result()->array()->getAt(iVal),result->result()->array(),iVal);
+#else
+ return 0;
+#endif
+}
+
+bool KviKvsTreeNodeArrayElement::evaluateReadOnly(KviKvsRunTimeContext * c,KviKvsVariant * pBuffer)
+{
+ return evaluateReadOnlyInObjectScope(0,c,pBuffer);
+}
+
+KviKvsRWEvaluationResult * KviKvsTreeNodeArrayElement::evaluateReadWrite(KviKvsRunTimeContext * c)
+{
+ return evaluateReadWriteInObjectScope(0,c);
+}
+