]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkInterpreter.cxx
BUG HTML in windows + Cast float int
[bbtk.git] / kernel / src / bbtkInterpreter.cxx
index 5b0c26e81faa4f9e18fe6f8c0ed279241de2b0e2..951c40db00b1831324f4edfaaedc523db8a6afde 100644 (file)
@@ -3,8 +3,8 @@
   Program:   bbtk
   Module:    $RCSfile: bbtkInterpreter.cxx,v $ $
   Language:  C++
-  Date:      $Date: 2008/02/06 10:53:02 $
-  Version:   $Revision: 1.28 $
+  Date:      $Date: 2008/02/21 07:30:20 $
+  Version:   $Revision: 1.36 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
 =========================================================================*/
 /**
  *  \file 
- *  \brief class Interpreter : 
+ *  \brief class Interpreter :
  */
 
-#include "bbtkInterpreter.h" 
+#include "bbtkInterpreter.h"
 #include "bbtkMessageManager.h"
 #include "bbtkConfigurationFile.h"
 #include "bbtkWxConsole.h"
 #include "bbtkUtilities.h"
 #include <sys/stat.h>
+#include <algorithm>
 #ifdef CMAKE_HAVE_TERMIOS_H
 #include <termios.h>
 #define BBTK_USE_TERMIOS_BASED_PROMPT
@@ -40,7 +41,7 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL;
 
  //=======================================================================
  /**
-   *  
+   *
    */
   Interpreter::Interpreter() 
     :
@@ -52,10 +53,12 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL;
  
     mGlobalInterpreter = this;
 
-    //    mFactory = new bbtk::Factory();
     mExecuter = new bbtk::Executer();
-    //mExecuter = new bbtk::Transcriptor("GeneratedProgram.txt");
-    //mExecuter->SetFactory(mFactory);
+    
+    // For the time being, comment out previous line, and
+    // uncomment next line to check Transcriptor
+
+   // mExecuter = new bbtk::Transcriptor("GeneratedProgram.txt");
 
     // Builds the commands dict
     CommandInfoType info;
@@ -441,18 +444,18 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
       case cNew :
         mExecuter->Create(words[1],words[2]);
         break;
-        
+
       case cDelete :
         // TO DO !!
         // mExecuter->Remove(words[1]);
         break;
-        
+
       case cConnect :
         Utilities::SplitAroundFirstDot(words[1],left,right);
         Utilities::SplitAroundFirstDot(words[2],left2,right2);      
         mExecuter->Connect(left,right,left2,right2);
         break;
-        
+
       case cPackage :
         mExecuter->BeginPackage(words[1]);
         break;
@@ -460,7 +463,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
       case cEndPackage :
         mExecuter->EndPackage();
         break;
