]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkInterpreter.cxx
no message
[bbtk.git] / kernel / src / bbtkInterpreter.cxx
index 62f523319641ce16d9e5e447d22207fcbd2ebc81..6771d7788013d12bed23d9d1b85aac56b953a004 100644 (file)
@@ -1,20 +1,33 @@
-/*=========================================================================
-                                                                                
+/*=========================================================================                                                                               
   Program:   bbtk
-  Module:    $RCSfile: bbtkInterpreter.cxx,v $ $
+  Module:    $RCSfile: bbtkInterpreter.cxx,v $
   Language:  C++
-  Date:      $Date: 2008/04/25 08:05:23 $
-  Version:   $Revision: 1.65 $
-                                                                                
-  Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
-  l'Image). All rights reserved. See Doc/License.txt or
-  http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
-
-     This software is distributed WITHOUT ANY WARRANTY; without even
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-     PURPOSE.  See the above copyright notices for more information.
-                                                                                
+  Date:      $Date: 2010/09/15 14:17:17 $
+  Version:   $Revision: 1.89 $
 =========================================================================*/
+
+/* ---------------------------------------------------------------------
+
+* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
+* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
+*
+*  This software is governed by the CeCILL-B license under French law and 
+*  abiding by the rules of distribution of free software. You can  use, 
+*  modify and/ or redistribute the software under the terms of the CeCILL-B 
+*  license as circulated by CEA, CNRS and INRIA at the following URL 
+*  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
+*  or in the file LICENSE.txt.
+*
+*  As a counterpart to the access to the source code and  rights to copy,
+*  modify and redistribute granted by the license, users are provided only
+*  with a limited warranty  and the software's author,  the holder of the
+*  economic rights,  and the successive licensors  have only  limited
+*  liability. 
+*
+*  The fact that you are presently reading this means that you have had
+*  knowledge of the CeCILL-B license and that you accept its terms.
+* ------------------------------------------------------------------------ */                                                                         
+
 /**
  *  \file 
  *  \brief class Interpreter :
@@ -26,6 +39,7 @@
 #include "bbtkMessageManager.h"
 #include "bbtkConfigurationFile.h"
 #include "bbtkUtilities.h"
+#include "bbtkAtomicBlackBox.h"
 #include "bbtkWxBlackBox.h"
 #include <sys/stat.h>
 #include <algorithm>
@@ -42,25 +56,52 @@ namespace bbtk
  //=======================================================================
   Interpreter::Pointer Interpreter::New(const std::string& cpp_file) 
   {
-    bbtkDebugMessage("Kernel",9,"Interpreter::New()"<<std::endl);
+    bbtkDebugMessage("kernel",9,"Interpreter::New('"<<cpp_file<<"')"<<std::endl);
     return MakePointer(new Interpreter(cpp_file));
   }
  //=======================================================================
 
+ //=======================================================================
+  Interpreter::Pointer Interpreter::New(VirtualExec::Pointer e) 
+  {
+    bbtkDebugMessage("kernel",9,"Interpreter::New(VirtualExec)"<<std::endl);
+    return MakePointer(new Interpreter(e));
+  }
+ //=======================================================================
+
  //=======================================================================
   Interpreter::Interpreter(const std::string& cpp_file) 
-    :
-    mUser(0),
-    mCommandLine(false),
-    mThrow(false)
   {
+    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);
+  }
+  //=======================================================================
 
+  //=======================================================================
+  void Interpreter::Init(VirtualExec::Pointer e, const std::string& cpp_file) 
+  {
+    mUser = 0;
+    mCommandLine = false;
+    mThrow = false;
     bufferNb =0;  
     bbtk::MessageManager::RegisterMessageType("echo","Level>0 : Prints the output of the 'print' commands of the user.\n\tLevel>1 : Prints the command being interpreted",1);
     bbtk::MessageManager::RegisterMessageType("Interpreter","Messages of the interpreter",0);
     bbtkDebugMessageInc("Interpreter",9,"Interpreter::Interpreter()" <<std::endl);
-    if (cpp_file.size()!=0)
+    if (e)
+      {
+       mVirtualExecuter = e;
+      }
+    else if (cpp_file.size()!=0)
       {
        mVirtualExecuter = boost::static_pointer_cast<VirtualExec>(bbtk::Transcriptor::New(cpp_file));
       }
@@ -72,7 +113,7 @@ namespace bbtk
       }
 
     // Lock this pointer or will auto-destruct !!
-    mVirtualExecuter->SetInterpreter(MakePointer(this,true));
+    if (!e) mVirtualExecuter->SetInterpreter(MakePointer(this,true));
     
     // For the time being, comment out previous line, and
     // uncomment next line to check Transcriptor
@@ -98,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;
@@ -126,8 +183,8 @@ namespace bbtk
     info.argmin = 1;
     info.argmax = 2;
     info.code = cExec;
-    info.syntax = "exec <box | 'freeze' | 'unfreeze' >";
-    info.help = "Executes the black box of name <box> (and connected boxes if needed). If the special keyword 'freeze' is given then freezes any further execution command. 'unfreeze' reverts to normal execution mode.";
+    info.syntax = "exec <box | 'freeze' | 'unfreeze' | 'freeze_no_error' >";
+    info.help = "Executes the black box of name <box> (and connected boxes if needed). If the special keyword 'freeze' is given then freezes any further execution command. 'unfreeze' reverts to normal execution mode. 'freeze_no_error' is like freeze but also skips any error.";
     mCommandDict[info.keyword] = info;
 
     info.keyword = "package";
@@ -151,7 +208,7 @@ namespace bbtk
     info.argmax = 2;
     info.code = cDefine;
     info.syntax = "define <type> [<package>]";
-    info.help = "Begins the definition of a new type of complex black box called <type>. If <package> if provided will create it in the given package.";
+    info.help = "Begins the definition of a new type of complex black box called <type>. If <package> is provided will create it in the given package.";
     mCommandDict[info.keyword] = info;
     
     info.keyword = "endefine";
@@ -166,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;
 
@@ -216,7 +273,7 @@ namespace bbtk
     info.argmax = 0;
     info.code = cReset;
     info.syntax = "reset";
-    info.help = "Deletes all boxes and unloads all packages (bbi is reset to its start state)";
+    info.help = "Deletes all boxes and unloads all packages (reset to start state)";
     mCommandDict[info.keyword] = info;
 
     info.keyword = "author";
@@ -257,14 +314,15 @@ namespace bbtk
     info.argmax = 2;
     info.code = cMessage;
     info.syntax = "message <kind> <level>";
-    info.help = "Sets the level of the kind of messages <kind> to <level>.\n  If kind='All' then sets the level for all kinds. If no kind nor level is passed then prints info on available kinds of messages and their current level.";  mCommandDict[info.keyword] = info;
+    info.help = "Sets the level of the kind of messages <kind> to <level>.\n  If kind='All' then sets the level for all kinds. If no kind nor level is passed then prints info on available kinds of messages and their current level.";  
+    mCommandDict[info.keyword] = info;
 
     info.keyword = "include";
     info.argmin = 1;
     info.argmax = 2;
     info.code = cInclude;
     info.syntax = "include <filename> [source]";
-    info.help = "Includes the file <filename>.\n  'source' : If the keyword 'source' is provided then informs bbi that the included file is the source of the current box definition (Advanced; used to get the right 'Include' field in html doc of packages 'appli' scripts).";
+    info.help = "Includes the file <filename>.\n  'source' : If the keyword 'source' is provided then informs the interpreter that the included file is the source of the current box definition (Advanced; used to get the right 'Include' field in html doc of packages 'appli' scripts).";
     mCommandDict[info.keyword] = info;
 
     info.keyword = "quit";
@@ -313,11 +371,11 @@ namespace bbtk
     info.argmax = 2;
     info.code = cWorkspace;
     info.syntax = "workspace < ( freeze | unfreeze ) | ( rename <newname> ) >";
-    info.help = "Configures the workspace.\n        'freeze' allow to block execution commands while keeping definition commands active. 'unfreeze' turns back the worspace in 'normal' mode.\n      'rename' allow to set a new name to the workspace.";
+    info.help = "Configures the workspace.\n        'freeze' allows to block execution commands while keeping definition commands active. 'unfreeze' turns back the worspace in 'normal' mode.\n      'rename' allow to set a new name to the workspace.";
     mCommandDict[info.keyword] = info;
     */
 
