]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkInterpreter.cxx
Upgrade Doxyfile
[bbtk.git] / kernel / src / bbtkInterpreter.cxx
index 28dbfe43798c7b94b7c46668c8df21f3035bdc79..22bd9fb69d3a20d0805876730979521c247c1065 100644 (file)
@@ -3,8 +3,8 @@
   Program:   bbtk
   Module:    $RCSfile: bbtkInterpreter.cxx,v $ $
   Language:  C++
-  Date:      $Date: 2008/03/03 14:55:55 $
-  Version:   $Revision: 1.39 $
+  Date:      $Date: 2008/03/14 14:58:53 $
+  Version:   $Revision: 1.44 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -37,7 +37,7 @@
 namespace bbtk
 {
 
-Interpreter* Interpreter::mGlobalInterpreter = NULL;
+  //Interpreter* Interpreter::mGlobalInterpreter = NULL;
 
  //=======================================================================
  /**
@@ -45,15 +45,18 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL;
    */
   Interpreter::Interpreter() 
     :
+#ifdef _USE_WXWIDGETS_
+    mWxConsole(0),
+#endif
     mCommandLine(false)
   {
+bufferNb =0;  
     bbtk::MessageManager::RegisterMessageType("Echo","Level>0 : Prints the 'echo' 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);
  
-    mGlobalInterpreter = this;
-
     mExecuter = new bbtk::Executer();
+    mExecuter->SetInterpreter(this);
     
     // For the time being, comment out previous line, and
     // uncomment next line to check Transcriptor
@@ -291,7 +294,6 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL;
 std::cout << "=========================================~Interpreter()" << std::endl;
     bbtkDebugMessageInc("Interpreter",9,"Interpreter::~Interpreter()" <<std::endl);
     delete mExecuter;
-    //delete mFactory;
 
     bbtkDebugDecTab("Interpreter",9);
   }
@@ -305,24 +307,42 @@ std::cout << "=========================================~Interpreter()" << std::e
   void Interpreter::InterpretFile( const std::string& filename )
   {
     bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
-
+  //  std::cout << "==========================================Entree InterpretFile ["<<filename<<"] try SwitchToFile "<<std::endl;
     bool exm = mCommandLine;
     mCommandLine = false;
 
     try 
     {
       SwitchToFile(filename);
+
+/*
+      for( std::vector<std::string>::iterator it =mFileName.begin(); it!=mFileName.end(); ++it)
+      {
+         std::cout << "A=== [" << (*it) << "]" << std::endl;
+      }
+*/      
       bool insideComment = false; // for multiline comment
       while (mFile.size()>0) 
       {
-         while ((mFile.size()>0) && 
-                (!mFile.back()->eof()))
+/*
+         for( std::vector<std::string>::iterator it =mFileName.begin(); it!=mFileName.end(); ++it)
          {
-            mLine.back()++;
+            std::cout << "B=== [" << (*it) << "]" << std::endl;
+         }
+*/      
+//printf("EED --- %s --- Interpreter::InterpretFile \n", mFileName[0].c_str() );
+       //printf("EED --- %s --- Interpreter::InterpretFile \n", mFileName[0].c_str() );
+
+         //while ((mFile.size()>0) && !mFile.back()->eof() ) 
+         //{
+//      std::cout << "mFile.size() "<< mFile.size() << " mFileName.back() [" << mFileName.back() << "]" <<  std::endl;
+        
+        while (!mFile.back()->eof()) {
+                    mLine.back()++;
             char buf[500];
             mFile.back()->getline(buf,500);
-      
             std::string str(buf);
+// std::cout << " in InterpretFile mFile.back()->getline [" << str << "]" << std::endl;    
             int size=str.length();
             if ( str[ size-1 ]==13  )
             {
@@ -330,6 +350,9 @@ std::cout << "=========================================~Interpreter()" << std::e
             }
       
             InterpretLine(str, insideComment);
+
+//printf("EED Interpreter::InterpretFile %s\n", str.c_str() );
+
          }
         //if (mFile.size()>0) 
         CloseCurrentFile();
@@ -573,16 +596,16 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
        // if 'source' was given
        if (words.size()==3) 
          {
-           this->mExecuter->SetCurrentFileName(words[1]);
+           GetExecuter()->SetCurrentFileName(words[1]);
          }
         break;
 
       case cLoad:
-        LoadPackage(words[1]);
+        GetExecuter()->GetFactory()->LoadPackage(words[1]);
         break;
 
       case cUnload:
-        UnLoadPackage(words[1]);
+        GetExecuter()->GetFactory()->UnLoadPackage(words[1]);
         break;
 
       case cQuit :
@@ -660,10 +683,10 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     pos = s.find(ss,0);
     char* cr = "\n";
     while ( pos != std::string::npos )
-   {
+    {
       s.replace(pos,2,cr,1);
       pos = s.find(ss, pos-1);
-   }
+    }
   }
   //=======================================================================
 
@@ -772,35 +795,56 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     // It's a user intended message.
     // Please don't remove it.
     bbtkMessage("Interpreter",1,
-               "look for : [" << name
-                 << "]" << std::endl);
+        "look for : [" << name
+        << "]" << std::endl);
     script_paths = ConfigurationFile::GetInstance().Get_bbs_paths();
 
     std::string upath;
     pkgname = Utilities::ExtractScriptName(name,upath);
 
+    bbtkMessage("Interpreter",1,
+               "extract : pkgname [" << pkgname
+                << "] upath [" << upath << "]" << std::endl);
     bool fullnameGiven = false; 
     bool foundFile     = false;
 
     if(pkgname == "*") // =========================================== load all boxes (e.g. std/boxes/*)
     {
+// std::cout << "JPR==================  * found, load all boxes " << std::endl;
       int nbBssFiles;
 
+      std::stringstream* stream = new std::stringstream;
+      //if (upath.size()!=0) // avoid troubles for "*"
+      
       if (upath[0]=='/' || upath[1] == ':' ) // ==== absolute name, load all .bbs files
       {
+// std::cout << "JPR==================  absolute name, load all .bbs files " << std::endl;      
         int nbFiles = Utilities::Explore(upath, false, Filenames);
         nbBssFiles = 0;
         for (std::vector<std::string>::iterator i = Filenames.begin(); i!= Filenames.end(); ++i)
         {
-           if ((*i).substr((*i).size()-4, 4) != ".bbs")
-              continue;      // ignore non .bbs files
-           LoadScript(*i,name);
+// std::cout << "JPR==================  iterate [" << *i << "]" << std::endl;
+           int lgr = (*i).size();
+          if (lgr < 5)
+             continue;  // ignore non .bbs file
+           if ((*i).substr(lgr-4, 4) != ".bbs")
+             continue;
+          /*
+          if (lgr > 10) // 10 -> '-appli.bbs'
+          {    
+           if ((*i).substr(lgr-10, 10) == "-appli.bbs")
+              continue;      // ignore  '-appli.bbs' files
+          }
+          */
+           (*stream) << "include " << *i << "\n";
            nbBssFiles++;
         }
         if (nbBssFiles==0)
            bbtkMessage("Interpreter",2,
                       "WARNING : No '.bbs' file found in [" 
                       << upath << "]" << std::endl);
+        else
+           SwitchToStream(stream);
         return;
       }
 
@@ -831,27 +875,41 @@ 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,"   [" <<fullDirectoryName 
+             bbtkMessage("Interpreter",1,"   [" <<fullDirectoryName 
                      <<"] : doesn't exist" <<std::endl);
           continue;  // try next path
         }
         foundFile = true;
 
-
+        Filenames.clear();
         int nbFiles = Utilities::Explore(fullDirectoryName, false, Filenames);
 
         nbBssFiles = 0;
         for (std::vector<std::string>::iterator i = Filenames.begin(); i!= Filenames.end(); ++i)
         {
-           if ((*i).substr((*i).size()-4, 4) != ".bbs")
-              continue;      // ignore non .bbs files
-           LoadScript(*i,name);
+//EEDprintf("EED Interpreter::SwitchToFile %s\n",(*i).c_str() );
+// std::cout << "JPR==================  iterate [" << *i << "]" << std::endl;
+           int lgr = (*i).size();
+          if (lgr < 5)
+             continue;  // ignore non .bbs file
+           if ((*i).substr(lgr-4, 4) != ".bbs")
+             continue;
+           /*
+          if (lgr > 10) // 10 -> '-appli.bbs'
+          {    
+           if ((*i).substr(lgr-10, 10) == "-appli.bbs")
+              continue;      // ignore  '-appli.bbs' files
+          }
+          */
+           (*stream) << "include " << *i << "\n";
            nbBssFiles++;
         }
         if (nbBssFiles==0)
-         bbtkMessage("Interpreter",1,
+           bbtkMessage("Interpreter",1,
                      "WARNING : No '.bbs' file found in [" 
                      << fullDirectoryName << "]" << std::endl);
+        else 
+           SwitchToStream(stream);
 
         //break; // a directory was found; we stop iterating
        // LG : No! We want all files included !
@@ -878,7 +936,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
       int l = fullPathScriptName.size();
 
       if (l!=0) {
-      
+
       if (l>4)
       {
          if (fullPathScriptName.substr(l-4, 4) != ".bbs")
@@ -891,21 +949,19 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
          fullPathScriptName = fullPathScriptName + ".bbs";   
       }
 
-        if ( Utilities::FileExists(fullPathScriptName))
-        {
-          foundFile = true;
-        }
-      } // endif l != 0
-    }
-    else 
-
-      // =============================================================== iterate on the paths
+      if ( Utilities::FileExists(fullPathScriptName))
       {
+        foundFile = true;
+      }
+    } // endif l != 0
+  }
+  else
+      // =============================================================== iterate on the 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 == ".") {
@@ -915,10 +971,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
           path = currentDir;
         }
 