-        
+
       case cDefine :
         if (mFileName.size()>0) 
         {
@@ -470,16 +473,16 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
         {
            mExecuter->Define(words[1],"",filename);
         }
-        else 
+        else
         {
            mExecuter->Define(words[1],words[2],filename);
         }
         break;
-        
+
       case cEndDefine :
         mExecuter->EndDefine();
         break;
-        
+
       case cPrint :
         Print(words[1]); /// \todo use mExecuter 
         break;
@@ -489,79 +492,80 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
           mExecuter->SetNoExecMode(true);
         else if (words[1]=="unfreeze") 
           mExecuter->SetNoExecMode(false);
-        else 
+        else
           mExecuter->Update(words[1]);
         break;
-        
+
       case cInput :
         Utilities::SplitAroundFirstDot(words[2],left,right);
         mExecuter->DefineInput(words[1],left,right,words[3]);
         break;
-        
+
       case cOutput :
         Utilities::SplitAroundFirstDot(words[2],left,right);
         mExecuter->DefineOutput(words[1],left,right,words[3]);
         break;
-        
+
       case cSet :
         Utilities::SplitAroundFirstDot(words[1],left,right);
         mExecuter->Set(left,right,words[2]);
         break;
-        
+
       case cAuthor :
         mExecuter->Author(words[1]);
         break;
 
-    case cCategory :
-      mExecuter->Category(words[1]);
-      break;
-      
-    case cIndex :
-      if (words.size()==1) 
-       Index("tmp_index.html");
-      else if (words.size()==2) 
-       Index(words[1]);
-      else if (words.size()==3) 
-       Index(words[1],words[2]);
-      break;
-    case cDescription :
-      mExecuter->Description(words[1]);
+      case cCategory :
+        mExecuter->Category(words[1]);
         break;
-        
+
+      case cIndex :
+        if (words.size()==1)
+            Index("tmp_index.html");
+        else if (words.size()==2)
+            Index(words[1]);
+        else if (words.size()==3)
+            Index(words[1],words[2]);
+        break;
+
+      case cDescription :
+        mExecuter->Description(words[1]);
+        break;
+
       case cHelp :
         Help(words);
         break;
-        
+
       case cMessage : 
-        if (words.size()<3) 
+        if (words.size()<3)
         {
-            bbtk::MessageManager::PrintInfo();
+           bbtk::MessageManager::PrintInfo();
         }
-        else 
+        else
         {
            sscanf(words[2].c_str(),"%d",&level);
            bbtk::MessageManager::SetMessageLevel(words[1],level);
         }
         break;
-        
-      case cGraph : 
+
+      case cGraph :
         Graph(words);
         break;
-        
+
       case cConfig :
-        Config();            
+        Config();
         break;
-        
+
       case cReset :  // EED
         this->mExecuter->Reset();
         break;
-        
+
       case cInclude :
-        if (mCommandLine) 
+        if (mCommandLine)
         {
            InterpretFile(words[1], true ); // true : better pass use_config_file
         }
-        else 
+        else
         {
             SwitchToFile(words[1], true ); // true : better pass use_config_file
         }
@@ -571,26 +575,27 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
            this->mExecuter->SetCurrentFileName(words[1]);
          }
         break;
-        
+
       case cLoad:
         LoadPackage(words[1], true ); // true : better pass use_config_file
         break;
-        
+
       case cUnload:
         UnLoadPackage(words[1]);
         break;
-        
+
       case cQuit :
+        delete mExecuter;
         throw QuitException();
         break;
-        
-         case cWorkspace :
+
+      case cWorkspace :
         if (words.size() == 2) 
         {
            if (words[1]=="freeze")        mExecuter->SetNoExecMode(true);
            else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false);
         }
-        else 
+        else
         {
            mExecuter->SetWorkspaceName(words[2]);
         }
@@ -599,7 +604,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
       default:
         bbtkInternalError("should not reach here !!!");
    }
-    
+
    bbtkDecTab("Interpreter",9);
 }
   //=======================================================================  
@@ -610,12 +615,12 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
 
   //=======================================================================
   /**
-   *  
+   *
    */
 void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>& tokens)
 {
     bbtkDebugMessageInc("Interpreter",9,"Interpreter::SplitLine(\""<<str<<"\")"<<std::endl);
+
     std::string delimiters = "\"";
     std::vector<std::string> quote;
     Utilities::SplitString(str,delimiters,quote);
@@ -640,7 +645,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     }
     bbtkDebugMessageCont("Interpreter",9,std::endl);
 
-    bbtkDebugDecTab("Interpreter",9);    
+    bbtkDebugDecTab("Interpreter",9);
  }
   //=======================================================================
 
@@ -657,14 +662,14 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
    {
       s.replace(pos,2,cr,1);
       pos = s.find(ss, pos-1);
-   } 
+   }
   }
   //=======================================================================
 
 
   //=======================================================================
   /**
-   *  
+   *
    */
   void Interpreter::Print( const std::string& str)
   {
@@ -679,10 +684,10 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
     bool is_text = true;
     if (lastPos>0) is_text = false;
-  
+
     // Find first delimiter.
     std::string::size_type pos     = str.find_first_of(delimiters, lastPos);
-    
+
     while (std::string::npos != pos || std::string::npos != lastPos)
     {
        if (is_text) 
@@ -713,12 +718,12 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
        std::cout << *i;
      }
      std::cout << std::endl;
-     bbtkDebugDecTab("Interpreter",9);    
+     bbtkDebugDecTab("Interpreter",9);
  }
 
   //=======================================================================
   /**
-   *  
+   *
    */
 
 // ===================================================================================