-    bbtkDebugDecTab("Interpreter",9);
+
 
   } 
   //=======================================================================
@@ -330,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 
@@ -360,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;
@@ -373,17 +486,19 @@ 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
       {
        std::stringstream mess;
-       mess << "* ERROR : "<<e.GetMessage()<<std::endl;
+       mess << "* ERROR : "<<e.GetErrorMessage()<<std::endl;
        if (mFileName.size()) {
          mess << "* FILE  : \""<<mFileName.back()<<"\""<<std::endl;
          mess << "* LINE  : "<<mLine.back()<<std::endl;
        }    
+       CloseAllFiles();
        std::cerr << mess.str();
       }
   }
@@ -392,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;
@@ -404,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
       {
@@ -414,6 +543,7 @@ namespace bbtk
          mess << "* FILE  : \""<<mFileName.back()<<"\""<<std::endl;
          mess << "* LINE  : "<<mLine.back()<<std::endl;
        }    
+       CloseAllFiles();
        std::cerr << mess.str();
       }
   }
@@ -422,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;
@@ -434,7 +577,7 @@ namespace bbtk
          line = mLine.back();
        }    
        CloseAllFiles();
-       throw InterpreterError("Unknown exception caught",
+       throw InterpreterException("Unknown exception caught",
                                   in_script,file,line);
       }
     else
