Module: sems
Branch: sayer/dsm_lang DELETED
Commit: 5026ab7f50fe641cac281cdc165c3501fa77f6a6
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=5026ab7f50fe641cac281cdc165c3501fa77f6a6

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Thu Jan 27 02:59:50 2011 +0100

DSM: support variables in range, e.g. range($myvar)

Example:
  set($a=0);
  set($b=-5);
  for ($x in range($a, $b)) {
    log(1, $x);
  };

---

 apps/dsm/DSMChartReader.cpp |   19 ++++++-------------
 apps/dsm/DSMStateEngine.cpp |   28 +++++++++++++++++++++-------
 apps/dsm/DSMStateEngine.h   |    5 ++---
 3 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/apps/dsm/DSMChartReader.cpp b/apps/dsm/DSMChartReader.cpp
index 6c9892f..6c67657 100644
--- a/apps/dsm/DSMChartReader.cpp
+++ b/apps/dsm/DSMChartReader.cpp
@@ -181,22 +181,15 @@ bool DSMChartReader::forFromToken(DSMArrayFor& af, const 
string& token) {
     string range_s = forh_v[1].substr(6, forh_v[1].length()-7);
     vector<string> range_v = explode(range_s, ",");
     if (range_v.size() == 2) {
-      if (!str2int(range_v[0], af.range[0]) ||
-         !str2int(range_v[1], af.range[1])) {
-       ERROR("range(%s,%s) not understood in for\n",
-             range_v[0].c_str(), range_v[1].c_str());
-       return false;
-      }
+      af.v = trim(range_v[0], " ");
+      af.array_struct = trim(range_v[1], " ");
     } else {
-      af.range[0] = 0;
-      if (!str2int(range_s, af.range[1])) {
-       ERROR("range(%s) not understood in for\n", range_s.c_str());
-       return false;
-      }
+      af.v = "0";
+      af.array_struct = trim(range_s, " ");
     }
     af.k = forh_v[0];
-    DBG("for (%s in range(%d, %d) {\n",
-       af.k.c_str(), af.range[0], af.range[1]);
+    DBG("for (%s in range(%s, %s) {\n",
+       af.k.c_str(), af.v.c_str(), af.array_struct.c_str());
   } else {
     af.for_type = DSMArrayFor::Array;
     af.array_struct = forh_v[1];
diff --git a/apps/dsm/DSMStateEngine.cpp b/apps/dsm/DSMStateEngine.cpp
index d46b747..13a6a58 100644
--- a/apps/dsm/DSMStateEngine.cpp
+++ b/apps/dsm/DSMStateEngine.cpp
@@ -292,8 +292,8 @@ bool 
DSMStateEngine::runactions(vector<DSMElement*>::iterator from,
     DSMArrayFor* array_for = dynamic_cast<DSMArrayFor*>(*it);
     if (array_for) {
       if (array_for->for_type == DSMArrayFor::Range) {
-       DBG("running for (%s in range(%d, %d) {\n",
-           array_for->k.c_str(), array_for->range[0], array_for->range[1]);
+       DBG("running for (%s in range(%s, %s) {\n",
+           array_for->k.c_str(), array_for->v.c_str(), 
array_for->array_struct.c_str());
       } else {
        DBG("running for (%s%s in %s) {\n",
            array_for->k.c_str(), array_for->v.empty() ? "" : 
(","+array_for->v).c_str(),
@@ -321,7 +321,7 @@ bool 
DSMStateEngine::runactions(vector<DSMElement*>::iterator from,
        v_name.erase(0, 1);
 
       vector<pair<string, string> > cnt_values;
-
+      int range[2] = {0,0};
       // get the counter values
       if (array_for->for_type == DSMArrayFor::Struct) {
        VarMapT::iterator lb = sc_sess->var.lower_bound(array_name);
@@ -355,7 +355,21 @@ bool 
DSMStateEngine::runactions(vector<DSMElement*>::iterator from,
          DBG("      '%s'\n", v->second.c_str());
          v++;
        }
-
+      } else if (array_for->for_type == DSMArrayFor::Range) {
+       string s_range = resolveVars(array_for->v, sess, sc_sess, event_params);
+       if (!str2int(s_range, range[0])) {
+         WARN("Error converting lower bound range(%s,%s)\n",
+              array_for->v.c_str(), array_for->array_struct.c_str());
+         range[0]=0;
+       } else {
+         s_range = resolveVars(array_for->array_struct, sess, sc_sess, 
event_params);
+
+         if (!str2int(s_range, range[1])) {
+           WARN("Error converting upper bound range(%s,%s)\n",
+                array_for->v.c_str(), array_for->array_struct.c_str());
+           range[0]=0; range[1]=0;
+         }
+       }
       }
 
       // save counter k
@@ -374,15 +388,15 @@ bool 
DSMStateEngine::runactions(vector<DSMElement*>::iterator from,
 
       // run the loop
       if (array_for->for_type == DSMArrayFor::Range) {
-       int cnt = array_for->range[0];
-       while (cnt != array_for->range[1]) {
+       int cnt = range[0];
+       while (cnt != range[1]) {
          sc_sess->var[k_name] = int2str(cnt);
          DBG("setting $%s=%s\n", k_name.c_str(), sc_sess->var[k_name].c_str());
 
          runactions(array_for->actions.begin(), array_for->actions.end(),
                     sess, sc_sess, event, event_params, is_consumed);
 
-         if (array_for->range[1] > array_for->range[0])
+         if (range[1] > range[0])
            cnt++;
          else
            cnt--;
diff --git a/apps/dsm/DSMStateEngine.h b/apps/dsm/DSMStateEngine.h
index 118cda4..e335109 100644
--- a/apps/dsm/DSMStateEngine.h
+++ b/apps/dsm/DSMStateEngine.h
@@ -190,9 +190,8 @@ class DSMArrayFor
   } for_type;
 
   string k; // for(k in array)
-  string v; // for(k,v in struct)
-  int range[2];
-  string array_struct; // array or struct name
+  string v; // for(k,v in struct), or range lower bound
+  string array_struct; // array or struct name, or range upper bound
   vector<DSMElement*> actions;
 };
 

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to