@@ -735,7 +740,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
   //
   // use ./directory/subdir/scrname.bbs
   //
-  
+
     bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \""
                          <<name<<"\")"<<std::endl);
 
@@ -743,7 +748,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     std::string fullPathScriptName;  // full path script name
     std::string pkgname;             // e.g. <scriptname>.bbs
     std::vector<std::string> Filenames;
-        
+
     if (use_configuration_file)
     {
         // The following is *NOT* a debug time message :
@@ -779,15 +784,13 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
            bbtkMessage("Interpreter",2,
                       "WARNING : No '.bbs' file found in [" 
                       << upath << "]" << std::endl);
-
         return;
       }
-      
 
       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
+      for (i=script_paths.begin();i!=script_paths.end();i++)// ==== relative name, iterate + load all .bbs files
       {
         path = *i;
 
@@ -801,8 +804,12 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
 
         fullDirectoryName = Utilities::MakePkgnameFromPath(path, upath, false);
 
-      // Check if library exists           
-        if ( ! Utilities::IsDirectory(fullDirectoryName) )
+        //EED 18 Fev 2008
+        // 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.
@@ -819,7 +826,6 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
         nbBssFiles = 0;
         for (std::vector<std::string>::iterator i = Filenames.begin(); i!= Filenames.end(); ++i)
         {
-
            if ((*i).substr((*i).size()-4, 4) != ".bbs")
               continue;      // ignore non .bbs files
            LoadScript(*i,name);
@@ -829,7 +835,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
          bbtkMessage("Interpreter",1,
                      "WARNING : No '.bbs' file found in [" 
                      << fullDirectoryName << "]" << std::endl);
-           
+
         //break; // a directory was found; we stop iterating
        // LG : No! We want all files included !
        }
@@ -849,7 +855,6 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
       // ===========================================================check user supplied location
       fullnameGiven = true;
 
-      
       fullPathScriptName =  Utilities::ExpandLibName(name, false);
 
       // allow user to always forget ".bbs"
@@ -911,7 +916,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
         }
        bbtkMessage("Interpreter",2,
                    "   [" <<fullPathScriptName 
-                   <<"] : found" <<std::endl);        
+                   <<"] : found" <<std::endl);
         foundFile = true;
         break; // a script was found; we stop iterating
 
@@ -927,14 +932,14 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
             bbtkError("Script ["<<fullPathScriptName<<"] not found");
        else
           bbtkError("No ["<<pkgname<<".bbs] script found");
-       return;    
+       return;
     }
     else
       LoadScript(fullPathScriptName,name);
 
     return;
-  }   
-   
+  }
+
 
   //=======================================================================
 
@@ -949,15 +954,15 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
        return;
       }
 
-    std::ifstream* s;      
+    std::ifstream* s;
     s = new std::ifstream;
     s->open(fullPathScriptName.c_str());
     if (!s->good()) 
     {
         bbtkError("Could not open file ["<<fullPathScriptName<<"]");
-        return;     
+        return;
     }
-    
+
     bbtkMessage("Interpreter",1,"   -->[" << fullPathScriptName 
                << "] found" << std::endl);
 
@@ -965,7 +970,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     mFileName.push_back(fullPathScriptName);
     mIncludeFileName.push_back(includeScriptName);
     mLine.push_back(0);
-    return;  
+    return;
   }
 
   //=======================================================================