@@ -446,134 +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 )
+  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 
     {
-      SwitchToFile(filename);
-
-      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);
-            }
-         
-         InterpretLine(str, insideComment);
-         
-       }//while
-       CloseCurrentFile();
-      }
-    }
+      mStatus = Interpreter_OK;
+      SwitchToFile(filename,source);
+      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
+                       {
+                         DoInterpretLine(str);
+                       }
+                 CATCH_MACRO;
+         }
          
-         InterpretLine(str, insideComment);
-         
-       }//while
-       
+       } 
        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;
   }
   //=======================================================================
 
@@ -581,50 +715,212 @@ 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::commandNew(std::string boxType, std::string boxName)
+    {
+               mVirtualExecuter->Create(boxType,boxName);
+    }
+       
+       void Interpreter::commandDelete(std::string boxName)
+    {
+               mVirtualExecuter->Destroy(boxName);
+    }
 
-  //=======================================================================  
-  /**
-   *
-   */
-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::commandConnection(std::string nodeFrom, std::string outputLabel, std::string nodeTo, std::string inputLabel)
+    {
+               mVirtualExecuter->Connect(nodeFrom,outputLabel,nodeTo,inputLabel);
+    }
+               
+       void Interpreter::commandPackage(std::string packageName)
+    {
+               mVirtualExecuter->BeginPackage(packageName);
+    }
+       
+       void Interpreter::commandEndPackage()
+    {
+               mVirtualExecuter->EndPackage();
+    }
+       
+       void Interpreter::commandDefine(std::string name, std::string pack, std::string scriptfilename)
+    {
+               mVirtualExecuter->Define(name,pack,scriptfilename);
+    }
+
+       void Interpreter::commandEndDefine()
+    {
+               mVirtualExecuter->EndDefine();
+    }
 
+       void Interpreter::commandKind(std::string kind)
+    {
+               mVirtualExecuter->Kind(kind);
+    }
+       
+       void Interpreter::commandPrint(std::string value)
+    {
+               mVirtualExecuter->Print(value);
+    }
+       
+       
+       void Interpreter::commandExec(std::string word)
+    {
+               if (word=="freeze") 
+               {
+                       mVirtualExecuter->SetNoExecMode(true);
+                       mThrow = false;
+               }
+               else if (word=="freeze_no_error") 
+               {
+                       mVirtualExecuter->SetNoExecMode(true);
+                       mVirtualExecuter->SetNoErrorMode(true);
+                       mThrow = false;
+               }
+               else if (word=="unfreeze") 
+               {
+                       mVirtualExecuter->SetNoExecMode(false);
+                       mVirtualExecuter->SetNoErrorMode(false);
+               }
+               else
+               {
+                       mVirtualExecuter->Execute(word);
+               } // if
+    }
+       
+       
+       void Interpreter::commandInput(std::string name, std::string box, std::string input,std::string  help)
+    {
+               mVirtualExecuter->DefineInput(name,box,input,help);
+    }
+       
+       void Interpreter::commandOutput(std::string name, std::string box, std::string output,std::string  help)
+    {
+               mVirtualExecuter->DefineOutput(name,box,output,help);
+    }
+       
+       void Interpreter::commandSet(std::string box, std::string input, std::string value)
+    {
+               mVirtualExecuter->Set(box,input,value);
+    }
+
+       void Interpreter::commandAuthor(std::string author)
+    {
+               mVirtualExecuter->Author(author);
+    }
+
+       void Interpreter::commandCategory(std::string categorytype)
+    {
+               mVirtualExecuter->Category(categorytype);
+    }
+       
+       
+       
+       void Interpreter::commandDescription(std::string description)
+    {
+               mVirtualExecuter->Description(description);
+    }
+
+       
+       void Interpreter::commandClear()
+    {
+               mVirtualExecuter->Clear();
+    }
+       
+       void Interpreter::commandInclude(std::string word, bool ok)
+    {
+               // if 'source' was given (words.size()==3) then tell to set the 
+               // source file name of the current complex box with the full file name included
+               if (mCommandLine)
+               {
+                       InterpretFile(word, ok ); 
+               }
+               else
+               {
+                       SwitchToFile(word , ok );
+               }
+    }
+       
+       
+       void Interpreter::commandLoad(std::string packageName)
+    {
+               GetExecuter()->LoadPackage(packageName);
+    }
+
+       void Interpreter::commandUnload(std::string packageName)
+    {
+               GetExecuter()->UnLoadPackage(packageName);
+    }
+       
+       void Interpreter::commandBreak()
+    {
+           /*
+                std::cout << "BreakException(" 
+                <<in_script<<","
+                <<file<<","
+                <<line<<")"<<std::endl;
+                */
+               bbtkError("break");//,in_script,file,line);
+           //      throw BreakException(in_script,file,line);
+    }
+       
+       void Interpreter::commandQuit()
+    {
+               bbtkError("quit");//,in_script,file,line);
+               //throw QuitException(in_script,file,line);
+    }
+       
+       void Interpreter::commandMessage()
+    {
+               mVirtualExecuter->HelpMessages();
+    }
+       
+//ups2 EED Borrame     
+       void Interpreter::commandMessage(std::string kind, std::string levelstr)
+    {
+               int level=0;
+               sscanf(levelstr.c_str(),"%d",&level);
+               mVirtualExecuter->SetMessageLevel(kind,level);
+
+    }
+       
+       
+       
+  //=======================================================================  
+  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;
     }
 
