Index: trunk/SophyaPI/PIext/piacmd.cc
===================================================================
--- trunk/SophyaPI/PIext/piacmd.cc	(revision 1562)
+++ trunk/SophyaPI/PIext/piacmd.cc	(revision 1565)
@@ -227,5 +227,5 @@
 if (typ == BT_ForeachList)   // foreach string loop
   for(k=0; k<strlist.size(); k++) {
-    cmd = "set " + varname + " " + strlist[k];
+    cmd = "set " + varname + " '" + strlist[k] + "'";
     piacmd->Interpret(cmd);
     for(kj=0; kj<bloclineid.size(); kj++) {
@@ -288,6 +288,4 @@
 curblk = NULL;
 felevel = 0;
-bloccxx = false;
-bloctest = false;
 mulinecmd = "";
 mulinefg = false;
@@ -314,4 +312,9 @@
 usage += "  > for varname f1:f2[:df]      # Float loop  \n";
 usage += "  > end                         # end loops \n"; 
+usage += "  > if test then  # Conditional test : a == != < > <= >= b \n";
+usage += "  > else          # Conditional  \n";
+usage += "  > endif         # End of conditional if bloc \n"; 
+usage += "  > break         # Delete (clears) all test and loop blocs \n";
+usage += "  > return        # Stops command execution from a file \n";
 usage += "  > listvars      # List of variable names and values \n";
 usage += "  > listalias     # List of alias names and values \n";
@@ -553,4 +556,16 @@
 }
 
+if (kw == "break") {
+  PIACmdBloc* curb = curblk;
+  while (curb) {
+    PIACmdBloc* dblk = curb;
+    curb = curb->Parent();
+    delete dblk;
+  }
+  testresult.clear();
+  return(0);
+}
+else if (kw == "return")  return(77777);
+
 // On verifie si nous sommes dans un bloc (for , foreach)
 if (curblk != NULL)  { // On est dans un bloc
@@ -570,15 +585,60 @@
   return(0);
 }
+else if (kw == "end") {
+  cerr << "PIACmd::Interpret()/syntax error - end outside for/foreach bloc \n"
+       << "line: " << s << endl;
+  return(1);  
+}
 
 // Sommes-nous dans un bloc de test if then else 
 if (testresult.size() > 0) {  // Nous sommes ds un bloc if 
-  if (kw == "endif") {
-    list<bool>::iterator dbit = tresit;
+  if (kw == "else") {
+    if ((*tresit) & 2) {
+      cerr << "PIACmd::Interpret()/syntax error - multiple else in if bloc \n"
+	   << "line: " << s << endl;
+      return(1);
+    }
+    else { 
+      char * npr = ((*tresit)&1) ? "else-F> " : "else-T> ";
+      mImgApp->GetConsole()->SetPrompt(npr);
+      (*tresit) |= 2;
+      return(0);
+    }
+  }
+  else if (kw == "endif") {
+    list<char>::iterator dbit = tresit;
     tresit--;
     testresult.erase(dbit);
+    char * npr = "Cmd> ";
+    if (testresult.size() > 1) {
+      if (!((*tresit)&2)) 
+	npr = ((*tresit)&1) ? "if-T> " : "if-F> ";
+      else 
+	npr = ((*tresit)&1) ? "else-F> " : "else-T> ";
+    }
+    mImgApp->GetConsole()->SetPrompt(npr);
     return(0);
   }
-}
-if ((testresult.size() > 0) && !(*tresit)) return(0);
+} 
+else if ((kw == "else") || (kw == "endif")) {
+  cerr << "PIACmd::Interpret()/syntax error - else,endif outside if bloc \n"
+       << "line: " << s << endl;
+  return(1);  
+}
+
+bool fgcont = true;
+if (testresult.size() > 0) { // Resultat de if ou else
+  list<char>::iterator it;
+  for(it=testresult.begin(); it!=testresult.end(); it++) {
+    // Si on n'est pas ds le else et le if est faux
+    if ( !((*it)&2) && !((*it)&1) )  fgcont = false;
+    // Si on est ds else et le if etait vrai !
+    if ( ((*it)&2) && ((*it)&1) )  fgcont = false;
+    if (!fgcont)  break;
+  }
+} 
+
+if ((!fgcont) && (kw != "if"))  return(0);
+
 
 // Nous ne sommes donc pas dans un bloc ....  Substitution de variables
@@ -622,5 +682,5 @@
     q = toks.find(toks[p],p+1);
     if (q>=l)  { 
-      cerr << "Syntax Error - Unbalenced quotes " << toks[p] << '.' << endl;
+      cerr << "PIACmd::Interpret()/Syntax Error - Unbalenced quotes " << toks[p] << '.' << endl;
       return(2);
     }
@@ -640,7 +700,7 @@
   PIACmdBloc* bloc = new PIACmdBloc(this, curblk, kw, tokens);
   if (!bloc->CheckOK()) {
-    cerr << "for/foreach syntax Error ! " << endl;
+    cerr << "PIACmd::Interpret() for/foreach syntax Error ! " << endl;
     delete bloc;
-    return(0);
+    return(1);
     }
   felevel++;
@@ -651,10 +711,19 @@
   return(0);
   }
