Module: sems
Branch: master
Commit: a0ecb34f0c802b5be80a443bbbcb10fff93a8630
URL: 
https://github.com/sems-server/sems/commit/a0ecb34f0c802b5be80a443bbbcb10fff93a8630

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date: 2015-06-09T00:27:49+02:00

b/f:dsm: sets() - don't try to replace within already replaced strings

---

Modified: apps/dsm/DSMCoreModule.cpp

---

Diff:  
https://github.com/sems-server/sems/commit/a0ecb34f0c802b5be80a443bbbcb10fff93a8630.diff
Patch: 
https://github.com/sems-server/sems/commit/a0ecb34f0c802b5be80a443bbbcb10fff93a8630.patch

---

diff --git a/apps/dsm/DSMCoreModule.cpp b/apps/dsm/DSMCoreModule.cpp
index c96528d..2e53b8c 100644
--- a/apps/dsm/DSMCoreModule.cpp
+++ b/apps/dsm/DSMCoreModule.cpp
@@ -753,23 +753,37 @@ string replaceParams(const string& q, AmSession* sess, 
DSMSession* sc_sess,
     // todo: simply use resolveVars (?)
     switch(res[rstart]) {
     case '$': {
-      
-      if (sc_sess->var.find(keyname) == sc_sess->var.end())
-       res.erase(rstart, rend-rstart); 
-      else 
-       res.replace(rstart, rend-rstart, sc_sess->var[keyname]); 
+      if (sc_sess->var.find(keyname) == sc_sess->var.end()) {
+       res.erase(rstart, rend-rstart);
+       if (repl_pos) repl_pos--; // repl_pos was after $
+      } else { 
+       res.replace(rstart, rend-rstart, sc_sess->var[keyname]);
+       if (sc_sess->var[keyname].size())
+         repl_pos+=sc_sess->var[keyname].size()-1; // skip after new string
+      }
     } break;
     case '#':
       if (NULL!=event_params) {
-       if (event_params->find(keyname) != event_params->end())
+       if (event_params->find(keyname) != event_params->end()) {
          res.replace(rstart, rend-rstart, (*event_params)[keyname]);
-       else
-         res.erase(rstart, rend-rstart);       
+         if (repl_pos+=(*event_params)[keyname].size())
+           repl_pos+=(*event_params)[keyname].size()-1; // skip after new 
string
+       } else {
+         res.erase(rstart, rend-rstart);
+         if (repl_pos) repl_pos--; // repl_pos was after #
+       }
       } break;
     case '@': {
-      // todo: optimize 
-      res.replace(rstart, rend-rstart, 
-                 resolveVars("@"+keyname, sess, sc_sess, event_params));
+      // todo: optimize
+      string n = resolveVars("@"+keyname, sess, sc_sess, event_params);
+      res.replace(rstart, rend-rstart, n);
+      if (n.size())
+       repl_pos+=n.size()-1;  // skip after new string
+        //    rstart  rend
+       // bla@(varname)uuuu
+        //     r
+        //         r
+        // bla12345huuuu
     } break;
     default: break;
     }

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

Reply via email to