@@ -632,201 +928,283 @@ 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;
+
+//ups1 EED borrame       
+    // message command
+    if (command.code==cMessage)
+      {
+       if (words.size()<3)
+         {
+                 commandMessage();
+//EED Borrame      mVirtualExecuter->HelpMessages();
+         }
+        else
+         {
+               commandMessage(words[1],words[2]);
+//EED Borrame          sscanf(words[2].c_str(),"%d",&level);
+//EED Borrame      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;
+           */
+                 commandBreak();
+//EED Borrame      bbtkError("break");//,in_script,file,line);
+           //      throw BreakException(in_script,file,line);
+         }       
+       else 
+         {
+                 commandQuit();
+//EED Borrame      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]);
+               commandNew(words[1],words[2]);
+//EED Borrame        mVirtualExecuter->Create(words[1],words[2]);
         break;
 
       case cDelete :
-       mVirtualExecuter->Destroy(words[1]);
+                         commandDelete(words[1]);
+//EED Borrame  mVirtualExecuter->Destroy(words[1]);
         break;
 
       case cConnect :
         Utilities::SplitAroundFirstDot(words[1],left,right);
         Utilities::SplitAroundFirstDot(words[2],left2,right2);      
-        mVirtualExecuter->Connect(left,right,left2,right2);
+        commandConnection(left,right,left2,right2);
+//EED Borrame        mVirtualExecuter->Connect(left,right,left2,right2);
         break;
 
       case cPackage :
-        mVirtualExecuter->BeginPackage(words[1]);
+                         commandPackage(words[1]);
+//EED Borrame                mVirtualExecuter->BeginPackage(words[1]);
         break;
 
       case cEndPackage :
-        mVirtualExecuter->EndPackage();
+                         commandEndPackage();
+//EED Borrame        mVirtualExecuter->EndPackage();
         break;
 
       case cDefine :
         if (mFileName.size()>0) 
         {
-         filename = mIncludeFileName.back(); //Utilities::get_file_name(mFileName.back());
+//???                  commandDefine(????);
+                  filename = mFileName.back(); //mIncludeFileName.back(); //Utilities::get_file_name(mFileName.back());
         }
         if (words.size()==2) 
         {
-           mVirtualExecuter->Define(words[1],"",filename);
+                       commandDefine(words[1],"",filename);
+//EED Borrame           mVirtualExecuter->Define(words[1],"",filename);
         }
         else
         {
-           mVirtualExecuter->Define(words[1],words[2],filename);
+                       commandDefine(words[1],words[2],filename);
+//EED Borrame           mVirtualExecuter->Define(words[1],words[2],filename);
         }
         break;
 
       case cEndDefine :
-        mVirtualExecuter->EndDefine();
+               commandEndDefine();
+//EED Borrame        mVirtualExecuter->EndDefine();
         break;
 
       case cKind :
-        mVirtualExecuter->Kind(words[1]);
+                       commandKind(words[1]);
+//EED Borrame        mVirtualExecuter->Kind(words[1]);
         break;
 
       case cPrint :
-        mVirtualExecuter->Print(words[1]);
+                         commandPrint(words[1]);
+//EED Borrame        mVirtualExecuter->Print(words[1]);
         break;
-        
+                         
       case cExec :
-        if (words[1]=="freeze") 
-          mVirtualExecuter->SetNoExecMode(true);
-        else if (words[1]=="unfreeze") 
-          mVirtualExecuter->SetNoExecMode(false);
-        else
-          mVirtualExecuter->Execute(words[1]);
+                         commandExec(words[1]);
+//EED Borrame        if (words[1]=="freeze") 
+//EED Borrame    {
+//EED Borrame      mVirtualExecuter->SetNoExecMode(true);
+//EED Borrame      mThrow = false;
+//EED Borrame    }
+//EED Borrame  else if (words[1]=="freeze_no_error") 
+//EED Borrame    {
+//EED Borrame      mVirtualExecuter->SetNoExecMode(true);
+//EED Borrame      mVirtualExecuter->SetNoErrorMode(true);
+//EED Borrame      mThrow = false;
+//EED Borrame    }
+//EED Borrame  else if (words[1]=="unfreeze") 
+//EED Borrame    {
+//EED Borrame      mVirtualExecuter->SetNoExecMode(false);
+//EED Borrame      mVirtualExecuter->SetNoErrorMode(false);
+//EED Borrame    }
+//EED Borrame  else
+//EED Borrame    {
+//EED Borrame      mVirtualExecuter->Execute(words[1]);
+//EED Borrame    }
+                         
         break;
 
       case cInput :
         Utilities::SplitAroundFirstDot(words[2],left,right);
-        mVirtualExecuter->DefineInput(words[1],left,right,words[3]);
+                         commandInput(words[1],left,right,words[3]);
+//EED Borrame        mVirtualExecuter->DefineInput(words[1],left,right,words[3]);
         break;
 
       case cOutput :
         Utilities::SplitAroundFirstDot(words[2],left,right);
-        mVirtualExecuter->DefineOutput(words[1],left,right,words[3]);
+               commandOutput(words[1],left,right,words[3]);
+//EED Borrame         mVirtualExecuter->DefineOutput(words[1],left,right,words[3]);
         break;
 
       case cSet :
         Utilities::SplitAroundFirstDot(words[1],left,right);
-        mVirtualExecuter->Set(left,right,words[2]);
+               commandSet(left,right,words[2]);
+//EED Borrame        mVirtualExecuter->Set(left,right,words[2]);
         break;
 
       case cAuthor :
-        mVirtualExecuter->Author(words[1]);
+               commandAuthor(words[1]);
+//EED Borrame        mVirtualExecuter->Author(words[1]);
         break;
 
       case cNewGUI :
-        NewGUI(words[1],words[2]);
+               commandNewGUI(words[1],words[2]);
         break;
 
       case cCategory :
-        mVirtualExecuter->Category(words[1]);
+               commandCategory(words[1]);
+//EED Borrame   mVirtualExecuter->Category(words[1]);
         break;
 
       case cIndex :
         if (words.size()==1)
-            Index("tmp_index.html");
+                       commandIndex("tmp_index.html");
         else if (words.size()==2)
-            Index(words[1]);
+                       commandIndex(words[1]);
         else if (words.size()==3)
-            Index(words[1],words[2]);
+                       commandIndex(words[1],words[2]);
         break;
 
       case cDescription :
-        mVirtualExecuter->Description(words[1]);
+               commandDescription(words[1]);
+//EED Borrame        mVirtualExecuter->Description(words[1]);
         break;
 
       case cHelp :
-        Help(words);
+        commandHelp(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);
+        commandGraph(words);
         break;
 
       case cConfig :
-        Config();
+        commandConfig();
         break;
 
       case cReset :  
-       Reset();
+       commandReset();
+        break;
+       
+      case cClear :  
+               commandClear();
+//EED Borrame          mVirtualExecuter->Clear();
         break;
 
       case cInclude :
-        if (mCommandLine)
-        {
-           InterpretFile(words[1]); 
-        }
-        else
-        {
-            SwitchToFile(words[1]);
-        }
-       // if 'source' was given
-       if (words.size()==3) 
-         {
-           GetExecuter()->SetCurrentFileName(words[1]);
-         }
-        break;
+                         commandInclude( words[1] , (words.size()==3) );
+//EED Borrame          // if 'source' was given (words.size()==3) then tell to set the 
+//EED Borrame          // source file name of the current complex box with the full file name included
+//EED Borrame                  if (mCommandLine)
+//EED Borrame        {
+//EED Borrame           InterpretFile(words[1],(words.size()==3)); 
+//EED Borrame        } else{
+//EED Borrame            SwitchToFile(words[1],(words.size()==3) );
+//EED Borrame        }
+               break;
 
       case cLoad:
-        GetExecuter()->LoadPackage(words[1]);
+               commandLoad( words[1] );
+//EED Borrame        GetExecuter()->LoadPackage(words[1]);
         break;
 
       case cUnload:
-        GetExecuter()->UnLoadPackage(words[1]);
-        break;
-
-      case cQuit :
-        throw QuitException();
+               commandUnload( words[1] );
+//EED Borrame        GetExecuter()->UnLoadPackage(words[1]);
         break;
 
       case cDebug :
-       if (words.size()==2) Debug(words[1]);
-       else Debug("");
+                         if (words.size()==2) commandDebug(words[1]);
+                               else commandDebug("");
         break;
+                         
        /* obsolete
       case cWorkspace :
         if (words.size() == 2) 
@@ -844,8 +1222,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);
+    
+  }
   //=======================================================================  
 
 
@@ -853,12 +1233,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;
@@ -872,7 +1249,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;
        }
@@ -880,20 +1257,19 @@ 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);
  }
   //=======================================================================
 
 
   //=======================================================================
-  void Interpreter::Reset()
+  void Interpreter::commandReset()
   {
     // Cannot close all files if the reset command is read from a file !
-    //    CloseAllFiles();
+    CloseAllFiles();
     mFileNameHistory.clear();
     this->mVirtualExecuter->Reset();
   }
@@ -908,7 +1284,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")
@@ -970,7 +1346,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);
  }
 */
 
@@ -980,7 +1356,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
    */
 
   // =========================================================================
-  void Interpreter::SwitchToFile( const std::string& name )
+  void Interpreter::SwitchToFile( const std::string& name , bool source )
   {
   // Note : in the following :
   // name : the user supplied name 
@@ -992,8 +1368,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
@@ -1003,7 +1379,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);
 
@@ -1011,9 +1387,9 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     std::string upath;
     pkgname = Utilities::ExtractScriptName(name,upath);
 
-    bbtkMessage("Interpreter",3,
-               "extract : pkgname [" << pkgname
-                << "] upath [" << upath << "]" << std::endl);
+    bbtkMessage("interpreter",3,
+               "package name:[" << pkgname
+                << "] path:[" << upath << "]" << std::endl);
     bool fullnameGiven = false; 
     bool foundFile     = false;
 
@@ -1021,16 +1397,23 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     // relative (e.g. std/boxes/*) or absolute 
     if (pkgname == "*") 
       {
-       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() );
+           //      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;
+           for (i=ConfigurationFile::GetInstance().Get_bbs_paths().begin();
+                i!=ConfigurationFile::GetInstance().Get_bbs_paths().end();
+                i++)
+             {
+               script_paths.push_back(*i);
+             }
          }
        // ==== absolute path provided 
        else if (upath[0]=='/' || upath[1] == ':' ) 
@@ -1048,85 +1431,82 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
        // 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);
-                // we *really* want '.' to be the current working directory
-                if (full_path == ".") {
-                  char buf[2048]; // for getcwd
-                  char * currentDir = getcwd(buf, 2048);
-                  std::string cwd(currentDir);
-                  full_path = currentDir;
-                } // if full_path
-           
-                full_path += ConfigurationFile::GetInstance().Get_file_separator();
-                full_path += upath;
-
-                if ( Utilities::IsDirectory( full_path ) )
-                  {
-                    script_paths.push_back(full_path);
-                  }
-              } 
-            if (script_paths.empty())
-              {
-                bbtkError("no '"<<upath<<"' subdir found in search paths" 
-                          << std::endl);
-              }
-
+           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);
+               // we *really* want '.' to be the current working directory
+               if (full_path == ".") 
+                 {
+                   char buf[2048]; // for getcwd
+                   char * currentDir = getcwd(buf, 2048);
+                   std::string cwd(currentDir);
+                   full_path = currentDir;
+                 } // if full_path
+               
+               full_path += ConfigurationFile::GetInstance().Get_file_separator();
+               full_path += upath;
+               
+               if ( Utilities::IsDirectory( full_path ) )
+                 {
+                   script_paths.push_back(full_path);
+                 }
+             } 
+           if (script_paths.empty())
+             {
+               bbtkError("no '"<<upath<<"' subdir found in search paths" 
+                         << std::endl);
+             }
          }