@@ -976,8 +981,8 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
   {
     bbtkDebugMessage("Interpreter",9,"Interpreter::CloseCurrentFile()"
                       <<std::endl);
-    
-    if (mFile.size()==0) 
+
+    if (mFile.size()==0)
     {
       bbtkDebugMessage("Interpreter",9," -> no file left open"<<std::endl);
       return;
@@ -988,7 +993,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     mFile.pop_back();
     bbtkDebugMessage("Interpreter",9,
                      " Closing file '"<<mFileName.back()<<"'"<<std::endl);
-    
+
     mFileName.pop_back();
     mIncludeFileName.pop_back();
     mLine.pop_back();
@@ -1008,7 +1013,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
   {
     bbtkDebugMessage("Interpreter",9,"Interpreter::CloseAllFiles()"
                       <<std::endl);
-    
+
     while (mFile.size() != 0) 
     {
       mFile.back()->close();
@@ -1035,7 +1040,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
                                       CommandInfoType& info )
   {
     bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretCommand(...)"<<std::endl);
-    
+
     // searches the command category
     CommandDictType::iterator c;
     c = mCommandDict.find(words[0]);
@@ -1062,7 +1067,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
 void Interpreter::Help(const std::vector<std::string>& words)
 {
     unsigned int nbarg = words.size()-1;
-    
+
     if (nbarg==0) 
     {
        HelpCommands();
@@ -1083,26 +1088,52 @@ void Interpreter::Help(const std::vector<std::string>& words)
          try 
          {
             HelpPackage(words[1]);
+#ifdef _USE_WXWIDGETS_
+           if ( WxConsole::GetInstance() != 0 )
+             {
+               std::string url = 
+                 ConfigurationFile::GetInstance().Get_doc_path();
+               url += "/bbdoc/" + words[1] + "/index.html";
+               if (Utilities::FileExists(url)) 
+                 {
+                   WxConsole::GetInstance()->ShowHtmlPage(url);
+                 }
+             }
+#endif     
          }
          catch (bbtk::Exception f) 
          {
             try 
             {
-               HelpBlackBox(words[1]);
-            }
-           catch (bbtk::Exception g) 
-           {
-              try
-              {
-                 this->mExecuter->ShowRelations(words[1],"0","9999");
-              }
-              catch (bbtk::Exception h){
-                bbtkError("\""<<words[1].c_str()
-                          <<"\" is not a known command, package, black box type or black box name");
-              }
-           }
+             std::string package;
+             HelpBlackBox(words[1],package);
+#ifdef _USE_WXWIDGETS_
+              if ( WxConsole::GetInstance() != 0 )
+                {
+                  std::string url = 
+                    ConfigurationFile::GetInstance().Get_doc_path();
+                  url += "/bbdoc/" + package + "/index.html";
+                  if (Utilities::FileExists(url))
+                    {
+                      url += "#" + words[1];
+                      WxConsole::GetInstance()->ShowHtmlPage(url);
+                    }
+                }
+#endif
+           }
+           catch (bbtk::Exception g) 
+             {
+               try
+                 {
+                   this->mExecuter->ShowRelations(words[1],"0","9999");
+                 }
+               catch (bbtk::Exception h){
+                 bbtkError("\""<<words[1].c_str()
+                           <<"\" is not a known command, package, black box type or black box name");
+               }
+             }
          }
-       }
+      }
     }
     else if (nbarg==2) 
     {
@@ -1138,44 +1169,9 @@ void Interpreter::Help(const std::vector<std::string>& words)
   /// Displays the Configuration
   void Interpreter::Config() const
   {
-    bbtkDebugMessageInc("Kernel",9,"Factory::Config"<<std::endl);
-    
-    ConfigurationFile cf = ConfigurationFile::GetInstance();
-    
-    const std::string config_xml_full_path      = cf.Get_config_xml_full_path();    
-    const std::string description               = cf.Get_description();
-    const std::string url                       = cf.Get_url();
-    const std::string data_path                 = cf.Get_data_path();
-    const std::string default_temp_dir          = cf.Get_default_temp_dir();    
-    const std::string file_separator            = cf.Get_file_separator();    
-    const std::vector<std::string>bbs_paths     = cf.Get_bbs_paths();
-    const std::vector<std::string>package_paths = cf.Get_package_paths();
-    
-    bbtkMessage("Help",1, "============="   << std::endl);           
-    bbtkMessage("Help",1, "Configuration"   << std::endl);
-    bbtkMessage("Help",1, "============="   << std::endl);
-    bbtkMessage("Help",1, "bbtk_config.xml   : [" << config_xml_full_path  << "]" << std::endl); 
-    bbtkMessage("Help",1, "Documentation Url : [" << url             << "]" << std::endl);
-    bbtkMessage("Help",1, "Data Path         : [" << data_path       << "]" << std::endl);
-    bbtkMessage("Help",1, "Default Temp-Dir  : [" << default_temp_dir << "]" << std::endl);
-    bbtkMessage("Help",1, "File Separator    : [" << file_separator  << "]" << std::endl);
-
-    std::vector<std::string>::const_iterator i;
-           
-    bbtkMessage("Help",1, "BBS Paths   " << std::endl);     
-    for (i = bbs_paths.begin(); i!=bbs_paths.end(); ++i )
-    {
-      bbtkMessage("Help",1,"--- ["<<*i<<"]"<<std::endl);
-    }    
-    
-    bbtkMessage("Help",1, "PACKAGE Paths : " << std::endl);     
-    for (i = package_paths.begin(); i!=package_paths.end(); ++i )
-    {
-      bbtkMessage("Help",1,"--- ["<<*i<<"]"<<std::endl);
-    }
-
-    bbtkDebugDecTab("Kernel",9);
+    ConfigurationFile::GetInstance().GetHelp(1);
   }  
+   //===================================================================    
 
   //=======================================================================
   /// Displays help on all the commands
@@ -1189,7 +1185,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
               std::cout << " " << i->first << std::endl;
       //      std::cout << "   usage : " << i->second.syntax << std::endl;
       //     std::cout << "    " << i->second.help << std::endl;
+
     }
   }
   //=======================================================================
@@ -1211,7 +1207,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
     //      ++i) {
     std::cout << " usage : " << c->second.syntax << std::endl;
     std::cout << "  " << c->second.help << std::endl;
-    
+
   }
   //=======================================================================
 
