]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkInterpreter.cxx
*** empty log message ***
[bbtk.git] / kernel / src / bbtkInterpreter.cxx
index fc5f3f18638104b9d3046cc162c02de60a6c5259..0bb789483e372f35b596a5e87f28c034a660770c 100644 (file)
@@ -2,8 +2,8 @@
   Program:   bbtk
   Module:    $RCSfile: bbtkInterpreter.cxx,v $
   Language:  C++
-  Date:      $Date: 2008/12/12 12:11:21 $
-  Version:   $Revision: 1.79 $
+  Date:      $Date: 2008/12/15 09:04:47 $
+  Version:   $Revision: 1.81 $
 =========================================================================*/
 
 /* ---------------------------------------------------------------------
@@ -142,6 +142,14 @@ namespace bbtk
     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;
@@ -382,7 +390,8 @@ namespace bbtk
   //=======================================================================
 
 
-  InterpreterError::InterpreterError( const std::string& message,
+  //=======================================================================
+  InterpreterException::InterpreterException( const std::string& message,
                                      bool in_script_file,
                                      const std::string& script_file,
                                      int script_line 
@@ -393,7 +402,9 @@ namespace bbtk
       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 
@@ -405,12 +416,19 @@ namespace bbtk
   {
   }
   //=======================================================================
-  void Interpreter::CatchInterpreterException( const InterpreterError& e )
+
+
+  //=======================================================================
+  void Interpreter::CatchInterpreterException( const InterpreterException& e )
   {
     if (mThrow) 
       {
-       CloseAllFiles();
-       throw InterpreterError(e);
+       if (e.GetErrorMessage()!="break")
+         {
+           mStatus = Interpreter_ERROR;               
+           CloseAllFiles();
+         }
+       throw InterpreterException(e);
       }
     else
       {
@@ -421,6 +439,7 @@ namespace bbtk
            mess << "* FILE  : \""<<e.GetScriptFile()<<"\""<<std::endl;
            mess << "* LINE  : "<<e.GetScriptLine()<<std::endl;
          }
+       CloseAllFiles();
        std::cerr << mess.str();
       }
   }
@@ -429,6 +448,7 @@ namespace bbtk
   //=======================================================================
   void Interpreter::CatchBbtkException( const bbtk::Exception& e )
   {
+    mStatus = Interpreter_ERROR;              
     if (mThrow) 
       {
        bool in_script = false;
@@ -440,8 +460,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
       {
@@ -451,6 +472,7 @@ namespace bbtk
          mess << "* FILE  : \""<<mFileName.back()<<"\""<<std::endl;
          mess << "* LINE  : "<<mLine.back()<<std::endl;
        }    
+       CloseAllFiles();
        std::cerr << mess.str();
       }
   }
@@ -459,6 +481,7 @@ namespace bbtk
   //=======================================================================
   void Interpreter::CatchStdException( const std::exception& e )
   {  
+    mStatus = Interpreter_ERROR;              
     if (mThrow) 
       {
        bool in_script = false;
@@ -471,7 +494,7 @@ namespace bbtk
          line = mLine.back();
        }    
        CloseAllFiles();
-       throw InterpreterError(e.what(),in_script,file,line);
+       throw InterpreterException(e.what(),in_script,file,line);
       }
     else
       {
@@ -481,6 +504,7 @@ namespace bbtk
          mess << "* FILE  : \""<<mFileName.back()<<"\""<<std::endl;
          mess << "* LINE  : "<<mLine.back()<<std::endl;
        }    
+       CloseAllFiles();
        std::cerr << mess.str();
       }
   }
@@ -489,6 +513,7 @@ namespace bbtk
   //=======================================================================
   void Interpreter::CatchUnknownException()
   {
+    mStatus = Interpreter_ERROR;              
     if (mThrow) 
       {
        bool in_script = false;
@@ -501,7 +526,7 @@ namespace bbtk
          line = mLine.back();
        }    
        CloseAllFiles();
-       throw InterpreterError("Unknown exception caught",
+       throw InterpreterException("Unknown exception caught",
                                   in_script,file,line);
       }
     else
@@ -513,46 +538,35 @@ 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 (InterpreterError e)                   \
-    {                                          \
-      status = Interpreter_ERROR;              \
+  
+#define CATCH_MACRO                                    \
+  catch (InterpreterException e)                       \
+    {                                                  \
       CatchInterpreterException(e);                    \
-    }                                          \
-  catch (bbtk::Exception e)                    \
-    {                                          \
-      status = Interpreter_ERROR;              \
-      CatchBbtkException(e);                   \
-    }                                          \
-  catch (std::exception& e)                    \
-    {                                          \
-      status = Interpreter_ERROR;              \
-      CatchStdException(e);                    \
-    }                                          \
-  catch (...)                                  \
-    {                                          \
-      status = Interpreter_ERROR;              \
-      CatchUnknownException();                 \
+    }                                                  \
+  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);
@@ -560,52 +574,28 @@ namespace bbtk
     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);
+    bbtkDebugMessage("Interpreter",9,
+                    "EO Interpreter::InterpretFile(\""
+                    <<filename<<"\")"<<std::endl);
     bbtkDecTab("Interpreter",9);
 
     mCommandLine = exm;
     
-    return status;
+    return mStatus;
   }
   //=======================================================================
 
 
   //=======================================================================
-  /**
-   *  
-   */
   Interpreter::ExitStatus 
   Interpreter::InterpretBuffer( std::stringstream* buffer )
   {
@@ -614,13 +604,32 @@ namespace bbtk
     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",9,"EO Interpreter::InterpretBuffer()"<<std::endl);
+    bbtkDecTab("Interpreter",9);
+    
+    mCommandLine = exm;
+    return mStatus;
+  }
+  //=======================================================================
+
+  //=======================================================================
+  /// Interprets the currently open streams
+  Interpreter::ExitStatus Interpreter::InterpretCurrentStreams()
+  {
+    bbtkDebugMessageInc("Interpreter",9,
+                       "Interpreter::InterpretCurrentStreams()"<<std::endl);
+
+    while (mFile.size()>0) 
       {
        while (!mFile.back()->eof()) {
          mLine.back()++;
@@ -635,21 +644,13 @@ namespace bbtk
             }
          try
            {
-             InterpretLine(str, insideComment);
+             DoInterpretLine(str);
            }
          CATCH_MACRO;
-       }//while
+       } 
        CloseCurrentFile();
       }