+       
+       
        // === search paths list complete : now explore it
-
-
+       int nbBssFiles = 0;     
+       // ==== relative name, iterate + load all .bbs/.bbp files
        std::vector<std::string>::iterator i;
-       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++)
          {
-           bbtkMessage("Interpreter",1,
+           bbtkMessage("interpreter",1,
                        "--> Looking in '" << *i << "'" << std::endl);
-        
            
            Filenames.clear();
-           int nbFiles = Utilities::Explore(*i, false, Filenames);
+           //int nbFiles = 
+           Utilities::Explore(*i, false, Filenames);
            
-           nbBssFiles = 0;
            for (std::vector<std::string>::iterator j = Filenames.begin(); 
                 j!= Filenames.end(); ++j)
              {
                int lgr = (*j).size();
-               if (lgr < 5)
-                 continue;  // ignore non .bbs file
-               if ((*j).substr(lgr-4, 4) != ".bbs")
-                 continue;
+               if (lgr < 5) continue;  
+               // ignore non .bbp file
+               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 vector
-           
-           if (nbBssFiles==0)
-             {
-               bbtkMessage("Interpreter",1,
-                           "  --> No .bbs found"<< std::endl);
-             } 
-           else 
-             {
-               bbtkMessage("Interpreter",1,
-                           "  --> "<<nbBssFiles<<" .bbs found"<< std::endl);
-               SwitchToStream(stream);
-             }
-           
-           //break; // a directory was found; we stop iterating
-           // LG : No! We want all files included !
-         } // for vector
+             } // for (std::vector...
+         } // for (i=script_...
+
+       // === Result ...
+       if (nbBssFiles==0)
+         {
+           bbtkMessage("interpreter",1,
+                       "  --> No .bbp found"<< std::endl);
+         } 
+       else 
+         {
+           bbtkMessage("interpreter",1,
+                       "  --> "<<nbBssFiles<<" .bbp found"<< std::endl);
+           SwitchToStream(stream);
+         }
        return;
       }  
     //=============== end pkgname=="*" ===========
