]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkInterpreter.cxx
Fixed :
[bbtk.git] / kernel / src / bbtkInterpreter.cxx
index 2840b1223a038ab5e17bc550f511d0bb817fe37a..e4d872b48847931b92969197fafa8b179462c350 100644 (file)
@@ -3,8 +3,8 @@
   Program:   bbtk
   Module:    $RCSfile: bbtkInterpreter.cxx,v $ $
   Language:  C++
-  Date:      $Date: 2008/03/25 15:47:54 $
-  Version:   $Revision: 1.54 $
+  Date:      $Date: 2008/03/26 08:27:19 $
+  Version:   $Revision: 1.55 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -655,8 +655,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
         break;
 
       case cDelete :
-        // TO DO !!
-        // mExecuter->Remove(words[1]);
+       mExecuter->Destroy(words[1]);
         break;
 
       case cConnect :
@@ -693,7 +692,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
         break;
 
       case cPrint :
-        Print(words[1]); /// \todo use generate command 
+        mExecuter->Print(words[1]);
         break;
         
       case cExec :
@@ -702,7 +701,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
         else if (words[1]=="unfreeze") 
           mExecuter->SetNoExecMode(false);
         else
-          mExecuter->Update(words[1]);
+          mExecuter->Execute(words[1]);
         break;
 
       case cInput :
@@ -748,12 +747,12 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
       case cMessage : 
         if (words.size()<3)
         {
-           bbtk::MessageManager::PrintInfo();
+         mExecuter->HelpMessages();
         }
         else
         {
-           sscanf(words[2].c_str(),"%d",&level);
-           bbtk::MessageManager::SetMessageLevel(words[1],level);
+         sscanf(words[2].c_str(),"%d",&level);
+          mExecuter->SetMessageLevel(words[1],level);
         }
         break;
 
@@ -786,18 +785,18 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
         break;
 
       case cLoad:
-        GetExecuter()->GetFactory()->LoadPackage(words[1]);
+        GetExecuter()->LoadPackage(words[1]);
         break;
 
       case cUnload:
-        GetExecuter()->GetFactory()->UnLoadPackage(words[1]);
+        GetExecuter()->UnLoadPackage(words[1]);
         break;
 
       case cQuit :
         delete mExecuter;
         throw QuitException();
         break;
-
+       /* obsolete
       case cWorkspace :
         if (words.size() == 2) 
         {
@@ -809,7 +808,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
            mExecuter->SetWorkspaceName(words[2]);
         }
         break;
-        
+        */
       default:
         bbtkInternalError("should not reach here !!!");
    }
@@ -859,27 +858,13 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
   //=======================================================================
 
 
-  //=======================================================================
-  // Replaces substrings "\\n" by a real carriage return "\n"
-  void SubsBackslashN ( std::string& s )
-  {
-    std::string ss("\\n");
-    std::string::size_type pos = 0;
-    pos = s.find(ss,0);
-    char* cr = "\n";
-    while ( pos != std::string::npos )
-    {
-      s.replace(pos,2,cr,1);
-      pos = s.find(ss, pos-1);
-    }
-  }
-  //=======================================================================
-
 
   //=======================================================================
   /**
    *
    */