-else if (kw == "if") {  // Un test 
-  bool res_tst = EvaluateTest(tokens);
+else if (kw == "if") {  // Un test if
+  bool restst = true;
+  int rct = EvaluateTest(tokens, s, restst);
+  if (rct) {
+    cerr << "PIACmd::Interpret() if syntax Error ! " << endl;
+    return(1);
+  }
+  char res_tst = (restst) ? 1 : 0;
   testresult.push_back(res_tst);
   if (testresult.size() == 1) tresit = testresult.begin();
   else tresit++;
-}
+  char * npr = (restst) ? "if-T> " : "if-F> ";
+  mImgApp->GetConsole()->SetPrompt(npr);
+}
+//  Execution de commandes 
 else rc = ExecuteCommandLine(kw, tokens, toks);
 return(rc);
@@ -745,11 +814,20 @@
 
 /* --Methode-- */
-bool PIACmd::EvaluateTest(vector<string> & args)
-{
-  if (args.size() < 2) {
-    cerr << " PIACmd::EvaluateTest()/Warning - args.size() < 2 " << endl;
-    return true;
-  }
-  else return(args[0] == args[1]);
+int PIACmd::EvaluateTest(vector<string> & args, string & line, bool & res)
+{
+  res = true;
+  if ((args.size() < 4) || (args[3] != "then")) return(1);
+  if (args[1] == "==") res = (args[0] == args[2]);
+  else if (args[1] == "!=") res = (args[0] != args[2]);
+  else if (args[1] == "<") 
+    res = (atof(args[0].c_str()) < atof(args[2].c_str()));
+  else if (args[1] == ">") 
+    res = (atof(args[0].c_str()) > atof(args[2].c_str()));
+  else if (args[1] == "<=") 
+    res = (atof(args[0].c_str()) <= atof(args[2].c_str()));
+  else if (args[1] == ">=") 
+    res = (atof(args[0].c_str()) >= atof(args[2].c_str()));
+  else return(2);
+  return(0);
 }
 
@@ -1007,5 +1085,5 @@
   line_buff[strlen(line_buff)-1] = '\0';   /*  LF/CR de la fin */
   string line(line_buff);
-  Interpret(line);
+  if (Interpret(line) == 77777) break;
   }
 histon = ohv; 
Index: trunk/SophyaPI/PIext/piacmd.h
===================================================================
--- trunk/SophyaPI/PIext/piacmd.h	(revision 1562)
+++ trunk/SophyaPI/PIext/piacmd.h	(revision 1565)
@@ -104,5 +104,6 @@
 
   int           SubstituteVars(string & s, string & s2);  
-  bool	        EvaluateTest(vector<string> & args);
+  int	        EvaluateTest(vector<string> & args, 
+			     string & line, bool & res);
 
   NamedObjMgr* mObjMgr;
@@ -138,9 +139,6 @@
   PIACmdBloc * curblk;  // Bloc de commande courant (foreach, ...)
   int felevel;          // foreah level 
-  list<bool> testresult;    // Resultat des test if
-  list<bool>::iterator tresit;      // Test courant
-  bool bloctest;            // On est ds un bloc test
-  bool bloccxx;             // On est ds un bloc code C++
-  string codecxx;           // Bloc de code C++
+  list<char> testresult;    // Resultat des test if
+  list<char>::iterator tresit;       // Test courant
   bool mulinefg;            // Bloc multi-lignes (ligne suite)
   string mulinecmd;         // Commande multi-lignes
Index: trunk/SophyaPI/PIext/piaversion.h
===================================================================
--- trunk/SophyaPI/PIext/piaversion.h	(revision 1562)
+++ trunk/SophyaPI/PIext/piaversion.h	(revision 1565)
@@ -2,5 +2,5 @@
 #define PIAPPVERSION_H_SEEN
 
-#define PIAPP_VERSIONNUMBER  3.02
+#define PIAPP_VERSIONNUMBER  3.20
 
 #endif
