Index: trunk/SophyaLib/SysTools/commander.cc
===================================================================
--- trunk/SophyaLib/SysTools/commander.cc	(revision 3814)
+++ trunk/SophyaLib/SysTools/commander.cc	(revision 4034)
@@ -55,7 +55,9 @@
 
 // Differents code de retour specifiques 
-#define CMD_RETURN_RC  99900
-#define CMD_BREAK_RC   99990
-#define CMD_BREAKEXE_RC 99999
+#define CMD_RETURN_RC     99900
+#define CMD_BREAK_RC      99990
+#define CMD_LOOPBREAK_RC  99910
+#define CMD_BREAKALL_RC   99998
+#define CMD_BREAKEXE_RC   99999
 
 // ------------------------------------------------------------
@@ -196,5 +198,6 @@
   if (kw == "if")  testlevel++;
   else if (kw == "endif")  testlevel--; 
-  else if ((kw == "for") || (kw == "foreach"))  looplevel++;
+  // bug trouve par JEC en Mai 2011 forinfile manquant ds la ligne suivante 
+  else if ((kw == "for") || (kw == "foreach") || (kw == "forinfile"))  looplevel++;
   else if (kw == "end")  looplevel--; 
   else if (kw == "defscript")  scrdef = true; 
@@ -217,17 +220,19 @@
     line = "";
     getline(is,line);
-    if (is.good() || is.eof()) {
+    if (is.good()) { // bug signale par JEC en mai 2011 || is.eof()) {
       rcc = ExecuteOnce(line);
-      if (rcc == CMD_BREAKEXE_RC)  return rcc;
+      if ((rcc == CMD_BREAKEXE_RC) || (rcc == CMD_BREAKALL_RC)) return rcc;
       else if (rcc == CMD_BREAK_RC)  break;
     }
   }
+  rcc=0;
 }
 else if (typ == BT_ForeachList) {  // foreach string loop
   for(unsigned int k=0; k<strlist.size(); k++) {
     rcc = ExecuteOnce(strlist[k]);
-    if (rcc == CMD_BREAKEXE_RC)  return rcc;
+    if ((rcc == CMD_BREAKEXE_RC) || (rcc == CMD_BREAKALL_RC)) return rcc;
     else if (rcc == CMD_BREAK_RC)  break; 
-  }  
+  }
+  rcc = 0;  
 }
 else if (typ == BT_ForeachInt)  { // Integer loop
@@ -241,7 +246,8 @@
     string lvv = buff;
     rcc = ExecuteOnce(lvv);
-    if (rcc == CMD_BREAKEXE_RC)  return rcc;
+    if ((rcc == CMD_BREAKEXE_RC) || (rcc == CMD_BREAKALL_RC)) return rcc;
     else if (rcc == CMD_BREAK_RC)  break; 
   }
+  rcc = 0;
 }
 else if (typ == BT_ForeachFloat)  { // float loop
@@ -254,7 +260,8 @@
     string lvv = cval_dble2str(f);
     rcc = ExecuteOnce(lvv);
-    if (rcc == CMD_BREAKEXE_RC)  return rcc;
+    if ((rcc == CMD_BREAKEXE_RC) || (rcc == CMD_BREAKALL_RC)) return rcc;
     else if (rcc == CMD_BREAK_RC)  break; 
   }
+  rcc = 0;
 }
 return(rcc); 
@@ -275,5 +282,5 @@
     else 
       rcc = blocs[-kk-1]->Execute();
-    if (rcc == CMD_BREAKEXE_RC)  return (rcc);
+    if ((rcc == CMD_BREAKEXE_RC) || (rcc == CMD_BREAKALL_RC)) return rcc;
     if (rcc == CMD_BREAK_RC)  break;    
   }
@@ -346,5 +353,6 @@
   if (kw == "if")  testlevel++;
   else if (kw == "endif")  testlevel--; 
-  else if ((kw == "for") || (kw == "foreach"))  looplevel++;
+  // bug trouve par JEC en Mai 2011 forinfile manquant ds la ligne suivante 
+  else if ((kw == "for") || (kw == "foreach") || (kw == "forinfile"))  looplevel++;
   else if (kw == "end")  looplevel--; 
   else if (kw == "defscript")  scrdef = true; 
