]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkInterpreter.cxx
in 50 % of the scripts, LoadHola was called an 'image' in 50 % a 'reader'.
[bbtk.git] / kernel / src / bbtkInterpreter.cxx
index d112f73bdb4f4c19c065bde7e511962c235c2caa..ea9adc9ba8f1ef9bae578080dc75dcf682a015a9 100644 (file)
@@ -2,8 +2,8 @@
   Program:   bbtk
   Module:    $RCSfile: bbtkInterpreter.cxx,v $
   Language:  C++
-  Date:      $Date: 2008/10/17 08:18:13 $
-  Version:   $Revision: 1.77 $
+  Date:      $Date: 2009/10/05 22:44:48 $
+  Version:   $Revision: 1.87 $
 =========================================================================*/
 
 /* ---------------------------------------------------------------------
@@ -39,6 +39,7 @@
 #include "bbtkMessageManager.h"
 #include "bbtkConfigurationFile.h"
 #include "bbtkUtilities.h"
+#include "bbtkAtomicBlackBox.h"
 #include "bbtkWxBlackBox.h"
 #include <sys/stat.h>
 #include <algorithm>
@@ -55,7 +56,7 @@ namespace bbtk
  //=======================================================================
   Interpreter::Pointer Interpreter::New(const std::string& cpp_file) 
   {
-    bbtkDebugMessage("Kernel",9,"Interpreter::New('"<<cpp_file<<"')"<<std::endl);
+    bbtkDebugMessage("kernel",9,"Interpreter::New('"<<cpp_file<<"')"<<std::endl);
     return MakePointer(new Interpreter(cpp_file));
   }
  //=======================================================================
@@ -63,7 +64,7 @@ namespace bbtk
  //=======================================================================
   Interpreter::Pointer Interpreter::New(VirtualExec::Pointer e) 
   {
-    bbtkDebugMessage("Kernel",9,"Interpreter::New(VirtualExec)"<<std::endl);
+    bbtkDebugMessage("kernel",9,"Interpreter::New(VirtualExec)"<<std::endl);
     return MakePointer(new Interpreter(e));
   }
  //=======================================================================
@@ -71,14 +72,18 @@ namespace bbtk
  //=======================================================================
   Interpreter::Interpreter(const std::string& cpp_file) 
   {
+    bbtkDebugMessage("object",2,"==> Interpreter("<<cpp_file<<")"<<std::endl);
     Init(VirtualExec::Pointer(), cpp_file);
+    bbtkDebugMessage("object",2,"<== Interpreter("<<cpp_file<<")"<<std::endl);
   }
   //=======================================================================
 
  //=======================================================================
   Interpreter::Interpreter(VirtualExec::Pointer e) 
   {
+    bbtkDebugMessage("object",2,"==> Interpreter(VirtualExec)"<<std::endl);
     Init(e,"");
+    bbtkDebugMessage("object",2,"<== Interpreter(VirtualExec)"<<std::endl);
   }
   //=======================================================================
 
@@ -134,6 +139,22 @@ namespace bbtk
     info.help = "Deletes the black box of name <box>";
     mCommandDict[info.keyword] = info;
 
+    info.keyword = "clear";
+    info.argmin = 0;
+    info.argmax = 0;
+    info.code = cClear;
+    info.syntax = "clear";
+    info.help = "Clears the currently defined complex box (deletes all its boxes and connections)";
+    mCommandDict[info.keyword] = info;
+
+    info.keyword = "break";
+    info.argmin = 0;
+    info.argmax = 0;
+    info.code = cBreak;
+    info.syntax = "break";
+    info.help = "Breaks the current execution";
+    mCommandDict[info.keyword] = info;
+
     info.keyword = "newgui";
     info.argmin = 2;
     info.argmax = 2;
@@ -202,7 +223,7 @@ namespace bbtk
     info.argmin = 1;
     info.argmax = 1;
     info.code = cKind;
-    info.syntax = "kind <ADAPTOR|DEFAULT_ADAPTOR|WIDGET_ADAPTOR|DEFAULT_WIDGET_ADAPTOR>";
+    info.syntax = "kind <ADAPTOR|DEFAULT_ADAPTOR|GUI|DEFAULT_GUI>";
     info.help = "Sets the kind of the currently defined complex black box";
     mCommandDict[info.keyword] = info;
 
@@ -354,7 +375,7 @@ namespace bbtk
     mCommandDict[info.keyword] = info;
     */
 
-    bbtkDebugDecTab("Interpreter",9);
+
 
   } 
   //=======================================================================
@@ -367,25 +388,28 @@ namespace bbtk
    */
   Interpreter::~Interpreter()
   {
-    bbtkDebugMessageInc("Interpreter",9,"==> Interpreter::~Interpreter()" <<std::endl);
+    bbtkDebugMessage("object",2,"==> ~Interpreter()" <<std::endl);
     mVirtualExecuter = VirtualExec::Pointer();
-    bbtkDebugMessageInc("Interpreter",9,"<== Interpreter::~Interpreter()" <<std::endl);
+    bbtkDebugMessage("object",2,"<== ~Interpreter()" <<std::endl);
   }
   //=======================================================================
 
 