@@ -1235,7 +1231,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
   //=======================================================================
 
 
-  
+
   //=======================================================================
 #ifdef BBTK_USE_TERMIOS_BASED_PROMPT
   
@@ -1258,19 +1254,18 @@ void Interpreter::Help(const std::vector<std::string>& words)
   {
     int c;
     int ind=0;
-    
+
     int MAX_LINE_SIZE = 160;
     int MAX_HISTORY_SIZE = 100;
-    
+
     char* newline = new char[MAX_LINE_SIZE];
     memset(newline,0,MAX_LINE_SIZE);
     char* histline = new char[MAX_LINE_SIZE];
     memset(histline,0,MAX_LINE_SIZE);
-    
+
     char* line = newline;
     int hist = mHistory.size();
-    
-    
+
     write(1,"> ",2);
     while(1)
     {
@@ -1459,7 +1454,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
   {
     bbtkDebugMessageInc("Interpreter",9,
                         "Interpreter::CommandLineInterpreter()"<<std::endl);
-    
+
 #ifdef BBTK_USE_TERMIOS_BASED_PROMPT  
     // Initialise the tty in non canonical mode with no echo
     // oter remembers the previous settings to restore them after 
@@ -1502,13 +1497,13 @@ void Interpreter::Help(const std::vector<std::string>& words)
       }
     }
     while (again);
-  
+
 #ifdef BBTK_USE_TERMIOS_BASED_PROMPT
     tcsetattr(0,TCSANOW,&oter);
 #endif
-  
+
     std::cout << "Good bye !" << std::endl;
-    
+
     bbtkDebugDecTab("Interpreter",9);
   }