Index: trunk/SophyaLib/NTools/dvlist.cc
===================================================================
--- trunk/SophyaLib/NTools/dvlist.cc	(revision 515)
+++ trunk/SophyaLib/NTools/dvlist.cc	(revision 718)
@@ -27,5 +27,5 @@
 //	en particulier destinés à être inclus dans d'autres objets 
 //	PPersist plus complexes. La classe DVList gère des 
-//	variables de type entier ("int_4"), réél double précision ("double")
+//	variables de type entier ("int_8"), réél double précision ("r_8")
 //	et de type chaine de caracteres ("string, char*", maxi 30 caracteres ).
 //	Une classe intermédiaire (*MuTyV*) est utilisée pour représenter une 
@@ -117,14 +117,14 @@
 for(it = dvl.mvlist.begin(); it != dvl.mvlist.end(); it++)
   {
-  switch ((*it).second.typ) 
+  switch ((*it).second.elval.typ) 
     {
     case 'I' :
-      SetI((*it).first, (*it).second.mtv.iv);
+      SetI((*it).first, (*it).second.elval.mtv.iv);
       break;
     case 'D' : 
-      SetD((*it).first, (*it).second.mtv.dv);
+      SetD((*it).first, (*it).second.elval.mtv.dv);
       break;
     case 'S' : 
-      SetS((*it).first, (*it).second.mtv.strv);
+      SetS((*it).first, (*it).second.elval.mtv.strv);
       break;
     default :
@@ -138,28 +138,30 @@
 
 //++
-// int_4   GetI(string const& key, int_4  def=-1)
-// double  GetD(string const& key, double def=-9.e19)
+// int_8   GetI(string const& key, int_8  def=-1)
+// r_8     GetD(string const& key, r_8 def=-9.e19)
 // string  GetS(string const& key, char* def="")
 //	Retourne la valeur de la variable de nom "key" et de type entier, réél, 
 //	chaine de caracteres.
 //	Si la variable n'existe pas, la valeur par défaut "def" est renvoyée.
-//--
-
-/* --Methode-- */
-int_4       DVList::GetI(string const& key, int_4 def)
+// string  GetComment(string const& key)
+//	Retourne le commentaire associé à la variable de nom "key".
+//--
+
+/* --Methode-- */
+int_8       DVList::GetI(string const& key, int_8 def)
 {
 ValList::iterator it = mvlist.find(key);
 if (it == mvlist.end())  return(def);
-if ( (*it).second.typ != 'I') return(def);
-return((*it).second.mtv.iv);
-}
-
-/* --Methode-- */
-double      DVList::GetD(string const& key, double def)
+if ( (*it).second.elval.typ != 'I') return(def);
+return((*it).second.elval.mtv.iv);
+}
+
+/* --Methode-- */
+r_8      DVList::GetD(string const& key, r_8 def)
 {
 ValList::iterator it = mvlist.find(key);
 if (it == mvlist.end())  return(def);
-if ( (*it).second.typ != 'D') return(def);
-return((*it).second.mtv.dv);
+if ( (*it).second.elval.typ != 'D') return(def);
+return((*it).second.elval.mtv.dv);
 }
 
@@ -169,28 +171,42 @@
 ValList::iterator it = mvlist.find(key);
 if (it == mvlist.end())  return(def);
-if ( (*it).second.typ != 'S') return(def);
-return((*it).second.mtv.strv);
-}
-
-//++
-// void  SetI(string const& key, int_4  val)
-// void  SetD(string const& key, double val)
+if ( (*it).second.elval.typ != 'S') return(def);
+return((*it).second.elval.mtv.strv);
+}
+
+/* --Methode-- */
+string      DVList::GetComment(string const& key)
+{
+ValList::iterator it = mvlist.find(key);
+if (it == mvlist.end())  return("");
+return((*it).second.elcomm);
+}
+
+//++
+// void  SetI(string const& key, int_8  val)
+// void  SetD(string const& key, r_8 val)
 // void  SetS(string const& key, char*  val)
 // void  SetS(string const& key, string val)
 //	Crée la variable de nom "key", de type entier, double, string et 
 //	lui attribue la valeur "val". Si une variable du même nom existe, 
