From 8b9f29f9230a2c6d437eb1449577331d88702fe5 Mon Sep 17 00:00:00 2001
From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Date: Fri, 2 Oct 2009 17:37:02 +0200
Subject: [PATCH] implement eval()

---
 src/shared/proparser/profileevaluator.cpp | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp
index 45fb093df23..6834cb2a074 100644
--- a/src/shared/proparser/profileevaluator.cpp
+++ b/src/shared/proparser/profileevaluator.cpp
@@ -139,8 +139,8 @@ public:
     /////////////// Reading pro file
 
     bool read(ProFile *pro);
-    bool read(ProFile *pro, const QString &content);
-    bool read(ProFile *pro, QTextStream *ts);
+    bool read(ProBlock *pro, const QString &content);
+    bool read(ProBlock *pro, QTextStream *ts);
 
     ProBlock *currentBlock();
     void updateItem(ushort *ptr);
@@ -288,22 +288,23 @@ bool ProFileEvaluator::Private::read(ProFile *pro)
     }
 
     QTextStream ts(&file);
+    m_lineNo = 1;
     return read(pro, &ts);
 }
 
-bool ProFileEvaluator::Private::read(ProFile *pro, const QString &content)
+bool ProFileEvaluator::Private::read(ProBlock *pro, const QString &content)
 {
     QString str(content);
     QTextStream ts(&str, QIODevice::ReadOnly | QIODevice::Text);
+    m_lineNo = 1;
     return read(pro, &ts);
 }
 
-bool ProFileEvaluator::Private::read(ProFile *pro, QTextStream *ts)
+bool ProFileEvaluator::Private::read(ProBlock *pro, QTextStream *ts)
 {
     // Parser state
     m_block = 0;
     m_commentItem = 0;
-    m_lineNo = 1;
     m_blockstack.clear();
     m_blockstack.push(pro);
 
@@ -2253,8 +2254,17 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
             return ProItem::ReturnFalse;
 #if 0
         case T_REQUIRES:
-        case T_EVAL:
 #endif
+        case T_EVAL: {
+                ProBlock *pro = new ProBlock(0);
+                if (!read(pro, args.join(QLatin1String(" ")))) {
+                    delete pro;
+                    return ProItem::ReturnFalse;
+                }
+                bool ret = pro->Accept(this);
+                pro->deref();
+                return returnBool(ret);
+            }
         case T_FOR: {
             if (m_cumulative) // This is a no-win situation, so just pretend it's no loop
                 return ProItem::ReturnTrue;
-- 
GitLab