-  InterpreterError::InterpreterError( const std::string& message,
+  //=======================================================================
+  InterpreterException::InterpreterException( const std::string& message,
                                      bool in_script_file,
                                      const std::string& script_file,
                                      int script_line 
                                      )
-    : Exception("Interpreter",0,message),
+    : Exception("interpreter",0,message),
       mInScriptFile(in_script_file),
       mScriptFile(script_file),
       mScriptLine(script_line)
   {
   }
-  InterpreterError::InterpreterError( const Exception& excep,
+  //=======================================================================
+  //=======================================================================
+  InterpreterException::InterpreterException( const Exception& excep,
                      bool in_script_file,
                      const std::string& script_file,
                      int script_line 
@@ -397,8 +421,60 @@ namespace bbtk
   {
   }
   //=======================================================================
+
+
+  //=======================================================================
+  void Interpreter::CatchInterpreterException( const InterpreterException& e )
+  {
+    if (GetExecuter()->GetNoErrorMode()) 
+      {
+       bbtkWarning("ERROR :"<<e.GetErrorMessage()
+                   <<" ("<<e.GetScriptFile()<<":"<<e.GetScriptLine()
+                   <<" skipped");
+
+       return;
+      }
+    if (mThrow) 
+      {
+       if (e.GetErrorMessage()!="break")
+         {
+           mStatus = Interpreter_ERROR;               
+           CloseAllFiles();
+         }
+       throw InterpreterException(e);
+      }
+    else
+      {
+       std::stringstream mess;
+       mess << "* ERROR : "<<e.GetErrorMessage()<<std::endl;
+       if (e.IsInScriptFile())
+         {
+           mess << "* FILE  : \""<<e.GetScriptFile()<<"\""<<std::endl;
+           mess << "* LINE  : "<<e.GetScriptLine()<<std::endl;
+         }
+       CloseAllFiles();
+       std::cerr << mess.str();
+      }
+  }
+  //=======================================================================
+
+  //=======================================================================
   void Interpreter::CatchBbtkException( const bbtk::Exception& e )
   {
+    if (GetExecuter()->GetNoErrorMode()) 
+      {
+       std::string file("?");
+       int line = 0;
+       if (mFileName.size()) {
+         file = mFileName.back();
+         line = mLine.back();
+       }    
+       bbtkWarning("ERROR '"<<e.GetErrorMessage()
+                   <<"' ("<<file<<":"<<line<<") skipped");
+       
+       return;
+      }
+    mStatus = Interpreter_ERROR;              
     if (mThrow) 
       {
        bool in_script = false;
@@ -410,8 +486,9 @@ namespace bbtk
          file = mFileName.back();
          line = mLine.back();
        }   
-       CloseAllFiles();
-       throw InterpreterError(e,in_script,file,line);
+       if (e.GetErrorMessage()!="break")
+         CloseAllFiles();
+       throw InterpreterException(e,in_script,file,line);
       }
     else
       {
@@ -421,6 +498,7 @@ namespace bbtk
          mess << "* FILE  : \""<<mFileName.back()<<"\""<<std::endl;
          mess << "* LINE  : "<<mLine.back()<<std::endl;
        }    
+       CloseAllFiles();
        std::cerr << mess.str();
       }
   }
@@ -429,6 +507,20 @@ namespace bbtk
   //=======================================================================
   void Interpreter::CatchStdException( const std::exception& e )
   {  
+   if (GetExecuter()->GetNoErrorMode()) 
+      {
+       std::string file("?");
+       int line = 0;
+       if (mFileName.size()) {
+         file = mFileName.back();
+         line = mLine.back();
+       }    
+       bbtkWarning("ERROR '"<<e.what()
+                   <<"' ("<<file<<":"<<line<<") skipped");
+
+       return;
+      }
+    mStatus = Interpreter_ERROR;              
     if (mThrow) 
       {
        bool in_script = false;
@@ -441,7 +533,7 @@ namespace bbtk
          line = mLine.back();
        }    
        CloseAllFiles();
-       throw InterpreterError(e.what(),in_script,file,line);
+       throw InterpreterException(e.what(),in_script,file,line);
       }
     else
       {
@@ -451,6 +543,7 @@ namespace bbtk
          mess << "* FILE  : \""<<mFileName.back()<<"\""<<std::endl;
          mess << "* LINE  : "<<mLine.back()<<std::endl;
        }    
+       CloseAllFiles();
        std::cerr << mess.str();
       }
   }
@@ -459,6 +552,19 @@ namespace bbtk
   //=======================================================================
   void Interpreter::CatchUnknownException()
   {
+   if (GetExecuter()->GetNoErrorMode()) 
+      {
+       std::string file("?");
+       int line = 0;
+       if (mFileName.size()) {
+         file = mFileName.back();
+         line = mLine.back();
+       }  
+       bbtkWarning("UNDEFINED ERROR "
+                   <<"("<<file<<":"<<line<<") skipped");
+       return;
+      }
+    mStatus = Interpreter_ERROR;              
     if (mThrow) 
       {
        bool in_script = false;
@@ -471,7 +577,7 @@ namespace bbtk
          line = mLine.back();
        }    
        CloseAllFiles();
-       throw InterpreterError("Unknown exception caught",
+       throw InterpreterException("Unknown exception caught",
                                   in_script,file,line);
       }
     else
@@ -483,138 +589,125 @@ namespace bbtk
          mess << "* FILE  : \""<<mFileName.back()<<"\""<<std::endl;
          mess << "* LINE  : "<<mLine.back()<<std::endl;
        }    
