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);
  };
sayer/1.4-spce2.6
Stefan Sayer 16 years ago
parent dd467a96ef
commit 5026ab7f50

@ -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];

@ -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--;

@ -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;
};

Loading…
Cancel
Save