-//	sa valeur et eventuellement son type sont modifiés.  
-//--
-
-/* --Methode-- */
-void        DVList::SetI(string const& key, int_4 val)
-{
-Get(key) = (int_4)val;
-}
-
-/* --Methode-- */
-void        DVList::SetD(string const& key, double val)
-{
-Get(key) = (double)val;
+//	sa valeur et eventuellement son type sont modifiés.  Les noms de
+//	variables ne doivent pas contenir de caractères spéciaux, 
+//	en particulier pas de CR/LF.
+// void  SetComment(string const& key, string const& comm)
+//	Modifie le commentaire associé à la variable de nom "key", si
+//	celle-ci existe. Le texte du commentaire ne doit pas contenir
+//	de caractères spéciaux, et en particulier pas de CR/LF. 
+//--
+
+/* --Methode-- */
+void        DVList::SetI(string const& key, int_8 val)
+{
+Get(key) = (int_8)val;
+}
+
+/* --Methode-- */
+void        DVList::SetD(string const& key, r_8 val)
+{
+Get(key) = (r_8)val;
 }
 
@@ -209,4 +225,11 @@
 }
 
+/* --Methode-- */
+void        DVList::SetComment(string const& key, string const& comm)
+{
+ValList::iterator it = mvlist.find(key);
+if (it == mvlist.end())  return;
+(*it).second.elcomm = comm;
+}
 
 //++
@@ -228,8 +251,9 @@
 if ( (l < 1) || (key.find_first_of(" ") < l) )  return(ddvdum);
 ValList::iterator it = mvlist.find(key);
-if (it == mvlist.end()) mvlist[key] = (int_4) 0;  // $CHECK$ EA. Ambigu si pas de cast...
+dvlElement xxx = {(int_8)0 , ""};
+if (it == mvlist.end()) mvlist[key] = xxx;  
 it = mvlist.find(key);
 if (it == mvlist.end()) return(ddvdum); 
-else return((*it).second);
+else return((*it).second.elval);
 }
 