+       CloseAllFiles();
        std::cerr << mess.str();
       }
   }
   //=======================================================================
 
   //=======================================================================
-
-#define CATCH_MACRO                            \
-  catch (QuitException e)                      \
-    {                                          \
-      status = Interpreter_QUIT;               \
-      if (mThrow) throw QuitException();       \
-    }                                          \
-  catch (bbtk::Exception e)                    \
-    {                                          \
-      status = Interpreter_ERROR;              \
-      CatchBbtkException(e);                   \
-    }                                          \
-  catch (std::exception& e)                    \
-    {                                          \
-      status = Interpreter_ERROR;              \
-      CatchStdException(e);                    \
-    }                                          \
-  catch (...)                                  \
-    {                                          \
-      status = Interpreter_ERROR;              \
-      CatchUnknownException();                 \
+  
+#define CATCH_MACRO                                    \
+  catch (InterpreterException e)                       \
+    {                                                  \
+      CatchInterpreterException(e);                    \
+    }                                                  \
+  catch (bbtk::Exception e)                            \
+    {                                                  \
+      CatchBbtkException(e);                           \
+    }                                                  \
+  catch (std::exception& e)                            \
+    {                                                  \
+      CatchStdException(e);                            \
+    }                                                  \
+  catch (...)                                          \
+    {                                                  \
+      CatchUnknownException();                         \
     }                                          
   //=======================================================================
    
 
   //=======================================================================
-  /**
-   *  
-   */
   Interpreter::ExitStatus Interpreter::InterpretFile( const std::string& filename, bool source )
   {
-    bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
+    bbtkDebugMessage("interpreter",4,"==> Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
 
     bool exm = mCommandLine;
     mCommandLine = false;
 
-    ExitStatus status = Interpreter_OK;
-
     try 
     {
+      mStatus = Interpreter_OK;
       SwitchToFile(filename,source);
-
-      bool insideComment = false; // for multiline comment
-      while (mFile.size()>0) 
-      {
-       while (!mFile.back()->eof()) {
-         mLine.back()++;
-         char buf[500];
-         mFile.back()->getline(buf,500);
-         std::string str(buf);
-         int size=str.length();
-         if ( str[ size-1 ]==13  )
-            {
-             str.erase(size-1,1);
-            }
-         try
-           {
-             InterpretLine(str, insideComment);
-           }
-         CATCH_MACRO;
-         
-       }//while !eof
-       CloseCurrentFile();
-      }//while >0
-    } // try
+      mInsideComment = false;
+      InterpretCurrentStreams();
+    } 
     CATCH_MACRO;
     
-    CloseAllFiles();
-    bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
-    bbtkDecTab("Interpreter",9);
+    bbtkDebugMessage("interpreter",4,
+                    "<== Interpreter::InterpretFile(\""
+                    <<filename<<"\")"<<std::endl);
+
 
     mCommandLine = exm;
     
-    return status;
+    return mStatus;
   }
   //=======================================================================
 
 
   //=======================================================================
-  /**
-   *  
-   */
   Interpreter::ExitStatus 
   Interpreter::InterpretBuffer( std::stringstream* buffer )
   {
-    bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretBuffer()"<<std::endl);
+    bbtkDebugMessage("interpreter",4,"==> Interpreter::InterpretBuffer()"<<std::endl);
 
     bool exm = mCommandLine;
     mCommandLine = false;
 
-    ExitStatus status = Interpreter_OK;
-
     try 
     {
+      mStatus = Interpreter_OK;
       SwitchToStream(buffer);
-      bool insideComment = false; // for multiline comment
-      while (mFile.size()>0) 
+      mInsideComment = false;
+      InterpretCurrentStreams();
+    }
+    CATCH_MACRO;
+    
+    //    CloseAllFiles();
+    bbtkDebugMessage("interpreter",4,"<== Interpreter::InterpretBuffer()"<<std::endl);
+
+    
+    mCommandLine = exm;
+    return mStatus;
+  }
+  //=======================================================================
+
+  //=======================================================================
+  /// Interprets the currently open streams
+  Interpreter::ExitStatus Interpreter::InterpretCurrentStreams()
+  {
+    bbtkDebugMessage("interpreter",4,
+                    "==> Interpreter::InterpretCurrentStreams()"<<std::endl);
+
+    while (mFile.size()>0) 
       {
        while (!mFile.back()->eof()) {
          mLine.back()++;
          char buf[500];
          mFile.back()->getline(buf,500);
          std::string str(buf);
-         
+         //size 0 JCP 21-09-2009
          int size=str.length();
-         if ( str[ size-1 ]==13  )
+         if(size != 0){
+                 if ( str[ size-1 ]==13  )
             {
              str.erase(size-1,1);
             }
-         try
-           {
-             InterpretLine(str, insideComment);
-           }
-         CATCH_MACRO;
-       }//while
+                 try
+                       {
+                         DoInterpretLine(str);
+                       }
+                 CATCH_MACRO;
+         }
+         
+       } 
        CloseCurrentFile();
       }
-    }
-    CATCH_MACRO;
-    
-    CloseAllFiles();
-    bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretBuffer()"<<std::endl);
-    bbtkDecTab("Interpreter",9);
-    
-    mCommandLine = exm;
-    return status;
+    bbtkDebugMessage("interpreter",4,
+                    "<== Interpreter::InterpretCurrentStreams()"<<std::endl);
+
+    return mStatus;
   }
   //=======================================================================
 
