Index: trunk/SophyaLib/SysTools/cexpre.cc
===================================================================
--- trunk/SophyaLib/SysTools/cexpre.cc	(revision 2592)
+++ trunk/SophyaLib/SysTools/cexpre.cc	(revision 2593)
@@ -6,4 +6,5 @@
 #include <stack>
 #include <math.h>
+#include "srandgen.h"
 
 namespace SOPHYA {
@@ -154,4 +155,5 @@
   virtual double Evaluate() const ;
   inline void AddArg(CExprBase * e);
+  inline int  GetMaxNArg() const { return _maxne; }
   virtual bool CheckE(string& errmsg) const; 
   virtual void Print(ostream& os) const;
@@ -166,4 +168,8 @@
 };
 
+// Les fonctions de generation de nombre aleatoire
+double _CE_rand01() { return drand01(); }
+double _CE_randpm1() { return drandpm1(); }
+double _CE_gaurand() { return GauRnd(0., 1.); }
 //---------------------------------------------------------
 CE_FuncExp::CE_FuncExp(string const & func)
@@ -193,4 +199,8 @@
   else if (func == "cosh") _f1 = cosh;
   else if (func == "tanh") _f1 = tanh;
+// Les fonctions aleatoires declaree plus haut 
+  else if (func == "rand01") _f0 = _CE_rand01;	
+  else if (func == "randpm1") _f0 = _CE_randpm1;	
+  else if (func == "gaurand") _f0 = _CE_gaurand;	
   else { 
     string errmsg = "CE_FuncExp::CE_FuncExp() - Uknown function " ;
@@ -219,8 +229,9 @@
 double CE_FuncExp::Evaluate() const 
 {
-  if ((_ne != _maxne) || (_maxne < 1) ) {
+  if ((_ne != _maxne) || (_maxne < 0) ) {
     throw CExprException("CE_FuncExp::Evaluate() - Wrong argument number ");
   }
-  if (_ne == 1) return _f1(_e[0]->Evaluate());
+  if (_ne == 0) return _f0();
+  else if (_ne == 1) return _f1(_e[0]->Evaluate());
   else if (_ne == 2) return _f2(_e[0]->Evaluate(), _e[1]->Evaluate());
   else if (_ne == 3) return _f3(_e[0]->Evaluate(), _e[1]->Evaluate(), 
@@ -327,12 +338,36 @@
   bool fgcont = true;
   bool checkok = true;
+  bool apperrmsg = true;
   //  cout << " DBG-ParseString off= " << off << " sex[off]= " << sex[off] 
   //	<< " extype= " << extype << endl;
   p = stop = off;  
   while ((p < len) && (fgcont) && (checkok) ) { 
-    //   cout << " DBG-2-ParseString p=" << p << " q=" << q << endl;
+    // cout << " DBG-2-ParseString p=" << p << " q=" << q << endl;
 
     cx = NULL;
+    // ------------------------------- Bretelle ------
+    // Il faut sauter les signes +/- qui se trouverait dans les
+    // exposants des nombres xxxe-yy xxxe+y : 0.4e-2 ...
+    // Les qques lignes sont une bretelle qui saute ces signes +/- (Reza, Aout 2004) 
+    // On verifie d'abord s'il y a un nombre valide au debut de la positions courante
+    char* lcc;
+    size_t pfn=0,psn;
+    bool numberok = false;
+    strtod(sex.c_str()+p, &lcc);
+    if (lcc != sex.c_str()+p) {  // Expression valide de double au debut 
+      numberok = true;           // de la position courante
+      pfn = lcc-sex.c_str();
+    }
+    // On cherche le 1er signe d'operateur - apres le nombre de debut 
     q = sex.find_first_of("+-*/(),",p);
+
+    while ( numberok && (q < len) && (q < pfn) && (q > p) && 
+            ((sex[q] == '+') || (sex[q] == '-')) ) {
+      psn = q+1; 
+      if (psn < len) q = sex.find_first_of("+-*/(),",psn);
+      else q = len+1;
+    }
+    //---- Fin de la Bretelle ---- pour sauter les signes +/- de l'exposant des nombres
+
     if (q < len) {  // operateur trouve
       opc = sex[q];  // signe operateur courant
@@ -344,5 +379,5 @@
 	  }
 	  else cx = ParseString(2, sex.substr(p,q-p), sex, q+1, stop, errmsg);
-	  if (!cx)  { checkok = false; p = stop+1; }
+	  if (!cx)  { checkok = false; p = stop+1; apperrmsg = false; }
 	  else { 
 	    if (osn == 1) {
@@ -387,14 +422,16 @@
 	  else cx = rx;
 	  
-	  if (!cx) {
+	  if (!cx && ( !fx || ( opc != ')' ) || 
+                       ( (fx && (fx->GetMaxNArg() > 0) && (opc == ')' ) ) ) ) ) {
 	    checkok = false; p = q;  fgcont = false; 
 	    errmsg = "CExpressionEvaluator::ParseString()/ Syntax Error - farg=NULL (BB)"; 
 	  }
 	  else {
-	    rx = Arrange_CE_BinExpStack(sbx, cx);
-	    if (extype == 2) {
-	      //	    cout << " DBG-ParseString-AddArg " << *(cx) << endl;
-	      fx->AddArg(rx);  rx = NULL;
-	    }
+	    if (cx) { rx = Arrange_CE_BinExpStack(sbx, cx);
+	      if (extype == 2) {
+	        //	    cout << " DBG-ParseString-AddArg " << *(cx) << endl;
+	        fx->AddArg(rx);  rx = NULL;
+	      }
+            }
 	    if (opc == ')') { // Signe de fin de traitement d'une portion d'expression
 	      if (extype == 2) { rx = fx; fx = NULL; }
@@ -475,7 +512,13 @@
       if (!rx)  errmsg += " !rx " ;
       errmsg += " (F)";
-    }
-    sprintf(buff,"\n CExprError... S=[%s]  (p=%ld , len=%ld)", sex.c_str(), (long)p,(long)len);
-    errmsg += buff;
+    }    
+
+    if (apperrmsg) {
+      if (p<len) 
+        sprintf(buff,"\n CExprError... %s <> %s ", sex.substr(0,p).c_str(), 
+	        sex.substr(p).c_str());
+      else  sprintf(buff,"\n CExprError... %s <<", sex.c_str());
+      errmsg += buff;
+    }
     if (rx) delete rx;
     rx = NULL;