@@ -486,5 +494,5 @@
 trace = false;   timing = false;
 gltimer = NULL;
-felevel = 0;
+felevel_ = 0;
 SetMaxLoopLimit();
 mulinecmd = "";
@@ -501,8 +509,6 @@
  fgexebrk = false;
 
-CmdBlks.push(NULL);
-list<char> xtx;
-TestsStack.push(xtx);
-curtestresult = true;
+curtestresult_ = true;
+PushStack();
 
 // Pour la numerotation et l'identification des threads
@@ -537,5 +543,6 @@
 usage += "  > else          # Conditional  \n";
 usage += "  > endif         # End of conditional if bloc \n"; 
-usage += "  > break         # Delete (clears) all test and loop blocs \n";
+usage += "  > break         # exit from the current loop blocs \n";
+usage += "  > breakall      # exit all loop blocs \n";
 usage += "  > return        # Stops command execution from a file \n";
 usage += "  > defscript endscript # Command script definition \n";
@@ -903,9 +910,9 @@
 // On verifie si nous sommes dans un bloc (for , foreach)
 if (CmdBlks.top() != NULL)  { // On est dans un bloc
-  if ( (kw == "for") || (kw == "foreach") || (kw == "forinfile") ) felevel++;
-  else if (kw == "end") felevel--;
+  if ( (kw == "for") || (kw == "foreach") || (kw == "forinfile") ) felevel_++;
+  else if (kw == "end") felevel_--;
 
   int rcbex = 0;
-  if (felevel == 0) { // Il faut executer le bloc
+  if (felevel_ == 0) { // Il faut executer le bloc
     CommanderBloc* curb = CmdBlks.top();
     CmdBlks.top() = curb->Parent();
@@ -921,11 +928,9 @@
     bool ohv = histon;
     histon = false;
-    if (curtestresult) { 
+    if (curtestresult_) { 
       // We push also CommanderBloc and testresult on the stack
-      CmdBlks.push(NULL);
-      list<char> xtx;
-      TestsStack.push(xtx);
+      PushStack();
       rcbex = curb->Execute();
-      // And CommanderBloc and TestResult from the corresponding stacks
+      // And then, pop CommanderBloc and TestResult from the corresponding stacks
       PopStack(false);
     }
@@ -946,7 +951,7 @@
 
 // Sommes-nous dans un bloc de test if then else 
-if (TestsStack.top().size() > 0) {  // Nous sommes ds un bloc if 
+if (TestsStack.top().tstlist.size() > 0) {  // Nous sommes ds un bloc if 
   if (kw == "else") {
-    if ((*tresit) & 2) {
+    if ((*tresit_) & 2) {
       cerr << "Commander::Interpret()/syntax error - multiple else in if bloc \n"
 	   << "line: " << s << endl;
@@ -955,8 +960,8 @@
     }
     else { 
-      const char * npr = ((*tresit)&1) ? "else-F> " : "else-T> ";
-      if ((*tresit)&1)  curtestresult = false;
+      const char * npr = ((*tresit_)&1) ? "else-F> " : "else-T> ";
+      if ((*tresit_)&1)  curtestresult_ = false;
       SetCurrentPrompt(npr);
-      (*tresit) |= 2;
+      (*tresit_) |= 2;
       _xstatus = 0;
       return(0);
@@ -964,25 +969,25 @@
   }
   else if (kw == "endif") {
-    list<char>::iterator dbit = tresit;
-    tresit--;
-    TestsStack.top().erase(dbit);
+    list<char>::iterator dbit = tresit_;
+    tresit_--;
+    TestsStack.top().tstlist.erase(dbit);
     const char * npr = "Cmd> ";
-    if (TestsStack.top().size() > 1) {
-      curtestresult = true;
+    if (TestsStack.top().tstlist.size() > 1) {
+      curtestresult_ = true;
       list<char>::iterator it;
-      for(it=TestsStack.top().begin(); it!=TestsStack.top().end(); it++) {
+      for(it=TestsStack.top().tstlist.begin(); it!=TestsStack.top().tstlist.end(); it++) {
 	// Si on n'est pas ds le else et le if est faux
-	if ( !((*it)&2) && !((*it)&1) ) curtestresult = false;
+	if ( !((*it)&2) && !((*it)&1) ) curtestresult_ = false;
 	// Si on est ds else et le if etait vrai !
-	if ( ((*it)&2) && ((*it)&1) )  curtestresult = false;
-	if (!curtestresult)  break;
+	if ( ((*it)&2) && ((*it)&1) )  curtestresult_ = false;
+	if (!curtestresult_)  break;
       }
       
-      if (!((*tresit)&2)) 
-	npr = ((*tresit)&1) ? "if-T> " : "if-F> ";
+      if (!((*tresit_)&2)) 
+	npr = ((*tresit_)&1) ? "if-T> " : "if-F> ";
       else 
-	npr = ((*tresit)&1) ? "else-F> " : "else-T> ";
-    }
-    else curtestresult = true;
+	npr = ((*tresit_)&1) ? "else-F> " : "else-T> ";
+    }
+    else curtestresult_ = true;
     SetCurrentPrompt(npr);
     _xstatus = 0;
@@ -998,7 +1003,7 @@
 
 bool fgcont = true;
-if (TestsStack.top().size() > 0) { // Resultat de if ou else
+if (TestsStack.top().tstlist.size() > 0) { // Resultat de if ou else
   list<char>::iterator it;
-  for(it=TestsStack.top().begin(); it!=TestsStack.top().end(); it++) {
+  for(it=TestsStack.top().tstlist.begin(); it!=TestsStack.top().tstlist.end(); it++) {
     // Si on n'est pas ds le else et le if est faux
     if ( !((*it)&2) && !((*it)&1) )  fgcont = false;
@@ -1017,4 +1022,5 @@
 // Les mots cles break et return peuvent de sortir de boucles/scripts/execfile
 if (kw == "break") return CMD_BREAK_RC;
+if (kw == "breakall") return CMD_BREAKALL_RC;
 else if (kw == "return")  { 
   _retstr = toks; 
@@ -1049,5 +1055,5 @@
     return(91);
     }
-  felevel++;
+  felevel_++;
   if (CmdBlks.top())  CmdBlks.top()->AddBloc(bloc);
   else  SetCurrentPrompt("for...> ");
@@ -1065,7 +1071,7 @@
   }
   char res_tst = (restst) ? 1 : 0;
-  TestsStack.top().push_back(res_tst);
-  if (TestsStack.top().size() == 1) tresit = TestsStack.top().begin();
-  else tresit++;
+  TestsStack.top().tstlist.push_back(res_tst);
+  if (TestsStack.top().tstlist.size() == 1) tresit_ = TestsStack.top().tstlist.begin();
+  else tresit_++;
   const char * npr = (restst) ? "if-T> " : "if-F> ";
   SetCurrentPrompt(npr);
@@ -1717,21 +1723,19 @@
 
   
-/* --Methode-- */
-int Commander::EvalRPNExpr(vector<string> & args, string & line)
-{
-  // A virer - Reza 15/03/2004 
-  return(0);
-}
-
-/* --Methode-- */
-void Commander::PushStack(vector<string>& args)
-{
-  // We push the argument list (args) on the stack
-  ArgsStack.push(args);
+
+/* --Methode-- */
+void Commander::PushStack(vector<string>* pargs)
+{
+  // We push the argument list (args) on the stack if not NULL
+  if (pargs != NULL) ArgsStack.push(*pargs);
   // We push also CommanderBloc and testresult on the stack
   CmdBlks.push(NULL);
-  list<char> xtx;
-  TestsStack.push(xtx);
-
+  if (TestsStack.size()>0) {
+    TestsStack.top().tstresit=tresit_;
+    TestsStack.top().tstcurres=curtestresult_;
+  }
+  TstStatus tstat;  
+  tstat.tstcurres=curtestresult_;
+  TestsStack.push(tstat);
 }
 
@@ -1749,4 +1753,6 @@
   CmdBlks.pop();
   TestsStack.pop();
+  tresit_=TestsStack.top().tstresit;
+  curtestresult_=TestsStack.top().tstcurres;
 }
 