-
-
+    
+    
     // 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)
     // we trust him, and try to expland the directory name
@@ -1143,65 +1523,104 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
       // allow user to always forget ".bbs"
       int l = fullPathScriptName.size();
 
-      if (l!=0) {
-
-      if (l>4)
-      {
-         if (fullPathScriptName.substr(l-4, 4) != ".bbs")
+      if (l!=0) 
+         {
+         if ((fullPathScriptName.substr(l-4, 4) != ".bbs")&&
+                        (fullPathScriptName.substr(l-4, 4) != ".bbp"))
          {
-            fullPathScriptName = fullPathScriptName + ".bbs";
-         }
-      }
-      else
-      {
-         fullPathScriptName = fullPathScriptName + ".bbs";   
-      }
-
-      if ( Utilities::FileExists(fullPathScriptName))
-      {
-        foundFile = true;
-      }
-    } // endif l != 0
+                       std::string tfullPathScriptName = fullPathScriptName + ".bbs";
+                       if ( Utilities::FileExists(tfullPathScriptName) )
+                       {
+                               fullPathScriptName = tfullPathScriptName;
+                               foundFile = true;
+                       }
+                       else 
+                       {
+                               tfullPathScriptName = fullPathScriptName + ".bbp";
+                               if ( Utilities::FileExists(tfullPathScriptName) )
+                               {
+                                       fullPathScriptName = tfullPathScriptName;
+                                       foundFile = true;
+                               }
+                       }
+                }
+                else 
+                {
+                       if ( Utilities::FileExists(fullPathScriptName) )
+                       {
+                               foundFile = true;
+                       }
+                }
+         } // 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);
+         {
+               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;
+               }
          
