]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkInterpreter.cxx
comment out cout s
[bbtk.git] / kernel / src / bbtkInterpreter.cxx
index ef03a40f986572635709764b305897bbfb162af2..eba8ce61bdabd685df899382fc17e925f7c35361 100644 (file)
@@ -3,8 +3,8 @@
   Program:   bbtk
   Module:    $RCSfile: bbtkInterpreter.cxx,v $ $
   Language:  C++
-  Date:      $Date: 2008/01/22 16:55:04 $
-  Version:   $Revision: 1.2 $
+  Date:      $Date: 2008/01/29 14:01:31 $
+  Version:   $Revision: 1.11 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -31,6 +31,7 @@
 #define BBTK_USE_TERMIOS_BASED_PROMPT
 #endif
 
+#include <string>
 
 namespace bbtk
 {
@@ -98,6 +99,22 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL;
     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.";
     mCommandDict[info.keyword] = info;
 
+    info.keyword = "package";
+    info.argmin = 1;
+    info.argmax = 1;
+    info.code = cPackage;
+    info.syntax = "package <name>";
+    info.help = "Begins the definition of a package.";
+    mCommandDict[info.keyword] = info;
+    
+    info.keyword = "endpackage";
+    info.argmin = 0;
+    info.argmax = 0;
+    info.code = cEndPackage;
+    info.syntax = "endpackage";
+    info.help = "Ends the definition of a package.";
+    mCommandDict[info.keyword] = info;
+
     info.keyword = "define";
     info.argmin = 1;
     info.argmax = 2;
@@ -324,7 +341,7 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL;
           std::cout << "* LINE  : "<<mLine.back()<<std::endl;
       }    
     }
-    
+
     CloseAllFiles();
     bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
     bbtkDecTab("Interpreter",9);
@@ -347,7 +364,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
 
     std::vector<std::string> words;
     SplitLine(line,words);
-    
+
     // Empty line
     if (words.size()<1) 
     {
@@ -391,158 +408,166 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
        bbtkMessage("Interpreter",9,"Multiline Comment"<<std::endl);
        return;
     }