@@ -256,18 +280,21 @@
 {
 os << "DVList::Print() - NVar= " << (int)mvlist.size() << "\n";
-os << "Comment: " << comment << "\n";
-char buff[128];
+if (comment.length() > 0)  os << comment << endl;
+char buff[256];
 ValList::const_iterator it;
 for(it = mvlist.begin(); it != mvlist.end(); it++)  {
-  switch ((*it).second.typ) 
+  switch ((*it).second.elval.typ) 
     {
     case 'I' :
-      sprintf(buff, "%s = %d (int) \n", (*it).first.substr(0,64).c_str(), (*it).second.mtv.iv );
+      sprintf(buff, "%s = %d (int) %s\n", (*it).first.substr(0,64).c_str(), 
+	      (*it).second.elval.mtv.iv, (*it).second.elcomm.substr(0,128).c_str());
       break;
     case 'D' : 
-      sprintf(buff, "%s = %.20g (double) \n", (*it).first.substr(0,64).c_str(), (*it).second.mtv.dv );
+      sprintf(buff, "%s = %.20g (double) %s\n", (*it).first.substr(0,64).c_str(), 
+	      (*it).second.elval.mtv.dv, (*it).second.elcomm.substr(0,128).c_str());
       break;
     case 'S' : 
-      sprintf(buff, "%s = %s (string) \n", (*it).first.substr(0,64).c_str(), (*it).second.mtv.strv );
+      sprintf(buff, "%s = %s (string) %s\n", (*it).first.substr(0,64).c_str(), 
+	      (*it).second.elval.mtv.strv, (*it).second.elcomm.substr(0,128).c_str());
       break;
     default :
@@ -287,5 +314,5 @@
 //|	mvu = 66.6;        // et double (= 66.6) maintenant ...   
 //|	MuTyV mvi(14);     // On construit une variable entiere = 14
-//|	float x = mvi;     // x vaut 14.0
+//|	r_4 x = mvi;     // x vaut 14.0
 //|	MuTyV mvd(44.4);   // Variable double = 44.4
 //|	int k = mvd;       // k vaut 44  
@@ -305,7 +332,7 @@
 //|	DVList dvlr("dvlist.ppf");
 //|	int k = dvlr["toto"] ;     //  k = 14
-//|	double b = dvlr["titi"] ;  //  b = 25.5
+//|	r_8 b = dvlr["titi"] ;  //  b = 25.5
 //|	string s =  dvlr["tata"] ; //  s = "Bonjour, Ca va ?"
-//|	float c = dvlr["Hello"] ;  //  c = 77.77
+//|	r_4 c = dvlr["Hello"] ;  //  c = 77.77
 //|	int l =  dvlr["Hello"] ;   //  l = 77
 //|	int m =  dvlr["hello"] ;   //  m = 88
@@ -321,8 +348,8 @@
 void        ObjFileIO<DVList>::WriteSelf(POutPersist& s) const
 {
-char buf[320];
+char buf[512];
 
 int lc = dobj->Comment().length();
-if (lc > 319) lc = 319;
+if (lc > 511) lc = 511;
 if (lc > 0) {
   sprintf(buf,"Comment: ( %6d ) ", lc); 
@@ -333,22 +360,26 @@
 DVList::ValList::const_iterator it;
 for(it = dobj->Begin(); it != dobj->End(); it++)  {
-  switch ((*it).second.typ) 
-    {
+  switch ((*it).second.elval.typ) {
     case 'I' :
-      sprintf(buf,"I %s %d", (*it).first.substr(0,64).c_str(), (*it).second.mtv.iv );
+      sprintf(buf,"I %s %d", (*it).first.substr(0,64).c_str(), (*it).second.elval.mtv.iv );
       s.PutLine(buf); 
       break;
     case 'D' : 
-      sprintf(buf,"D %s %.20g", (*it).first.substr(0,64).c_str(), (*it).second.mtv.dv );
+      sprintf(buf,"D %s %.20g", (*it).first.substr(0,64).c_str(), (*it).second.elval.mtv.dv );
       s.PutLine(buf); 
       break;
     case 'S' : 
-      sprintf(buf,"S %s %s", (*it).first.substr(0,64).c_str(), (*it).second.mtv.strv );
+      sprintf(buf,"S %s %s", (*it).first.substr(0,64).c_str(), (*it).second.elval.mtv.strv );
       s.PutLine(buf); 
       break;
     default :
       break;
-    }
-  }
+  }
+// Ecriture eventuelle du commentaire associe
+  if ((*it).second.elcomm.length() > 0) {
+    sprintf(buf,"# %s", (*it).second.elcomm.substr(0,256).c_str());
+    s.PutLine(buf); 
+  }
+}
 
 s.PutLine("ZZZZZ--End-of-Varible-List------");
@@ -358,18 +389,18 @@
 void        ObjFileIO<DVList>::ReadSelf(PInPersist& s)
 {
-char buf[320];
-int_4 j,iv;
-double dv;
+char buf[512];
+int_8 j,iv;
+r_8 dv;
 bool ok=true;
 buf[0] = '\0';
 dobj->Clear();
 
-s.GetLine(buf, 319);  // Pour lire les "------- "
+s.GetLine(buf, 511);  // Pour lire les "------- "
 if (buf[0] != '-') {  // Il y a un champ commentaire a lire 
   buf[18] ='\0';
   int lc = atoi(buf+11);
-  if (lc > 319)  { 
+  if (lc > 511)  { 
     cerr << "DVList::ReadSelf() Pb/Bug ??  CommentLength= " << lc << endl;
-    lc = 319;
+    lc = 511;
     }
   s.GetBytes(buf, lc);
@@ -378,22 +409,29 @@
   }
 
+string key="";
 while(ok) {
-  s.GetLine(buf, 319);
-  buf[319] = '\0';
+  s.GetLine(buf, 511);
+  buf[511] = '\0';
   if (strncmp(buf,"ZZZZZ",5) == 0)  { ok=false; break; }
+  if (buf[0] == '#') {
+    dobj->SetComment(key, buf+2);
+    continue;
+  }
   j = posc(buf+2, ' ')+2;
   buf[j] = '\0';
-  switch (buf[0])
-    {
+  switch (buf[0]) {
     case 'I' :
-      iv = (int_4)atol(buf+j+1);
-      dobj->SetI(buf+2, iv);
+      iv = (int_8)atol(buf+j+1);
+      key = buf+2;
+      dobj->SetI(key, iv);
       break;
     case 'D' :
       dv = atof(buf+j+1);
-      dobj->SetD(buf+2, dv);
+      key = buf+2;
+      dobj->SetD(key, dv);
       break;
     case 'S' :
-      dobj->SetS(buf+2, buf+j+1);
+      key = buf+2;
+      dobj->SetS(key, buf+j+1);
       break;
     default :