-         // 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
-
+               std::string tfullPathScriptName = Utilities::MakePkgnameFromPath(path, name, false);
+//Addition JCP tfullPathScriptName.size()>=4 
+               if(tfullPathScriptName.size()>=4){
+                       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) )
+                               {
+                                       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() )
-    }
-    
+  }
+
     if (!foundFile)
       {
        if (fullnameGiven)
@@ -1210,11 +1629,14 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
          else
             bbtkError("Script ["<<fullPathScriptName<<"] not found");
        else
-          bbtkError("No ["<<pkgname<<".bbs] script found");
+          bbtkError("No ["<<pkgname<<".bbs/.bbp] script found");
        return;
       }
     else
+       {
       LoadScript(fullPathScriptName,name);
+         if (source) GetExecuter()->SetCurrentFileName(fullPathScriptName);
+       }
     
     return;
   }
@@ -1224,7 +1646,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_" ;
@@ -1244,7 +1668,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(),
@@ -1263,7 +1691,7 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
         return;
     }
 
-    bbtkMessage("Interpreter",1,"   -->[" << fullPathScriptName 
+    bbtkMessage("interpreter",1,"   -->[" << fullPathScriptName 
                << "] found" << std::endl);
 
     mFile.push_back(s);
@@ -1274,23 +1702,21 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
 
     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();
@@ -1301,28 +1727,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);
   }
   //=======================================================================
@@ -1330,13 +1753,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;
@@ -1346,22 +1766,24 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
     }
 
     // tests the number of args 