@@ -622,50 +715,45 @@ namespace bbtk
   /// Runs the interpretation of a command
   Interpreter::ExitStatus Interpreter::InterpretLine( const std::string& line )
   {
-    bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretLine('"<<line<<"')"<<std::endl);
-
-    ExitStatus status = Interpreter_OK;
+    bbtkDebugMessage("interpreter",5,"==> Interpreter::InterpretLine('"<<line<<"')"<<std::endl);
 
     try 
     {
-      bool insideComment = false;
-      InterpretLine(line, insideComment);
+      mStatus = Interpreter_OK;
+      mInsideComment = false;
+//std::cout<<"JCP bbtkInterpreter.cxx Interpreter::InterpretLine("<<std::endl;
+      DoInterpretLine(line );
     }
     CATCH_MACRO;
-  
-
-    bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretLine()"
-                    <<std::endl);
-    bbtkDecTab("Interpreter",9);
     
-    return status;
+    
+   bbtkDebugMessage("interpreter",5,"<== Interpreter::InterpretLine('"<<line<<"')"<<std::endl);
+    
+    return mStatus;
   }
+  //=======================================================================  
   
 
   //=======================================================================  
-  /**
-   *
-   */
-void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
-{
-    bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretLine(\""<<line<<"\")"<<std::endl);
-    bbtkMessage("echo",2,line<<std::endl);
-
+  void Interpreter::DoInterpretLine( const std::string& line )
+  {
+    bbtkDebugMessage("interpreter",6,"==> Interpreter::DoInterpretLine(\""
+                    <<line<<"\")"<<std::endl);
     std::vector<std::string> words;
     SplitLine(line,words);
 
     // Empty line
     if (words.size()<1) 
     {
-       bbtkDebugDecTab("Interpreter",9);
+       bbtkDebugDecTab("interpreter",9);
        return;
     }
 
     // Single line comment : # or //
     if ( words[0][0]=='#' || (words[0][0]=='/' && words[0][1]=='/') ) 
     {  
-       bbtkDebugDecTab("Interpreter",9);
-       bbtkMessage("Interpreter",9,"Comment"<<std::endl);
+       bbtkDebugDecTab("interpreter",9);
+       bbtkMessage("interpreter",9,"Comment"<<std::endl);
        return;
     }
 
@@ -673,43 +761,97 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
     
     if (words[0][0]=='/' && words[0][1]=='*') 
     {  
-       bbtkDebugDecTab("Interpreter",9);
-       bbtkMessage("Interpreter",9,"In multiline comment"<<std::endl);
-       insideComment = true;
+       bbtkDebugDecTab("interpreter",9);
+       bbtkMessage("interpreter",9,"In multiline comment"<<std::endl);
+       mInsideComment = true;
        return;
     }
 
     if (words[0][0]=='*' && words[0][1]=='/') 
     {  
-       bbtkDebugDecTab("Interpreter",9);
-       bbtkMessage("Interpreter",9,"Out multiline comment"<<std::endl);
-       if ( !insideComment ) {
-          bbtkDebugDecTab("Interpreter",9);
-          bbtkMessage("Interpreter",9,"Comment mismatch : '*/' with no matching '/*'"<<std::endl);       
+       bbtkDebugDecTab("interpreter",9);
+       bbtkMessage("interpreter",9,"Out multiline comment"<<std::endl);
+       if ( !mInsideComment ) {
+          bbtkDebugDecTab("interpreter",9);
+          bbtkMessage("interpreter",9,"Comment mismatch : '*/' with no matching '/*'"<<std::endl);       
        }
-       insideComment = false;
+       mInsideComment = false;
        return;
     }
 
-    if (insideComment) 
+    if (mInsideComment) 
     {  
-       bbtkDebugDecTab("Interpreter",9);
-       bbtkMessage("Interpreter",9,"Multiline Comment"<<std::endl);
+       bbtkDebugDecTab("interpreter",9);
+       bbtkMessage("interpreter",9,"Multiline Comment"<<std::endl);
        return;
     }
 
     // Command 
     CommandInfoType command;
     InterpretCommand(words,command);
-
-    bbtkDebugMessage("Interpreter",9,
+//std::cout<<"JCP bbtkInterpreter command.keyword ="<<command.keyword<<std::endl;
+    bbtkDebugMessage("interpreter",9,
                      "Command='"<<command.keyword
                       <<"' code="<<command.code<<std::endl); 
     int level=0;
     std::string left,right,left2,right2;
     std::string filename;
+
+    // message command
+    if (command.code==cMessage)
+      {
+       if (words.size()<3)
+         {
+           mVirtualExecuter->HelpMessages();
+         }
+        else
+         {
+           sscanf(words[2].c_str(),"%d",&level);
+           mVirtualExecuter->SetMessageLevel(words[1],level);
+         }
+       return;
+      }
+    else 
+      {
+       bbtkMessage("echo",2,line<<std::endl);
+      }
+
+    // break and quit commands
+    if ((command.code==cBreak) || (command.code==cQuit))
+      {
+       bool in_script = false;
+       std::string file("");
+       int line = 0;
+
+       if (mFileName.size()) 
+         {
+           std::ifstream* fs = dynamic_cast<std::ifstream*>(mFile.back());
+           if (fs!=0) in_script = true;          
+           file = mFileName.back();
+           line = mLine.back();
+         } 
+       if (command.code==cBreak)
+         {
+           /*
+           std::cout << "BreakException(" 
+                     <<in_script<<","
+                     <<file<<","
+                     <<line<<")"<<std::endl;
+           */
+           bbtkError("break");//,in_script,file,line);
+           //      throw BreakException(in_script,file,line);
+         }       
+       else 
+         {
+           bbtkError("quit");//,in_script,file,line);
+             //throw QuitException(in_script,file,line);
+         }
+       return;
+      }   
+//std::cout<<" mVirtualExecuter->Create(words[1],words[2]); "<<line<<std::endl;
+    // other cammands
     switch (command.code) 
-    {
+      {
       case cNew :
         mVirtualExecuter->Create(words[1],words[2]);
         break;
@@ -765,7 +907,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
            mVirtualExecuter->SetNoExecMode(true);
            mThrow = false;
          }
-       else if (words[1]=="freeze_no_error ") 
+       else if (words[1]=="freeze_no_error") 
          {
            mVirtualExecuter->SetNoExecMode(true);
            mVirtualExecuter->SetNoErrorMode(true);
@@ -826,17 +968,6 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
         Help(words);
         break;
 
-      case cMessage : 
-        if (words.size()<3)
-        {
-         mVirtualExecuter->HelpMessages();
-        }
-        else
-        {
-         sscanf(words[2].c_str(),"%d",&level);
-          mVirtualExecuter->SetMessageLevel(words[1],level);
-        }
-        break;
 
       case cGraph :
         Graph(words);
@@ -849,6 +980,10 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
       case cReset :  
        Reset();
         break;
+       
+      case cClear :  
+       mVirtualExecuter->Clear();
+        break;
 
       case cInclude :
                // if 'source' was given (words.size()==3) then tell to set the 
@@ -871,10 +1006,6 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
         GetExecuter()->UnLoadPackage(words[1]);
         break;
 
-      case cQuit :
-        throw QuitException();
-        break;
-
       case cDebug :
        if (words.size()==2) Debug(words[1]);
        else Debug("");
@@ -896,8 +1027,10 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
         bbtkInternalError("should not reach here !!!");
    }
 
-   bbtkDecTab("Interpreter",9);
-}
+    bbtkDebugMessage("interpreter",6,"<== Interpreter::DoInterpretLine(\""
+                    <<line<<"\")"<<std::endl);
+    
+  }
   //=======================================================================  
 
 
@@ -905,12 +1038,9 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
 
 
   //=======================================================================
-  /**
-   *
-   */
-void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>& tokens)
+  void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>& tokens)
 {
-    bbtkDebugMessageInc("Interpreter",9,"Interpreter::SplitLine(\""<<str<<"\")"<<std::endl);
+    bbtkDebugMessage("interpreter",9,"==> Interpreter::SplitLine(\""<<str<<"\")"<<std::endl);
 
     std::string delimiters = "\"";
     std::vector<std::string> quote;
@@ -924,7 +1054,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
        ++i;
        if (i!=quote.end()) 
        {
-        //    bbtkDebugMessage("Interpreter",0,"\""<<*i<<"\""<<std::endl);
+        //    bbtkDebugMessage("interpreter",0,"\""<<*i<<"\""<<std::endl);
           tokens.push_back(*i);
           ++i;
        }
@@ -932,11 +1062,10 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
 
     for (i=tokens.begin(); i!=tokens.end(); ++i) 
     {
-       bbtkDebugMessage("Interpreter",9,"["<<*i<<"] ");
+      bbtkDebugMessage("interpreter",9,"--["<<*i<<"]"<<std::endl);
     }
-    bbtkDebugMessageCont("Interpreter",9,std::endl);
+    bbtkDebugMessage("interpreter",9,"<== Interpreter::SplitLine(\""<<str<<"\")"<<std::endl);
 
-    bbtkDebugDecTab("Interpreter",9);
  }
   //=======================================================================
 
@@ -945,7 +1074,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
   void Interpreter::Reset()
   {
     // Cannot close all files if the reset command is read from a file !
-    //    CloseAllFiles();
+    CloseAllFiles();
     mFileNameHistory.clear();
     this->mVirtualExecuter->Reset();
   }
@@ -960,7 +1089,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
   {
     if (mVirtualExecuter->GetNoExecMode()) return;
 
-    bbtkDebugMessageInc("Interpreter",9,"Interpreter::Print(\""<<str<<"\")"<<std::endl);
+    bbtkDebugMessageInc("interpreter",9,"Interpreter::Print(\""<<str<<"\")"<<std::endl);
 
  // TO DO :
  // InterpretLine ("load std")
@@ -1022,7 +1151,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
        std::cout << *i;
      }
      std::cout << std::endl;
-     bbtkDebugDecTab("Interpreter",9);
+     bbtkDebugDecTab("interpreter",9);
  }
 */
 