-       // fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true); //pkgname);
-
-           fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true);
-
+       fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true);
 
       // Check if library exists
         if ( ! Utilities::FileExists(fullPathScriptName) )
@@ -926,12 +979,12 @@ 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",2,
+             bbtkMessage("Interpreter",2,
                      "   [" <<fullPathScriptName <<"] : doesn't exist" 
                      <<std::endl);
           continue;  // try next path
         }
-       bbtkMessage("Interpreter",2,
+           bbtkMessage("Interpreter",2,
                    "   [" <<fullPathScriptName 
                    <<"] : found" <<std::endl);
         foundFile = true;
@@ -958,23 +1011,78 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
   }
 
 
+void Interpreter::SwitchToStream( std::stringstream* stream )
+{
+//std::cout << "== 1 Entry in Interpreter::SwitchToStream " << std::endl;
+    mFile.push_back(stream);
+    //std::cout << " mFile.size() " << mFile.size() << std::endl;
+    std::ostringstream buffer_name;
+    bufferNb++;
+    buffer_name << "buffer_" ; // << bufferNb;
+    
+//    std::cout << " mFile.size() "     << mFile.size() << std::endl;
+//    std::cout << " mFileName.size() " << mFileName.size() << std::endl;
+//    std::cout << " mLine.size() "     << mLine.size() << std::endl;
+   // std::vector<std::string>::iterator j = mFileName.begin();
+   //    std::cout << "  mFileName.begin() succeeded"  << std::endl;
+   //    std::cout << "  mFileName[0] " <<   mFileName[0] << std::endl;
+       //std::cout << "  mFileName.begin() " <<   mFileName.begin() << std::endl;
+/*
+    for( std::vector<std::string>::iterator i = mFileName.begin(); i!= mFileName.end(); ++i)
+    {
+
+       std::cout <<   "Interpreter::SwitchToStream : mFileName [" <<  *i << "]" << std::endl;
+    }
+*/
+  //  std::cout << " mLine.back() " << mLine.back() << std::endl;
+   // std::cout << " mFileName.back() " <<  mFileName.back() << std::endl;
+
+    if (mFileName.size()>0 )// && (mFile.size()>0) )  // NO!!!
+    {
+   // std::cout << "  mFileName.back() " <<  mFileName.back() << std::endl;
+   // std::cout << "  mLine.back() " <<  mLine.back() << std::endl;
+       buffer_name << mFileName.back() << "_" << mLine.back();
+    }
+//std::cout << "3 in Interpreter::SwitchToStream buffer_name :[" << buffer_name.str() << "]" << std::endl;
+    mFileName.push_back(buffer_name.str());
+    mIncludeFileName.push_back(buffer_name.str());
+    mLine.push_back(0);
+}
+
   //=======================================================================
 
   void Interpreter::LoadScript( std::string fullPathScriptName,
                                std::string includeScriptName)
   {
-    if (find(mFileName.begin(),mFileName.end(),fullPathScriptName)
-       !=mFileName.end()) 
-      {
-       bbtkMessage("Interpreter",1,"file '"<<fullPathScriptName
+//std::cout << "--------------------------EED Interpreter::LoadScript >>01\n" << std::endl;
+     Utilities::replace( fullPathScriptName , INVALID_FILE_SEPARATOR , VALID_FILE_SEPARATOR);
+
+     bool okScriptExist=false;
+     int iStrScript,sizeVecStricpt=mFileName.size();
+     for ( iStrScript=0;iStrScript<sizeVecStricpt;iStrScript++)
+     {
+//EED printf("  EED %d Interpreter::LoadScript %s __>>__ %s\n", iStrScript,mFileName[iStrScript].c_str(),fullPathScriptName.c_str() );
+
+        if (mFileName[iStrScript] == fullPathScriptName )
+        {
+           printf("  EED %d Interpreter::LoadScript iguales\n",iStrScript );
+           okScriptExist=true;
+        } // if
+     } // for
+
+     if (find(mFileName.begin(),mFileName.end(),fullPathScriptName)!=mFileName.end())
+//    if (okScriptExist==true)
+     {
+//EED printf("EED Interpreter::LoadScript Exit method\n");
+           bbtkMessage("Interpreter",1,"file '"<<fullPathScriptName
                    <<"' already open : I do not open it once more to prevent recursive inclusion"<<std::endl);
-       return;
-      }
+        return;
+     }
 
     std::ifstream* s;
     s = new std::ifstream;
     s->open(fullPathScriptName.c_str());
-    if (!s->good()) 
+    if (!s->good())
     {
         bbtkError("Could not open file ["<<fullPathScriptName<<"]");
         return;
@@ -987,6 +1095,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     mFileName.push_back(fullPathScriptName);
     mIncludeFileName.push_back(includeScriptName);
     mLine.push_back(0);
+//EED printf("EED Interpreter::LoadScript >>02\n");
     return;
   }
 
@@ -1005,15 +1114,26 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
       return;
     }
 
-    mFile.back()->close();
+    bbtkDebugMessage("Interpreter",9," Closing file '"<<mFileName.back()<<"'"<<std::endl);
+
+    std::ifstream* file = dynamic_cast<std::ifstream*>(mFile.back());
+    if (file!=0) file->close();
+
     delete mFile.back();
     mFile.pop_back();
-    bbtkDebugMessage("Interpreter",9,
-                     " Closing file '"<<mFileName.back()<<"'"<<std::endl);
-
     mFileName.pop_back();
     mIncludeFileName.pop_back();
     mLine.pop_back();
+/*EED3
+    bbtkDebugMessage("Interpreter",9," Closing file '"<<mFileName[0]<<"'"<<std::endl);
+    mFile[0]->close();
+    delete mFile[0];
+    mFile.erase( mFile.begin() );
+    mFileName.erase( mFileName.begin() );
+    mIncludeFileName.erase( mIncludeFileName.begin() );
+    mLine.erase( mLine.begin() );
+*/
+
     bbtkDebugMessage("Interpreter",9," Remains "
                      <<mFile.size()
                      <<" open"<<std::endl);
@@ -1033,6 +1153,8 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
 
     while (mFile.size() != 0) 
     {
+       CloseCurrentFile();
+    /*
       mFile.back()->close();
       delete mFile.back();
       mFile.pop_back();
@@ -1041,6 +1163,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
       mFileName.pop_back();
       mIncludeFileName.pop_back();
       mLine.pop_back();
+*/
     }
     bbtkDebugMessage("Interpreter",9,"EO Interpreter::CloseAllFiles()"
                       <<std::endl);
@@ -1093,7 +1216,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
     {
       if (words[1]=="packages") 
       {
-         PrintPackages(true);
+         GetExecuter()->GetFactory()->PrintPackages(true);
          return;
       }
       try 
@@ -1104,16 +1227,16 @@ void Interpreter::Help(const std::vector<std::string>& words)
       {
          try 
          {
-            HelpPackage(words[1]);
+            GetExecuter()->GetFactory()->HelpPackage(words[1]);
 #ifdef _USE_WXWIDGETS_
-           if ( WxConsole::GetInstance() != 0 )
+           if ( mWxConsole != 0 )
              {
                std::string url = 
                  ConfigurationFile::GetInstance().Get_doc_path();
                url += "/bbdoc/" + words[1] + "/index.html";
                if (Utilities::FileExists(url)) 
                  {
-                   WxConsole::GetInstance()->ShowHtmlPage(url);
+                   mWxConsole->ShowHtmlPage(url);
                  }
              }
 #endif     
@@ -1123,9 +1246,9 @@ void Interpreter::Help(const std::vector<std::string>& words)
             try 
             {
              std::string package;
-             HelpBlackBox(words[1],package);
+             GetExecuter()->GetFactory()->HelpBlackBox(words[1],package);
 #ifdef _USE_WXWIDGETS_
-              if ( WxConsole::GetInstance() != 0 )
+              if ( mWxConsole != 0 )
                 {
                   std::string url = 
                     ConfigurationFile::GetInstance().Get_doc_path();
@@ -1133,7 +1256,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
                   if (Utilities::FileExists(url))
                     {
                       url += "#" + words[1];
-                      WxConsole::GetInstance()->ShowHtmlPage(url);
+                      mWxConsole->ShowHtmlPage(url);
                     }
                 }
 #endif
@@ -1142,7 +1265,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
              {
                try
                  {
-                   this->mExecuter->ShowRelations(words[1],"0","9999");
+                   GetExecuter()->ShowRelations(words[1],"0","9999");
                  }
                catch (bbtk::Exception h){
                  bbtkError("\""<<words[1].c_str()
@@ -1158,12 +1281,12 @@ void Interpreter::Help(const std::vector<std::string>& words)
       {
          if ( words[1]=="packages" )
          {
-            PrintPackages(true,true);
+            GetExecuter()->GetFactory()->PrintPackages(true,true);
             return;
           }
          try 
          {
-            HelpPackage(words[1],true);
+            GetExecuter()->GetFactory()->HelpPackage(words[1],true);
          }
          catch (bbtk::Exception f) 
          {
@@ -1531,7 +1654,7 @@ void Interpreter::Graph(const std::vector<std::string>& words)
     bool system_display = true;
 
 #ifdef _USE_WXWIDGETS_
-    if ( WxConsole::GetInstance() != 0 ) system_display = false; 
+    if ( mWxConsole != 0 ) system_display = false; 
 #endif
  
     if (words.size()==1) 
@@ -1564,8 +1687,8 @@ void Interpreter::Graph(const std::vector<std::string>& words)
       } 
     
 #ifdef _USE_WXWIDGETS_
-    if ( WxConsole::GetInstance() != 0 )
-      WxConsole::GetInstance()->ShowHtmlPage(page);
+    if ( mWxConsole != 0 )
+      mWxConsole->ShowHtmlPage(page);
 #endif
   }
 //=======================================================================
@@ -1581,7 +1704,7 @@ void  Interpreter::Index(const std::string& filename,
   else if (type=="Packages") t = Factory::Packages;
   else if (type=="Adaptors") t = Factory::Adaptors;
   
-  GetGlobalFactory()->CreateHtmlIndex(t,filename);
+  GetExecuter()->GetFactory()->CreateHtmlIndex(t,filename);
 }
 //=======================================================================