-    if ( ( words.size()-1 < c->second.argmin ) ||
-         ( words.size()-1 > c->second.argmax ) )
+    if ( ( ((int)words.size())-1 < c->second.argmin ) ||
+         ( ((int)words.size())-1 > c->second.argmax ) )
     {
        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);
+
   }
   //=======================================================================
 
 
   //=======================================================================
   /// Displays help on all the commands
-void Interpreter::Help(const std::vector<std::string>& words)
+void Interpreter::commandHelp(const std::vector<std::string>& words)
 {
     unsigned int nbarg = words.size()-1;
 
@@ -1373,7 +1795,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
     {
       if (words[1]=="packages") 
       {
-         GetExecuter()->GetFactory()->PrintPackages(true);
+         GetExecuter()->GetFactory()->PrintHelpListPackages(true);
          return;
       }
       try 
@@ -1384,7 +1806,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 = 
@@ -1401,7 +1823,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 = 
@@ -1418,7 +1841,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()
@@ -1434,12 +1857,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) 
          {
@@ -1460,7 +1883,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
 
    //===================================================================    
   /// Displays the Configuration
-  void Interpreter::Config() const
+  void Interpreter::commandConfig() const
   {
     ConfigurationFile::GetInstance().GetHelp(1);
   }  
@@ -1492,7 +1915,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
     c = mCommandDict.find(s);
     if ( c == mCommandDict.end() ) {
       bbtkError(s<<" : Unknown command");
-    }
+    }  
     //    std::cout << " " << s << " : "<<  std::endl;
     //    CommandParamDictType::iterator i;
     //    for ( i =  c->second.begin();
@@ -1546,10 +1969,10 @@ void Interpreter::Help(const std::vector<std::string>& words)
   void Interpreter::GetLineFromPrompt(std::string& s)
   {
     int c;
-    int ind=0;
+    unsigned int ind=0;
 
-    int MAX_LINE_SIZE = 160;
-    int MAX_HISTORY_SIZE = 100;
+    unsigned int MAX_LINE_SIZE = 160;
+    unsigned int MAX_HISTORY_SIZE = 100;
 
     char* newline = new char[MAX_LINE_SIZE];
     memset(newline,0,MAX_LINE_SIZE);
@@ -1557,7 +1980,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
     memset(histline,0,MAX_LINE_SIZE);
 
     char* line = newline;
-    int hist = mHistory.size();
+    unsigned int hist = mHistory.size();
 
     write(1,"> ",2);
     while(1)
@@ -1745,7 +2168,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  
@@ -1763,20 +2186,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();
@@ -1798,11 +2224,11 @@ void Interpreter::Help(const std::vector<std::string>& words)
 
     std::cout << "Good bye !" << std::endl;
 
-    bbtkDebugDecTab("Interpreter",9);
+    bbtkDebugDecTab("interpreter",9);
   }
 
 //=======================================================================
-void Interpreter::Graph(const std::vector<std::string>& words)
+void Interpreter::commandGraph(const std::vector<std::string>& words)
 {
   std::string page;
     bool system_display = true;
@@ -1847,7 +2273,7 @@ void Interpreter::Graph(const std::vector<std::string>& words)
 
 
 //=======================================================================
-void  Interpreter::Index(const std::string& filename, 
+void  Interpreter::commandIndex(const std::string& filename, 
                         const std::string& type)
 {
   Factory::IndexEntryType t;
@@ -1862,7 +2288,7 @@ void  Interpreter::Index(const std::string& filename,
 
 
 //=======================================================================
-void  Interpreter::NewGUI(const std::string& boxname,
+void  Interpreter::commandNewGUI(const std::string& boxname,
                             const std::string& instanceName)
 {
   if (mRealExecuter.expired())
@@ -1900,7 +2326,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");
     }
  
 
@@ -1910,7 +2336,7 @@ void  Interpreter::NewGUI(const std::string& boxname,
 
   BlackBox::Pointer box = workspace->GetPrototype()->bbGetBlackBox(boxname);
   //  BlackBox::InputConnectorMapType incm = box->bbGetInputConnectorMap();
-  int nb = 0;
+  // int nb = 0;
   BlackBox::InputConnectorMapType::iterator i;
   for (i=box->bbGetInputConnectorMap().begin();
        i!=box->bbGetInputConnectorMap().end();
@@ -1921,9 +2347,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
@@ -2034,7 +2465,7 @@ void  Interpreter::NewGUI(const std::string& boxname,
 
 
  //==========================================================================
-  void Interpreter::Debug(const std::string& name)
+  void Interpreter::commandDebug(const std::string& name)
   {
     if ((name.length()==2)&&(name[0]=='-'))
       {
@@ -2046,7 +2477,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);
          }
       }
@@ -2056,6 +2487,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
   {