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