-    }
-    CATCH_MACRO;
-    
-    CloseAllFiles();
-    bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretBuffer()"<<std::endl);
-    bbtkDecTab("Interpreter",9);
-    
-    mCommandLine = exm;
-    return status;
+    return mStatus;
   }
   //=======================================================================
 
@@ -659,33 +660,29 @@ namespace bbtk
   {
     bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretLine('"<<line<<"')"<<std::endl);
 
-    ExitStatus status = Interpreter_OK;
-
     try 
     {
-      bool insideComment = false;
-      InterpretLine(line, insideComment);
+      mStatus = Interpreter_OK;
+      mInsideComment = false;
+      DoInterpretLine(line );
     }
     CATCH_MACRO;
-  
-
+    
+    
     bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretLine()"
                     <<std::endl);
     bbtkDecTab("Interpreter",9);
     
-    return status;
+    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 )
+  {
+    bbtkDebugMessageInc("Interpreter",9,"Interpreter::DoInterpretLine(\""<<line<<"\")"<<std::endl);
+    
     std::vector<std::string> words;
     SplitLine(line,words);
 
@@ -710,7 +707,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
     {  
        bbtkDebugDecTab("Interpreter",9);
        bbtkMessage("Interpreter",9,"In multiline comment"<<std::endl);
-       insideComment = true;
+       mInsideComment = true;
        return;
     }
 
@@ -718,15 +715,15 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
     {  
        bbtkDebugDecTab("Interpreter",9);
        bbtkMessage("Interpreter",9,"Out multiline comment"<<std::endl);
-       if ( !insideComment ) {
+       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);
@@ -743,8 +740,61 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
     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;
+      }   
+
+    // other cammands
     switch (command.code) 
-    {
+      {
       case cNew :
         mVirtualExecuter->Create(words[1],words[2]);
         break;
@@ -861,17 +911,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);
@@ -884,8 +923,8 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
       case cReset :  
        Reset();
         break;
-
-     case cClear :  
+       
+      case cClear :  
        mVirtualExecuter->Clear();
         break;
 
@@ -910,10 +949,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("");
@@ -944,10 +979,7 @@ 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);
 
@@ -984,7 +1016,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();
   }
@@ -1408,11 +1440,9 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
 
        return;
   }
+  //=======================================================================
 
   //=======================================================================
-  /**
-   *  
-   */
   void Interpreter::CloseCurrentFile()
   {
     bbtkDebugMessage("Interpreter",9,"Interpreter::CloseCurrentFile()"
@@ -1444,9 +1474,6 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
   //=======================================================================
 
  //=======================================================================
-  /**
-   *  
-   */
   void Interpreter::CloseAllFiles()
   {
     bbtkDebugMessage("Interpreter",9,"Interpreter::CloseAllFiles()"
@@ -1464,9 +1491,6 @@ void Interpreter::SwitchToStream( std::stringstream* stream )
 
 
   //=======================================================================
-  /**
-   *  
-   */
   void Interpreter::InterpretCommand( const std::vector<std::string>& words,
                                       CommandInfoType& info )
   {
@@ -1897,20 +1921,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);
         again = false;
       }
+      */
       catch (bbtk::Exception e) 
       {
         e.Print();
@@ -2190,6 +2217,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
   {