+  /*
   void Interpreter::Print( const std::string& str)
   {
     if (mExecuter->GetNoExecMode()) return;
@@ -942,12 +927,13 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
      for (i= chains.begin(); i!=chains.end(); ++i) 
      {
        //  bbtkMessage("Echo",1,*i);
-       SubsBackslashN(*i);
+       Utilities::SubsBackslashN(*i);
        std::cout << *i;
      }
      std::cout << std::endl;
      bbtkDebugDecTab("Interpreter",9);
  }
+*/
 
   //=======================================================================
   /**
@@ -982,7 +968,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     bbtkMessage("Interpreter",1,
         "look for : [" << name
         << "]" << std::endl);
-    script_paths = ConfigurationFile::GetInstance().Get_bbs_paths();
+
 
     std::string upath;
     pkgname = Utilities::ExtractScriptName(name,upath);
@@ -993,102 +979,142 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     bool fullnameGiven = false; 
     bool foundFile     = false;
 
-    if(pkgname == "*") // =========================================== load all boxes (e.g. std/boxes/*)
-    {
-      int nbBssFiles;
-
-      std::stringstream* stream = new std::stringstream;
-      //if (upath.size()!=0) // avoid troubles for "*"
-      
-      if (upath[0]=='/' || upath[1] == ':' ) // ==== absolute name, load all .bbs files
+    // ==== "*" provided : load all scripts in given path 
+    // relative (e.g. std/boxes/*) or absolute 
+    if (pkgname == "*") 
       {
-        int nbFiles = Utilities::Explore(upath, false, Filenames);
-        nbBssFiles = 0;
-        for (std::vector<std::string>::iterator i = Filenames.begin(); i!= Filenames.end(); ++i)
-        {
-           int lgr = (*i).size();
-          if (lgr < 5)
-             continue;  // ignore non .bbs file
-           if ((*i).substr(lgr-4, 4) != ".bbs")
-             continue;
-
-printf("EED Interpreter::SwitchToFile flag01 %s \n", (*i).c_str() );
-          (*stream) << "include \"" << *i << "\"\n";
-
-           nbBssFiles++;
-        } // for vector
-               if (nbBssFiles==0){
-           bbtkMessage("Interpreter",2,
-                      "WARNING : No '.bbs' file found in [" 
-                      << upath << "]" << std::endl);
-               } else {
-            SwitchToStream(stream);
-               }
-        return;
-      }  // if upath
-
-      std::string path;
-      std::vector<std::string>::iterator i;
-      std::string fullDirectoryName;
-      for (i=script_paths.begin();i!=script_paths.end();i++)// ==== relative name, iterate + load all .bbs files
-      {
-        path = *i;
-
-       // we *really* want '.' to be the current working directory
-        if (path == ".") {
-          char buf[2048]; // for getcwd
-          char * currentDir = getcwd(buf, 2048);
-          std::string cwd(currentDir);
-          path = currentDir;
-        } // if path
-
-        fullDirectoryName = Utilities::MakePkgnameFromPath(path, upath, false);
-
-        // without last slash "\"
-        std::string fullDirectoryNameClean = fullDirectoryName.substr(0,fullDirectoryName.size()-1);
-
-      // Check if library exists
-        if ( ! Utilities::IsDirectory( fullDirectoryNameClean ) )
-        {
-        // The following is *NOT* a debug time message :
-        // It's a user intended message.
-        // Please don't remove it.
-             bbtkMessage("Interpreter",1,"   [" <<fullDirectoryName 
-                     <<"] : doesn't exist" <<std::endl);
-          continue;  // try next path
-        } // if IsDirectory
-        foundFile = true;
-
-        Filenames.clear();
-        int nbFiles = Utilities::Explore(fullDirectoryName, false, Filenames);
+       int nbBssFiles;
+       
+       std::stringstream* stream = new std::stringstream;
+       //if (upath.size()!=0) // avoid troubles for "*"
+       
+       // ==== no path provided : look in root bbs path
+       if (upath.size()==0)
+         {
+           //      bbtkMessage("Interpreter",1,
+           script_paths.push_back(  ConfigurationFile::GetInstance().Get_root_bbs_path() );
+         }
+       // ==== absolute path provided 
+       else if (upath[0]=='/' || upath[1] == ':' ) 
+         {
+           script_paths.push_back(upath);
+         }
+       // ==== relative path provided : search all bbs path appended with 
+       // the relative path provided
+       else
+         {    
+            std::vector<std::string>::const_iterator i;
+            for (i=ConfigurationFile::GetInstance().Get_bbs_paths().begin();
+                 i!=ConfigurationFile::GetInstance().Get_bbs_paths().end();
+                 i++)
+              {
+                std::string full_path(*i);
+                full_path += ConfigurationFile::GetInstance().Get_file_separator();
+                full_path += upath;
+                script_paths.push_back(full_path);
+              }
+         } 
+       // === search paths list complete : now explore it
+       bbtkMessage("Interpreter",1,
+                   "'*' provided. search paths : " << std::endl);
+       /*
+       int nbFiles = Utilities::Explore(upath, false, Filenames);
+           nbBssFiles = 0;
+           for (std::vector<std::string>::iterator i = Filenames.begin(); 
+                i!= Filenames.end(); ++i)
+             {
+               int lgr = (*i).size();
+               if (lgr < 5)
+                 continue;  // ignore non .bbs file
+               if ((*i).substr(lgr-4, 4) != ".bbs")
+                 continue;
+               //printf("EED Interpreter::SwitchToFile flag01 %s \n", (*i).c_str() );
+               (*stream) << "include \"" << *i << "\"\n";
+               
+               nbBssFiles++;
+             } // for vector
+           if (nbBssFiles==0)
+             {
+               bbtkMessage("Interpreter",2,
+                           "WARNING : No '.bbs' file found in [" 
+                           << upath << "]" << std::endl);
+             } 
+           else 
+             {
+               SwitchToStream(stream);
+             }
+           return;
+         }  // if upath
+       */
+       std::string path;
+       std::vector<std::string>::iterator i;
+       std::string fullDirectoryName;
+       for (i=script_paths.begin();i!=script_paths.end();i++)// ==== relative name, iterate + load all .bbs files
+         {
+           path = *i;
+           
+           bbtkMessage("Interpreter",1,
+                       "----> '" << path << "'" << std::endl);
+           // we *really* want '.' to be the current working directory
+           if (path == ".") {
+             char buf[2048]; // for getcwd
+             char * currentDir = getcwd(buf, 2048);
+             std::string cwd(currentDir);
+             path = currentDir;
+           } // if path
+           
+           fullDirectoryName = Utilities::MakePkgnameFromPath(path, upath, false);
+           
+           // without last slash "\"
+           std::string fullDirectoryNameClean = fullDirectoryName.substr(0,fullDirectoryName.size()-1);
+           
+           // Check if directory exists
+           if ( ! Utilities::IsDirectory( fullDirectoryNameClean ) )
+             {
+               // The following is *NOT* a debug time message :
+               // It's a user intended message.
+               // Please don't remove it.
+               bbtkMessage("Interpreter",1,"   [" <<fullDirectoryName 
+                           <<"] : doesn't exist" <<std::endl);
+               continue;  // try next path
+             } // if IsDirectory
+           foundFile = true;
+           
+           Filenames.clear();
+           int nbFiles = Utilities::Explore(fullDirectoryName, false, Filenames);
+           
+           nbBssFiles = 0;
+           for (std::vector<std::string>::iterator i = Filenames.begin(); i!= Filenames.end(); ++i)
+             {
+               int lgr = (*i).size();
+               if (lgr < 5)
+                 continue;  // ignore non .bbs file
+               if ((*i).substr(lgr-4, 4) != ".bbs")
+                 continue;
+               
+               //              printf("EED Interpreter::SwitchToFile flag02 %s \n", (*i).c_str() );
+               (*stream) << "include \"" << *i << "\"\n";
+               
+               nbBssFiles++;
+             } // for vector
+           if (nbBssFiles==0)
+             {
+               bbtkMessage("Interpreter",1,
+                           "WARNING : No '.bbs' file found in [" 
+                           << fullDirectoryName << "]" << std::endl);
+             } 
+           else 
+             {
+               SwitchToStream(stream);
+             }
+           
+           //break; // a directory was found; we stop iterating
+           // LG : No! We want all files included !
+         } // for vector
+       return;
+      }  
+    //=============== end pkgname=="*" ===========
 