@@ -1044,8 +1173,8 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
   // use ./directory/subdir/scrname.bbs
   //
 
-    bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \""
-                         <<name<<"\")"<<std::endl);
+    bbtkDebugMessage("interpreter",4,"==> Interpreter::SwitchToFile( \""
+                    <<name<<"\")"<<std::endl);
 
     std::vector<std::string> script_paths;
     std::string fullPathScriptName;  // full path script name
@@ -1055,7 +1184,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     // The following is *NOT* a debug time message :
     // It's a user intended message.
     // Please don't remove it.
-    bbtkMessage("Interpreter",1,
+    bbtkMessage("interpreter",1,
         "look for : [" << name
         << "]" << std::endl);
 
@@ -1063,7 +1192,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     std::string upath;
     pkgname = Utilities::ExtractScriptName(name,upath);
 
-    bbtkMessage("Interpreter",3,
+    bbtkMessage("interpreter",3,
                "package name:[" << pkgname
                 << "] path:[" << upath << "]" << std::endl);
     bool fullnameGiven = false; 
@@ -1080,7 +1209,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
        // ==== no path provided : look in root bbs path
        if (upath.size()==0)
          {
-           //      bbtkMessage("Interpreter",1,
+           //      bbtkMessage("interpreter",1,
            // LG : add all bbs path
            //  script_paths.push_back(  ConfigurationFile::GetInstance().Get_root_bbs_path() );
            std::vector<std::string>::const_iterator i;
@@ -1144,7 +1273,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
        std::vector<std::string>::iterator i;
        for (i=script_paths.begin();i!=script_paths.end();i++)
          {
-           bbtkMessage("Interpreter",1,
+           bbtkMessage("interpreter",1,
                        "--> Looking in '" << *i << "'" << std::endl);
            
            Filenames.clear();
@@ -1160,7 +1289,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
                if ( (*j).substr(lgr-4, 4) != ".bbp") continue; 
                
                (*stream) << "include \"" << *j << "\"\n";
-               bbtkMessage("Interpreter",2,"  --> Found '" << *j << "'" << std::endl);
+               bbtkMessage("interpreter",2,"  --> Found '" << *j << "'" << std::endl);
                
                nbBssFiles++;
              } // for (std::vector...
@@ -1169,12 +1298,12 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
        // === Result ...
        if (nbBssFiles==0)
          {
-           bbtkMessage("Interpreter",1,
+           bbtkMessage("interpreter",1,
                        "  --> No .bbp found"<< std::endl);
          } 
        else 
          {
-           bbtkMessage("Interpreter",1,
+           bbtkMessage("interpreter",1,
                        "  --> "<<nbBssFiles<<" .bbp found"<< std::endl);
            SwitchToStream(stream);
          }
@@ -1248,49 +1377,52 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
                }
          
                std::string tfullPathScriptName = Utilities::MakePkgnameFromPath(path, name, false);
-               if (tfullPathScriptName.substr(tfullPathScriptName.size()-4, 3)==".bb")
-               {
-                 fullPathScriptName = tfullPathScriptName;
-                       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 <<"] : does not exist" 
-                         <<std::endl);
-                               continue;  // try next path
-                       }
-                       bbtkMessage("Interpreter",2,
-                             "   [" <<fullPathScriptName 
-                                 <<"] : found" <<std::endl);
-                       foundFile = true;
-                       break; // a script was found; we stop iterating
-               }
-               else 
-               {
-                       fullPathScriptName = tfullPathScriptName + ".bbs";
-                       // Check if library exists
-                       if ( ! Utilities::FileExists(fullPathScriptName) )
+//Addition JCP tfullPathScriptName.size()>=4 
+               if(tfullPathScriptName.size()>=4){
+                       if (tfullPathScriptName.substr(tfullPathScriptName.size()-4, 3)==".bb")
                        {
-                               fullPathScriptName = tfullPathScriptName + ".bbp";
+                         fullPathScriptName = tfullPathScriptName;
                                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,
-                                       "   [" <<tfullPathScriptName <<".bbs/.bbp] : do not exist" 
-                                       <<std::endl);
+                                       bbtkMessage("interpreter",2,
+                                 "   [" <<fullPathScriptName <<"] : does not exist" 
+                                 <<std::endl);
                                        continue;  // try next path
                                }
+                               bbtkMessage("interpreter",2,
+                                         "   [" <<fullPathScriptName 
+                                         <<"] : found" <<std::endl);
+                               foundFile = true;
+                               break; // a script was found; we stop iterating
                        }
-                       bbtkMessage("Interpreter",2,
-                     "   [" <<fullPathScriptName 
-                     <<"] : found" <<std::endl);
-                       foundFile = true;
-                       break; // a script was found; we stop iterating
-               }
+                       else 
+                       {
+                               fullPathScriptName = tfullPathScriptName + ".bbs";
+                               // Check if library exists
+                               if ( ! Utilities::FileExists(fullPathScriptName) )
+                               {
+                                       fullPathScriptName = tfullPathScriptName + ".bbp";
+                                       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,
+                                               "   [" <<tfullPathScriptName <<".bbs/.bbp] : do not 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() )
   }
 
@@ -1319,7 +1451,9 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
   //=======================================================================
 void Interpreter::SwitchToStream( std::stringstream* stream )
 {
-    mFile.push_back(stream);
+  bbtkDebugMessage("interpreter",4,"==> Interpreter::SwitchToStream()"
+                  <<std::endl);
+   mFile.push_back(stream);
     std::ostringstream buffer_name;
     bufferNb++;
     buffer_name << "buffer_" ;
@@ -1339,7 +1473,11 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
   void Interpreter::LoadScript( std::string fullPathScriptName,
                                std::string includeScriptName)
   {
-     Utilities::replace( fullPathScriptName , 
+    bbtkDebugMessage("interpreter",4,"==> Interpreter::LoadScript("
+                    <<fullPathScriptName<<")"
+                    <<std::endl);
+
+    Utilities::replace( fullPathScriptName , 
                         INVALID_FILE_SEPARATOR , VALID_FILE_SEPARATOR);
    
      if (find(mFileNameHistory.begin(),
@@ -1358,7 +1496,7 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
         return;
     }
 
-    bbtkMessage("Interpreter",1,"   -->[" << fullPathScriptName 
+    bbtkMessage("interpreter",1,"   -->[" << fullPathScriptName 
                << "] found" << std::endl);
 
     mFile.push_back(s);
@@ -1367,25 +1505,23 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
     mIncludeFileName.push_back(includeScriptName);
     mLine.push_back(0);
 
-       return;
+    return;
   }
+  //=======================================================================
 
   //=======================================================================
-  /**
-   *  
-   */
   void Interpreter::CloseCurrentFile()
   {
-    bbtkDebugMessage("Interpreter",9,"Interpreter::CloseCurrentFile()"
+    bbtkDebugMessage("interpreter",9,"==> Interpreter::CloseCurrentFile()"
                       <<std::endl);
 
     if (mFile.size()==0)
     {
-      bbtkDebugMessage("Interpreter",9," -> no file left open"<<std::endl);
+      bbtkDebugMessage("interpreter",9," -> no file left open"<<std::endl);
       return;
     }
 
-    bbtkDebugMessage("Interpreter",9," Closing file '"<<mFileName.back()<<"'"<<std::endl);
+    bbtkDebugMessage("interpreter",9," Closing file '"<<mFileName.back()<<"'"<<std::endl);
 
     std::ifstream* file = dynamic_cast<std::ifstream*>(mFile.back());
     if (file!=0) file->close();
@@ -1396,28 +1532,25 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
     mIncludeFileName.pop_back();
     mLine.pop_back();
 
-    bbtkDebugMessage("Interpreter",9," Remains "
+    bbtkDebugMessage("interpreter",9," Remains "
                      <<mFile.size()
                      <<" open"<<std::endl);
-    bbtkDebugMessage("Interpreter",9,"EO Interpreter::CloseCurrentFile()"
+    bbtkDebugMessage("interpreter",9,"<== Interpreter::CloseCurrentFile()"
                      <<std::endl);
   }
   //=======================================================================
 
  //=======================================================================
-  /**
-   *  
-   */
   void Interpreter::CloseAllFiles()
   {
-    bbtkDebugMessage("Interpreter",9,"Interpreter::CloseAllFiles()"
+    bbtkDebugMessage("interpreter",9,"==> Interpreter::CloseAllFiles()"
                       <<std::endl);
 
     while (mFile.size() != 0) 
     {
        CloseCurrentFile();
     }
-    bbtkDebugMessage("Interpreter",9,"EO Interpreter::CloseAllFiles()"
+    bbtkDebugMessage("interpreter",9,"<== Interpreter::CloseAllFiles()"
                       <<std::endl);
   }
   //=======================================================================
@@ -1425,13 +1558,10 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
 
 
   //=======================================================================
-  /**
-   *  
-   */
   void Interpreter::InterpretCommand( const std::vector<std::string>& words,
                                       CommandInfoType& info )
   {
-    bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretCommand(...)"<<std::endl);
+    bbtkDebugMessage("interpreter",9,"==> Interpreter::InterpretCommand(...)"<<std::endl);
 
     // searches the command keyword
     CommandDictType::iterator c;
@@ -1447,9 +1577,11 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
        HelpCommand(words[0]);
        bbtkError(words[0]<<" : wrong number of arguments");
     }
-
+//std::cout<<"Interpreter::InterpretCommand( const std::vector<std::string>& words,"<<std::endl;
     info = c->second;
-    bbtkDecTab("Interpreter",9);
+
+    bbtkDebugMessage("interpreter",9,"<== Interpreter::InterpretCommand(...)"<<std::endl);
+
   }
   //=======================================================================
 
@@ -1468,7 +1600,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
     {
       if (words[1]=="packages") 
       {
-         GetExecuter()->GetFactory()->PrintPackages(true);
+         GetExecuter()->GetFactory()->PrintHelpListPackages(true);
          return;
       }
       try 
@@ -1479,7 +1611,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
       {
          try 
          {
-            GetExecuter()->GetFactory()->HelpPackage(words[1]);
+            GetExecuter()->GetFactory()->PrintHelpPackage(words[1]);
            if ( mUser != 0 )
              {
                std::string url = 
@@ -1496,7 +1628,8 @@ void Interpreter::Help(const std::vector<std::string>& words)
           try 
             {
               std::string package;
-              GetExecuter()->GetFactory()->HelpBlackBox(words[1],package);
+              GetExecuter()->GetFactory()->PrintHelpDescriptor(words[1],
+                                                               package);
               if ( mUser != 0 )
                 {
                   std::string url = 
@@ -1513,7 +1646,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
             {
               try
                 {
-                  GetExecuter()->ShowRelations(words[1],"0","9999");
+                  GetExecuter()->PrintHelpBlackBox(words[1],"0","9999");
                 }
               catch (bbtk::Exception h){
                 bbtkError("\""<<words[1].c_str()
@@ -1529,12 +1662,12 @@ void Interpreter::Help(const std::vector<std::string>& words)
       {
          if ( words[1]=="packages" )
          {
-            GetExecuter()->GetFactory()->PrintPackages(true,true);
+            GetExecuter()->GetFactory()->PrintHelpListPackages(true,true);
             return;
           }
          try 
          {
-            GetExecuter()->GetFactory()->HelpPackage(words[1],true);
+            GetExecuter()->GetFactory()->PrintHelpPackage(words[1],true);
          }
          catch (bbtk::Exception f) 
          {
@@ -1840,7 +1973,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
   //=======================================================================
   void Interpreter::CommandLineInterpreter()
   {
-    bbtkDebugMessageInc("Interpreter",9,
+    bbtkDebugMessageInc("interpreter",9,
                         "Interpreter::CommandLineInterpreter()"<<std::endl);
 
 #ifdef BBTK_USE_TERMIOS_BASED_PROMPT  
@@ -1858,20 +1991,23 @@ void Interpreter::Help(const std::vector<std::string>& words)
     
     mCommandLine = true;
     bool again = true;
-    bool insideComment = false; // for multiline comment  
+    // bool insideComment = false; // for multiline comment  
+    mInsideComment = false;
     do 
     {
       try
       {
         std::string line;
         GetLineFromPrompt(line);
-        InterpretLine(line, insideComment);
+        DoInterpretLine(line); //, insideComment);
       }
+      /*
       catch (QuitException e)
       {
-       bbtkMessage("Interpreter",1,"Interpreter : Quit"<<std::endl);
+       bbtkMessage("interpreter",1,"Interpreter : Quit"<<std::endl);
         again = false;
       }
+      */
       catch (bbtk::Exception e) 
       {
         e.Print();
@@ -1893,7 +2029,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
 
     std::cout << "Good bye !" << std::endl;
 
-    bbtkDebugDecTab("Interpreter",9);
+    bbtkDebugDecTab("interpreter",9);
   }
 
 //=======================================================================
@@ -1995,7 +2131,7 @@ void  Interpreter::NewGUI(const std::string& boxname,
   if (workspace==0)
     {
       delete s;
-      bbtkError("Interpreter::CreateGUI : could not access the executer currently defined complex box");
+      bbtkError("interpreter::CreateGUI : could not access the executer currently defined complex box");
     }
  
 
@@ -2016,9 +2152,14 @@ void  Interpreter::NewGUI(const std::string& boxname,
       // Get the input descriptor 
       const BlackBoxInputDescriptor* d = box->bbGetDescriptor()->GetInputDescriptor(i->first);
       // If it is a "system" input : skip it
+#ifdef USE_WXWIDGETS
       if ( ( d->GetCreatorTypeInfo() == typeid(AtomicBlackBoxDescriptor)) ||
           ( d->GetCreatorTypeInfo() == typeid(WxBlackBoxDescriptor)) )
        continue;
+#else
+      if ( ( d->GetCreatorTypeInfo() == typeid(AtomicBlackBoxDescriptor)) )
+       continue;
+#endif
       bool widok = true;
       std::string widget,adaptor;
       // try to find a widget adaptor
@@ -2141,7 +2282,7 @@ void  Interpreter::NewGUI(const std::string& boxname,
          {
            //      int o = MessageManager::GetMessageLevel("debug");
            //      if (o<2) MessageManager::SetMessageLevel("debug",2);
-           mVirtualExecuter->GetFactory()->CheckPackages();
+           mVirtualExecuter->GetFactory()->Check();
            //      MessageManager::SetMessageLevel("debug",o);
          }
       }
@@ -2151,6 +2292,17 @@ void  Interpreter::NewGUI(const std::string& boxname,
       }
   }
  //==========================================================================
+
+  /*
+  //==========================================================================
+  // Adds a callback when 'break' command issued
+  void Interpreter::AddBreakObserver( BreakCallbackType c )
+  {
+    mBreakSignal.connect(c);
+  }
+ //==========================================================================
+ */
+
  //==========================================================================
   std::string Interpreter::GetObjectName() const
   {