-                
+
     // Command 
     CommandInfoType command;
     InterpretCommand(words,command);
 
     bbtkDebugMessage("Interpreter",9,
-                     "Command '"<<command.keyword
-                      <<" code="<<command.code<<std::endl); 
+                     "Command='"<<command.keyword
+                      <<"' code="<<command.code<<std::endl); 
     int level=0;
     std::string left,right,left2,right2;
     std::string filename;
     switch (command.code) 
     {
       case cNew :
-            mExecuter->Create(words[1],words[2]);
-            break;
+        mExecuter->Create(words[1],words[2]);
+        break;
         
       case cDelete :
-            // TO DO !!
-            // mExecuter->Remove(words[1]);
-            break;
+        // TO DO !!
+        // mExecuter->Remove(words[1]);
+        break;
         
       case cConnect :
-            Utilities::SplitAroundFirstDot(words[1],left,right);
-            Utilities::SplitAroundFirstDot(words[2],left2,right2);      
-            mExecuter->Connect(left,right,left2,right2);
-            break;
+        Utilities::SplitAroundFirstDot(words[1],left,right);
+        Utilities::SplitAroundFirstDot(words[2],left2,right2);      
+        mExecuter->Connect(left,right,left2,right2);
+        break;
+        
+      case cPackage :
+        mExecuter->BeginPackage(words[1]);
+        break;
+
+      case cEndPackage :
+        mExecuter->EndPackage();
+        break;
         
       case cDefine :
-            if (mFileName.size()>0) 
-            {
-               filename = Utilities::get_file_name(mFileName.back());
-            }
-            if (words.size()==2) 
-            {
-               mExecuter->Define(words[1],"user",filename);
-            }
-            else 
-            {
-              mExecuter->Define(words[1],words[2],filename);
-            }
-            break;
+        if (mFileName.size()>0) 
+        {
+           filename = Utilities::get_file_name(mFileName.back());
+        }
+        if (words.size()==2) 
+        {
+           mExecuter->Define(words[1],"",filename);
+        }
+        else 
+        {
+           mExecuter->Define(words[1],words[2],filename);
+        }
+        break;
         
       case cEndDefine :
-            mExecuter->EndDefine();
-            break;
+        mExecuter->EndDefine();
+        break;
         
       case cPrint :
-            Print(words[1]); /// \todo use mExecuter 
-            break;
+        Print(words[1]); /// \todo use mExecuter 
+        break;
         
       case cExec :
-            if (words[1]=="freeze") 
-           mExecuter->SetNoExecMode(true);
-            else if (words[1]=="unfreeze") 
-           mExecuter->SetNoExecMode(false);
-            else 
-           mExecuter->Update(words[1]);
-            break;
+        if (words[1]=="freeze") 
+          mExecuter->SetNoExecMode(true);
+        else if (words[1]=="unfreeze") 
+          mExecuter->SetNoExecMode(false);
+        else 
+          mExecuter->Update(words[1]);
+        break;
         
       case cInput :
-            Utilities::SplitAroundFirstDot(words[2],left,right);
-            mExecuter->DefineInput(words[1],left,right,words[3]);
-            break;
+        Utilities::SplitAroundFirstDot(words[2],left,right);
+        mExecuter->DefineInput(words[1],left,right,words[3]);
+        break;
         
       case cOutput :
-            Utilities::SplitAroundFirstDot(words[2],left,right);
-            mExecuter->DefineOutput(words[1],left,right,words[3]);
-            break;
+        Utilities::SplitAroundFirstDot(words[2],left,right);
+        mExecuter->DefineOutput(words[1],left,right,words[3]);
+        break;
         
       case cSet :
-            Utilities::SplitAroundFirstDot(words[1],left,right);
-            mExecuter->Set(left,right,words[2]);
-            break;
+        Utilities::SplitAroundFirstDot(words[1],left,right);
+        mExecuter->Set(left,right,words[2]);
+        break;
         
       case cAuthor :
-            mExecuter->Author(words[1]);
-            break;
+        mExecuter->Author(words[1]);
+        break;
         
       case cDescription :
-            mExecuter->Description(words[1]);
-            break;
+        mExecuter->Description(words[1]);
+        break;
         
       case cHelp :
-            Help(words);
-            break;
+        Help(words);
+        break;
         
       case cMessage : 
-            if (words.size()<3) 
-            {
+        if (words.size()<3) 
+        {
             bbtk::MessageManager::PrintInfo();
-            }
-            else 
-            {
+        }
+        else 
+        {
            sscanf(words[2].c_str(),"%d",&level);
            bbtk::MessageManager::SetMessageLevel(words[1],level);
-            }
-            break;
+        }
+        break;
         
       case cGraph : 
-            Graph(words);
-            break;
+        Graph(words);
+        break;
         
       case cConfig :
-            if (words.size()>1) // any param for config means verbose = true
-              verbose = true;
-            else
-              verbose = false;
-            Config(verbose);            
-            break;
+        if (words.size()>1) // any param for config means verbose = true
+          verbose = true;
+        else
+          verbose = false;
+        Config(verbose);            
+        break;
         
       case cReset :  // EED
-            this->mExecuter->Reset();
-            break;
+        this->mExecuter->Reset();
+        break;
         
       case cInclude :
-            if (mCommandLine) 
-            {
+        if (mCommandLine) 
+        {
            InterpretFile(words[1], true, verbose); // true : better pass use_config_file
-            }
-            else 
-            {
+        }
+        else 
+        {
             SwitchToFile(words[1], true, verbose); // true : better pass use_config_file
-            }
-            break;
+        }
+        break;
         
       case cLoad:
-            LoadPackage(words[1], true, verbose); // true : better pass use_config_file
-            break;
+        LoadPackage(words[1], true, verbose); // true : better pass use_config_file
+        break;
         
       case cUnload:
-            UnLoadPackage(words[1]);
-            break;
+        UnLoadPackage(words[1]);
+        break;
         
       case cQuit :
-            throw QuitException();
-            break;
+        throw QuitException();
+        break;
         
-      case cWorkspace :
-            if (words.size() == 2) 
-            {
-               if (words[1]=="freeze")        mExecuter->SetNoExecMode(true);
-               else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false);
-            }
-            else 
-            {
-               mExecuter->SetWorkspaceName(words[2]);
-            }
-            break;
+         case cWorkspace :
+        if (words.size() == 2) 
+        {
+           if (words[1]=="freeze")        mExecuter->SetNoExecMode(true);
+           else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false);
+        }
+        else 
+        {
+           mExecuter->SetWorkspaceName(words[2]);
+        }
+        break;
         
       default:
-            bbtkInternalError("should not reach here !!!");
+        bbtkInternalError("should not reach here !!!");
    }
     
    bbtkDecTab("Interpreter",9);
@@ -696,107 +721,219 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
 
 // ===================================================================================
 