-        nbBssFiles = 0;
-        for (std::vector<std::string>::iterator i = Filenames.begin(); i!= Filenames.end(); ++i)
-        {
-           int lgr = (*i).size();
-          if (lgr < 5)
-             continue;  // ignore non .bbs file
-           if ((*i).substr(lgr-4, 4) != ".bbs")
-             continue;
-
-printf("EED Interpreter::SwitchToFile flag02 %s \n", (*i).c_str() );
-           (*stream) << "include \"" << *i << "\"\n";
-
-           nbBssFiles++;
-        } // for vector
-               if (nbBssFiles==0){
-           bbtkMessage("Interpreter",1,
-                     "WARNING : No '.bbs' file found in [" 
-                     << fullDirectoryName << "]" << std::endl);
-               } else {
-           SwitchToStream(stream);
-               }
-
-        //break; // a directory was found; we stop iterating
-       // LG : No! We want all files included !
-       } // for vector
-       return;
-    }  // if *
 
     // if name starts with a / or a . or contains : user is assumed to have passed a relative/absolute name
     // (not only a plain script name)
@@ -1127,61 +1153,64 @@ printf("EED Interpreter::SwitchToFile flag02 %s \n", (*i).c_str() );
     } // endif l != 0
   }
   else
-      // =============================================================== iterate on the paths
-  {
+    // =============================== iterate on the paths
+    {
+      script_paths = ConfigurationFile::GetInstance().Get_bbs_paths();
       std::string path;
       std::vector<std::string>::iterator i;
       for (i=script_paths.begin();i!=script_paths.end();++i)
-      {
-        path = *i;
-       // we *really* want '.' to be the current working directory
-        if (path == ".") {
-          char buf[2048]; // for getcwd
-          char * currentDir = getcwd(buf, 2048);
-          std::string cwd(currentDir);
-          path = currentDir;
-        }
-
-       fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true);
-
-      // Check if library exists
-        if ( ! Utilities::FileExists(fullPathScriptName) )
-        {
-        // The following is *NOT* a debug time message :
-        // It's a user intended message.
-        // Please don't remove it.
-           bbtkMessage("Interpreter",2,
-                       "   [" <<fullPathScriptName <<"] : doesn't exist" 
-                       <<std::endl);
-          continue;  // try next path
-        }
-           bbtkMessage("Interpreter",2,
-                   "   [" <<fullPathScriptName 
-                   <<"] : found" <<std::endl);
-        foundFile = true;
-        break; // a script was found; we stop iterating
-
-      } //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
+       {
+         path = *i;
+         // we *really* want '.' to be the current working directory
+         if (path == ".") {
+           char buf[2048]; // for getcwd
+           char * currentDir = getcwd(buf, 2048);
+           std::string cwd(currentDir);
+           path = currentDir;
+         }
+         
+         fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true);
+         
+         // Check if library exists
+         if ( ! Utilities::FileExists(fullPathScriptName) )
+           {
+             // The following is *NOT* a debug time message :
+             // It's a user intended message.
+             // Please don't remove it.
+             bbtkMessage("Interpreter",2,
+                         "   [" <<fullPathScriptName <<"] : doesn't exist" 
+                         <<std::endl);
+             continue;  // try next path
+           }
+         bbtkMessage("Interpreter",2,
+                     "   [" <<fullPathScriptName 
+                     <<"] : found" <<std::endl);
+         foundFile = true;
+         break; // a script was found; we stop iterating
+
+       } //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
     }
-
+    
     if (!foundFile)
-    {
-       if (fullnameGiven)
-         if(fullPathScriptName == "")
+      {
+       if (fullnameGiven)
+         if(fullPathScriptName == "")
             bbtkError("Path ["<<upath<<"] doesn't exist");
-         else
+         else
             bbtkError("Script ["<<fullPathScriptName<<"] not found");
-       else
+       else
           bbtkError("No ["<<pkgname<<".bbs] script found");
-       return;
-    }
+       return;
+      }
     else
       LoadScript(fullPathScriptName,name);
-
+    
     return;
   }
+  //=======================================================================
 
 
+  //=======================================================================
 void Interpreter::SwitchToStream( std::stringstream* stream )
 {
     mFile.push_back(stream);
@@ -1197,6 +1226,7 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
     mIncludeFileName.push_back(buffer_name.str());
     mLine.push_back(0);
 }
+  //=======================================================================
 
   //=======================================================================