]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkInterpreter.cxx
*** empty log message ***
[bbtk.git] / kernel / src / bbtkInterpreter.cxx
index 32c824934102ee290d336a5d281e91017d88ffb5..d39aa91deee86b6975c28586ff5a082b80389a4f 100644 (file)
@@ -3,8 +3,8 @@
   Program:   bbtk
   Module:    $RCSfile: bbtkInterpreter.cxx,v $ $
   Language:  C++
-  Date:      $Date: 2008/01/29 13:34:59 $
-  Version:   $Revision: 1.9 $
+  Date:      $Date: 2008/02/01 13:06:29 $
+  Version:   $Revision: 1.17 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -178,6 +178,14 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL;
     info.syntax = "author <string>";
     info.help = "Adds the string <string> to the author information of the black box being defined";
     mCommandDict[info.keyword] = info;
+    
+    info.keyword = "keyword"; //JP
+    info.argmin = 1;
+    info.argmax = 1;
+    info.code = cKeyword;
+    info.syntax = "keyword <list of items, separated by ;>";
+    info.help = "Adds the string <string> to the keyword information of the black box being defined";
+    mCommandDict[info.keyword] = info;
 
     info.keyword = "description";
     info.argmin = 1;
@@ -494,7 +502,11 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
       case cAuthor :
         mExecuter->Author(words[1]);
         break;
-        
+
+      case cKeyword :
+        mExecuter->Keyword(words[1]);
+        break;
+                
       case cDescription :
         mExecuter->Description(words[1]);
         break;
@@ -731,21 +743,20 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
   //      - 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
+// to be removed in final version
 // use : Config v
-verbose = true;
+//verbose = true;
     std::vector<std::string> script_paths;
     std::string fullPathScriptName;  // full path script name
     std::string pkgname;             // e.g. <scriptname>.bbs
-
+    std::vector<std::string> Filenames;
+        
     if (use_configuration_file)
     {
         // The following is *NOT* a debug time message :
@@ -757,16 +768,37 @@ verbose = true;
     }
     std::string upath;
     pkgname = Utilities::ExtractScriptName(name,upath);
-    
+//std::cout <<"name [" <<   name << "] pkgname [" << pkgname << "] upath [" << upath << "]" << std::endl;    
     bool fullnameGiven = false; 
     bool foundFile     = false;
 
     if(pkgname == "*") // =========================================== load all boxes (e.g. std/boxes/*)
     {
+      int nbBssFiles;
+
+      if (upath[0]=='/' || upath[1] == ':' ) // ==== absolute name, load all .bbs files
+      {
+        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);
+           nbBssFiles++;
+        }
+        if (nbBssFiles==0)
+           if (verbose)
+              std::cout << "WARNING : No '.bbs' file found in [" << upath << "]" << std::endl;
+
+        return;
+      }
+      
+
       std::string path;
       std::vector<std::string>::iterator i;
       std::string fullDirectoryName;
-      for (i=script_paths.begin();i!=script_paths.end();++i)
+      for (i=script_paths.begin();i!=script_paths.end();++i)// ==== relative name, iterate + load all .bbs files
       {
         path = *i;
 
@@ -792,14 +824,11 @@ verbose = true;
         }
         foundFile = true;
 
-        std::cout << "recherche tous les .bbs du directory" << std::endl;
-        std::cout << "pour chacun, LoadScript" << std::endl; 
 
-        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)
+        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
@@ -815,23 +844,24 @@ verbose = true;
        return;
     }
 
-    std::string::size_type slash_position = name.find_last_of("/\\");
+    //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
+    // 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 explade the directory name
+    // we trust him, and try to expland the directory name
     // WARNING : starting from current local directory :  ./whatYouWant  (./ mandatory!)
-    
-    if (slash_position != std::string::npos)
+
+    if (name[0]=='/' || name[1] == ':' || name[0]=='.')  // absolute path (linux/windows) or relative path
     { 
 
       // ===========================================================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)
@@ -846,28 +876,24 @@ verbose = true;
          fullPathScriptName = fullPathScriptName + ".bbs";   
       }
 
-      //if (fullPathScriptName != "") {
         if ( Utilities::FileExists(fullPathScriptName))
         {
           foundFile = true;
         }
-      //}
       } // endif l != 0
     }
-    else    
+    else 
+
       // =============================================================== iterate on the paths
       {
-       std::cout << "iterate"<<std::endl;
       std::string path;
       std::vector<std::string>::iterator i;
       for (i=script_paths.begin();i!=script_paths.end();++i)
       {
 
         path = *i;
-       std::cout << "CUR=["<<path<<"]"<<std::endl;
        // we *really* want '.' to be the current working directory
         if (path == ".") {
-         std::cout << "PATH IS CURRENT"<<std::endl;
           char buf[2048]; // for getcwd
           char * currentDir = getcwd(buf, 2048);
           std::string cwd(currentDir);
@@ -876,9 +902,9 @@ verbose = true;
 
        // fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true); //pkgname);
 
-       fullPathScriptName = Utilities::MakePkgnameFromPath(path, pkgname, true);
-       std::cout << "FULL PATH = "<<fullPathScriptName<<std::endl;
-       
+           fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true);
+//std::cout << "FULL PATH = "<<fullPathScriptName<<std::endl;
+
       // Check if library exists
         if ( ! Utilities::FileExists(fullPathScriptName) )
         {
@@ -889,6 +915,8 @@ verbose = true;
             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