-
   void Interpreter::SwitchToFile( const std::string& name,
                                   bool use_configuration_file, bool verbose)
   {
+  // Note : in the following :
+  // name : the user supplied name 
+  //      - abreviated name    e.g.       scr   scr.bbs
+  //      - relative full name e.g.       ./scr.bbs   ../../scr.bbs 
+  //      - absolute full name e.g.       /home/usrname/proj/dir/scr.bbs
+  //          same for Windows, with      c:, d: ...
+  //
+  // expression like directory/subdir/scrname.bbs is FORBIDDEN (*)
+  // use ./directory/subdir/scrname.bbs
+  //
+  //   (*) except when using packagename/boxes/*
+  
     bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \""
                          <<name<<"\")"<<std::endl);
 
+// to be remove in final version
+// use : Config v
+verbose = true;
     std::vector<std::string> script_paths;
-    std::string libname;  // full path library name
-    std::string pkgname;  // e.g. <scriptname>.bbs
-     
-    pkgname = Utilities::ExtractScriptName(name);
+    std::string fullPathScriptName;  // full path script name
+    std::string pkgname;             // e.g. <scriptname>.bbs
 
     if (use_configuration_file)
     {
+        // The following is *NOT* a debug time message :
+        // It's a user intended message.
+        // Please don't remove it.
       if (verbose)
          std::cout << "look for : [" << name << "] (use_configuration_file == TRUE)"  << std::endl;
       script_paths = ConfigurationFile::GetInstance().Get_bbs_paths();
     }
-
+    std::string upath;
+    pkgname = Utilities::ExtractScriptName(name,upath);
+    
     bool fullnameGiven = false; 
     bool foundFile     = false;
-    std::string::size_type slash_position = name.find_last_of("/\\");
-  
-    if (slash_position != std::string::npos)
+
+    if(pkgname == "*") // =========================================== load all boxes (e.g. std/boxes/*)
     {
-      fullnameGiven = true;     
-      libname =  Utilities::ExpandLibName(name, verbose);
-      if (libname != "") {
-        if ( Utilities::FileExists(libname))
+      std::string path;
+      std::vector<std::string>::iterator i;
+      std::string fullDirectoryName;
+      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;
+        }
+
+        fullDirectoryName = Utilities::MakePkgnameFromPath(path, upath, false);
+//std::cout <<"fullpath [" <<   fullDirectoryName << "]" <<std::endl;
+      // Check if library exists           
+        if ( ! Utilities::IsDirectory(fullDirectoryName) )
         {
-          foundFile = true;
+        // The following is *NOT* a debug time message :
+        // It's a user intended message.
+        // Please don't remove it.
+          if (verbose)
+            std::cout <<"   [" <<fullDirectoryName <<"] : doesn't exist" <<std::endl;
+          continue;  // try next path
+        }
+        foundFile = true;
+
+        std::vector<std::string> Filenames;
+        int nbFiles = Utilities::Explore(fullDirectoryName, false, Filenames);
+// std::cout << "=================nbFiles " << nbFiles << std::endl;
+        int 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);
+           nbBssFiles++;
         }
+        if (nbBssFiles==0)
+           if (verbose)
+              std::cout << "WARNING : No '.bbs' file found in [" << fullDirectoryName << "]" << std::endl;
+           
+        break; // a directory was found; we stop iterating
+       }
+       return;
+    }
+
+    std::string::size_type slash_position = name.find_last_of("/\\");
+
+    // if name contains a slash (anywhere), user is assumed to have passed a relative/absolute name
+    // (not only a plain script name)
+    // we trust him, and try to explade the directory name
+    // WARNING : starting from current local directory :  ./whatYouWant  (./ mandatory!)
+      
+   // if (slash_position != std::string::npos)
+    if (name[0]=='/' || name[1] == ':')
+    { 
+
+      // ===========================================================check user supplied location
+      fullnameGiven = true;
+      
+      fullPathScriptName =  Utilities::ExpandLibName(name, verbose);
+   
+      // allow user to always forget ".bbs"
+      int l = fullPathScriptName.size();
+      if (l!=0) {
+      
+      if (l>4)
+      {
+         if (fullPathScriptName.substr(l-4, 4) != ".bbs")
+         {
+            fullPathScriptName = fullPathScriptName + ".bbs";
+         }
+      }
+      else
+      {
+         fullPathScriptName = fullPathScriptName + ".bbs";   
       }
+
+      //if (fullPathScriptName != "") {
+        if ( Utilities::FileExists(fullPathScriptName))
+        {
+          foundFile = true;
+        }
+      //}
+      } // endif l != 0
     }
-    else    // ----------------------- iterate on the paths
-    {
-      std::string path;    
+    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;
 
+        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);        
+          std::string cwd(currentDir);
           path = currentDir;
         }
 
-        libname = Utilities::MakePkgnameFromPath(path, pkgname);
+       // fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true); //pkgname);
 
-      // Check if library exists           
-        if ( ! Utilities::FileExists(libname) )
+           fullPathScriptName = Utilities::MakePkgnameFromPath(path, pkgname, true);
+//std::cout << "FULL PATH = "<<fullPathScriptName<<std::endl;
+
+      // 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.
           if (verbose)
-            std::cout <<"   [" <<libname <<"] : doesn't exist" <<std::endl;
-            continue;  // try next path
+            std::cout <<"   [" <<fullPathScriptName <<"] : doesn't exist" <<std::endl;
+          continue;  // try next path
         }
+        if (verbose)
+           std::cout <<"   [" <<fullPathScriptName <<"] : found" <<std::endl;        
         foundFile = true;
         break; // a script was found; we stop iterating
 
       } //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
     }
 
-    std::ifstream* s;
-
     if (!foundFile)
     {
        if (fullnameGiven)
-         if(libname == "")
-            bbtkError("Path \""<<name<<"\" doesn't exist");
+         if(fullPathScriptName == "")
+            bbtkError("Path ["<<upath<<"] doesn't exist");
          else
-            bbtkError("Script \""<<libname<<"\" not found");
+            bbtkError("Script ["<<fullPathScriptName<<"] not found");
        else
-          bbtkError("No \""<<pkgname<<".bbs\" script found");
+          bbtkError("No ["<<pkgname<<".bbs] script found");
        return;    
     }
+    else
+       LoadScript(fullPathScriptName);
 
-    bbtkMessage("Interpreter",1,pkgname<<" loaded"<<std::endl);
-    
+    return;
+  }   
+   
+
+  //=======================================================================
+
+  void Interpreter::LoadScript( std::string fullPathScriptName)
+  {
+    bbtkMessage("Interpreter",1,fullPathScriptName<<" found"<<std::endl);
+
+    std::ifstream* s;      
     s = new std::ifstream;
-    s->open(libname.c_str());
+    s->open(fullPathScriptName.c_str());
     if (!s->good()) 
     {
-        bbtkError("Could not open file \""<<libname<<"\"");
+        bbtkError("Could not open file ["<<fullPathScriptName<<"]");
         return;     
     }
-
+    
     if (verbose)
-       std::cout << "   -->[" << libname << "] found" << std::endl;
+       std::cout << "   -->[" << fullPathScriptName << "] found" << std::endl;
 
     mFile.push_back(s);
-    mFileName.push_back(libname);
+    mFileName.push_back(fullPathScriptName);
     mLine.push_back(0);
-  }   
-   
-
-  //=======================================================================
-
+    return;  
+  }
 
   //=======================================================================
   /**
@@ -1127,19 +1264,18 @@ void Interpreter::Help(const std::vector<std::string>& words)
     // empty lines are not stored in from history
           if (strlen(line)) 
           {
-               // if history too long : delete oldest command
-               if (mHistory.size()>MAX_HISTORY_SIZE) 
-                 {
-                   delete mHistory.front();
-                   mHistory.pop_front();
-                 }
-               mHistory.push_back(line);
+             // if history too long : delete oldest command
+             if (mHistory.size()>MAX_HISTORY_SIZE) 
+             {
+                delete mHistory.front();
+                mHistory.pop_front();
+             }
+             mHistory.push_back(line);
           }
-    
           break;
         }
-       // Backspace
-       else if ( (ind>0) && 
+       // Backspace
+        else if ( (ind>0) && 
                  ((c == BBTK_BACKSPACE_KBCODE) ||
                   (c == BBTK_DEL_KBCODE)) )
          {
@@ -1232,13 +1368,13 @@ void Interpreter::Help(const std::vector<std::string>& words)
            PrintChar(line[ind]);
            ind++;
          }
-       
+
        // Arrow left
        else if (ind>0 && c==BBTK_LEFT_ARROW_KBCODE)
          {
            PrintChar('\b');
            ind--;
-           
+    
          }
 
       }
@@ -1307,7 +1443,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
     bool insideComment = false; // for multiline comment  
     do 
     {
-      try 
+      try
       {
         std::string line;
         GetLineFromPrompt(line);
@@ -1323,7 +1459,7 @@ void Interpreter::Help(const std::vector<std::string>& words)
       }
         catch (std::exception& e) 
       {
-        std::cerr << "* ERROR : "<<e.what()<<" (not in bbtk)"<<std::endl;
+        std::cerr << "* ERROR :: "<<e.what()<<" (not in bbtk)"<<std::endl;
       }
       catch (...)
       {