]> Creatis software - bbtk.git/commitdiff
Now we may again use absolute/relative paths for scripts and packages
authorjean-pierre roux <jean-pierre.roux@creatis.insa-lyon.fr>
Mon, 28 Jan 2008 09:12:49 +0000 (09:12 +0000)
committerjean-pierre roux <jean-pierre.roux@creatis.insa-lyon.fr>
Mon, 28 Jan 2008 09:12:49 +0000 (09:12 +0000)
(* not yet working)

kernel/src/bbtkFactory.cxx
kernel/src/bbtkInterpreter.cxx
kernel/src/bbtkUtilities.h

index 2accdca393e67717daa9060a1185a12e6e67bc6e..2a633d32c7bcd6a4c37fcb4c7c0e7e8272f80765 100644 (file)
@@ -4,8 +4,8 @@ Program:   bbtk
 Module:    $RCSfile: bbtkFactory.cxx,v $
 Language:  C++
 
-Date:      $Date: 2008/01/22 16:55:04 $
-Version:   $Revision: 1.2 $
+Date:      $Date: 2008/01/28 09:12:49 $
+Version:   $Revision: 1.3 $
                                                                                 
 
 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
@@ -102,25 +102,31 @@ namespace bbtk
 // ===================================================================================
 
   bool Factory::DoLoadPackage(std::string libname,
-                             std::string pkgname, 
-                             std::string path, 
-                             bool verbose)
+                              std::string pkgname,
+                              std::string path,
+                              bool verbose)
   {
 
 #if defined(__GNUC__)
 
-        void *handler;            
-        handler = dlopen(libname.c_str(), 
+        void *handler;
+        handler = dlopen(libname.c_str(),
                                      BBTK_RTLD_TIME | BBTK_RTLD_SCOPE );
         if (!handler)
         {
+        // The following is *NOT* a debug time message :
+        // It's a user intended message.
+        // Please don't remove it.
           if (verbose) {
             std::cout <<"[" <<libname<<"] can't be open" << std::endl;
             std::cout << "   " <<dlerror() << std::endl;
           }
           return false; // try next path
         }
-      
+
+        // The following is *NOT* a debug time message :
+        // It's a user intended message.
+        // Please don't remove it.
         if (verbose)
           std::cout <<"   -->[" <<libname<<"] found" << std::endl;
 
@@ -145,17 +151,20 @@ namespace bbtk
           dlclose(handler);
           bbtkError("DeletePackage : could not load package \""<<pkgname
                     <<"\" [symbol "<<delfname<<"] :"<<dlerror());
-        } 
+        }
 
 #elif defined(_WIN32)
 
         HINSTANCE handler;
-     
+
         SetErrorMode(0);
         handler = LoadLibrary(libname.c_str());
         if (!handler){
           if (verbose)
-            std::cout <<"   no handler for [" <<libname<<"];" << std::endl;     
+        // The following is *NOT* a debug time message :
+        // It's a user intended message.
+        // Please don't remove it.
+            std::cout <<"   no handler for [" <<libname<<"];" << std::endl;
           return false;// Problem with the found library
         }
         if (verbose)
@@ -173,7 +182,6 @@ namespace bbtk
           <<"\" : "<<getpackname<<" symbol not found (is it a bbtk package lib ?)");
           // look how to get the error message on win
               //<<dlerror());
-
         }
         // Verifies that the Package delete function is present
         std::string delfname(pkgname);
@@ -186,11 +194,11 @@ namespace bbtk
                      <<"\" : "<<delfname<<" symbol not found (is it a bbtk package lib ?)");
           // look how to get the error message on win
           //<<dlerror());
-        } 
+        }
 #else
         bbtkError("neither __GNUC__ nor _WIN32 ?!? How did you compile ?");
-#endif   
-  
+#endif
+
     // Stores the package
         PackageInfoType pack;
         pack.mDynamicLibraryHandler = handler;
@@ -205,33 +213,31 @@ namespace bbtk
           std::string v(pack.mPackage->GetBBTKVersion());
           UnLoadPackage(pkgname);
           bbtkError(" package build with bbtk version "
-                   << v
-                   << " whereas application build with version "
-                   << bbtk::GetVersion());
+                    << v
+                    << " whereas application build with version "
+                    << bbtk::GetVersion());
         }
 
-       std::string separator = 
-         ConfigurationFile::GetInstance().Get_file_separator ();
-       //BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH)
-       std::string docreldoc = separator + "packages" + separator + pkgname 
-         + separator + "bbdoc" + separator + "index.html";
-       std::string reldoc = ".." + separator + ".." + separator 
-         + ".." + docreldoc;
-       std::string doc = path + separator + ".." + separator
-         + BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) 
-         + docreldoc;
-     
-       //std::cout << "doc='"<<doc<<"'"<<std::endl;
-       
-       pack.mPackage->SetDocURL(doc);
-       pack.mPackage->SetDocRelativeURL(reldoc);
-       
+        std::string separator =
+        ConfigurationFile::GetInstance().Get_file_separator ();
+        //BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH)
+        std::string docreldoc = separator + "packages" + separator + pkgname
+         + separator + "bbdoc" + separator + "index.html";
+        std::string reldoc = ".." + separator + ".." + separator
+         + ".." + docreldoc;
+        std::string doc = path + separator + ".." + separator
+         + BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH)
+         + docreldoc;
+
+        pack.mPackage->SetDocURL(doc);
+        pack.mPackage->SetDocRelativeURL(reldoc);
+
     //===================================================================
         bbtkMessage("Output",2,pack.mPackage->GetName()<<" "
            <<pack.mPackage->GetVersion()
            <<" (bbtk "
            <<pack.mPackage->GetBBTKVersion()<<") "
-           <<pack.mPackage->GetAuthor() 
+           <<pack.mPackage->GetAuthor()
            <<std::endl);
         bbtkMessage("Output",2,pack.mPackage->GetDescription()<<std::endl);
     //===================================================================
@@ -240,7 +246,7 @@ namespace bbtk
         return true;
   }
 
- //===================================================================
 //===================================================================
   /// \brief Loads a package.
   ///
   /// The name is the system-independant name of the package (the name of the instance of bbtk::Package).
@@ -255,25 +261,28 @@ namespace bbtk
   /// it will be searched within *all* the paths given in bbtk_config.xml
 
   /// verbose = true (set by "config v") displays the loading process
+
   void Factory::LoadPackage( const std::string& name,
                              bool use_configuration_file, bool verbose)
   {
   // Note : in the following :
-  // name : the user supplied name 
-  //      - abreviated name    e.g.       pkg   pkg.so   libbpkg   libbbpkg.so 
-  //      - relative full name e.g.       ./libbbpkg.so   ../../libbbpkg.so 
+  // name : the user supplied name
+  //      - abreviated name    e.g.       pkg   pkg.so   libbpkg   libbbpkg.so
+  //      - relative full name e.g.       ./libbbpkg.so   ../../libbbpkg.so
   //      - absolute full name e.g.       /home/usrname/proj/lib/libbbpkg.so
   //          same for Windows, with      c:, d: ...
   //
-    bbtkDebugMessageInc("Core",7,"Factory::LoadPackage(\""<<name<<"\")"<<std::endl);    
-    bbtkMessage("Debug",1,"Factory::LoadPackage(\""<<name<<"\")"<<std::endl);    
-    bbtkMessage("Debug",1,"use_configuration_file [" 
-               << use_configuration_file << "]" << std::endl);
-  
+  // lastname : string before the last / (if any), or user supplied name
+
+    bbtkDebugMessageInc("Core",7,"Factory::LoadPackage(\""<<name<<"\")"<<std::endl);
+    bbtkMessage("Debug",1,"Factory::LoadPackage(\""<<name<<"\")"<<std::endl);
+    bbtkMessage("Debug",1,"use_configuration_file ["
+                 << use_configuration_file << "]" << std::endl);
+
     std::vector<std::string> package_paths;
     std::string libname;  // full path library name
     std::string pkgname;  // e.g. libbb<pkgname>.so
-    
+
     std::string upath;
     pkgname = Utilities::ExtractPackageName(name,upath);
 
@@ -283,47 +292,80 @@ namespace bbtk
     // no loading package if already loaded
     PackageMapType::iterator iUnload;
     iUnload = mPackageMap.find(pkgname);
-    if (iUnload != mPackageMap.end()) 
+    if (iUnload != mPackageMap.end())
     {
-      bbtkMessage("Output",2,"["<<pkgname<<"] already loaded"<<std::endl);
-      return; 
+      bbtkMessage("Output",2,"["<< pkgname <<"] already loaded" << std::endl);
+      return;
     }
-    
-   // If path provided by user will be the first scanned : 
-    // push it into vector of paths
-    if (upath.length()>0) package_paths.push_back(upath);
 
-    // Add the path of config file 
-    if (use_configuration_file)
+
+// =================================================
+// The following structure was checked to work
+// with any type of relative/absolute path.
+// Please don't modify it without checking
+// *all* the cases. JP
+//==================================================
+
+//std::cout << "upath [" << upath << "]" << std::endl;
+
+    bool ok = false;
+    bool foundFile = false;
+
+    // If path provided by user will be the first scanned :
+    // push it into vector of paths
+    if (upath.length()>0)   // ------------------------------------- check user supplied location
     {
-      std::vector<std::string>::const_iterator pi;
-      for (pi =ConfigurationFile::GetInstance().Get_package_paths().begin();
-               pi!=ConfigurationFile::GetInstance().Get_package_paths().end();
-             ++pi)
-            package_paths.push_back(*pi);
+      // std::string path = Utilities::ExpandLibName(upath, verbose);
+      std::string path = Utilities::ExpandLibName(name, verbose); // keep last item, here.
+       if (path != "")
+       {
+          std::string p2;
+          Utilities::ExtractPackageName(path,p2);
+          //libname = Utilities::MakeLibnameFromPath(path, pkgname);
+          libname = Utilities::MakeLibnameFromPath(p2, pkgname); // remove last item
+          // Check if library exists
+          if ( !Utilities::FileExists(libname) )
+          {
+          // 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;
+          }
+          else
+          {
+             ok = DoLoadPackage( libname, pkgname, path, verbose);         
+          }
+       }
+       else
+       {
+          bbtkError("Path ["<<upath<<"] doesn't exist");
+          return;
+       }
     }
-   
-    bool ok = false; 
-    bool foundFile = false;    
+    else     // ----------------------------------------------------- iterate on the paths  
+    {
 
+    std::string path;
+    package_paths = ConfigurationFile::GetInstance().Get_package_paths();
     std::vector<std::string>::iterator i;
     for (i=package_paths.begin();i!=package_paths.end();++i)
-      {
-        foundFile = false;    
-            std::string path = *i;
-       
-       // we *really* want '.' to be the current working directory
-        if (path == ".") {
+    {
+        foundFile = false;
+        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::MakeLibnameFromPath(path, pkgname);
-       
-            bbtkMessage("Debug",2,"-> Trying to load ["<<libname<<"]"<<std::endl);
+
+        bbtkMessage("Debug",2,"-> Trying to load [" << libname << "]" <<std::endl);
 
       // Check if library exists           
         if ( !Utilities::FileExists(libname) )
@@ -331,22 +373,23 @@ namespace bbtk
         // 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
+           if (verbose)
+              std::cout <<"   [" <<libname <<"] : doesn't exist" <<std::endl;
+           continue;  // try next path
         }
         foundFile = true; 
 
       // Try to Load the library
-         
+
         ok = DoLoadPackage( libname, pkgname, path, verbose);
         if (ok)
-            {
-               bbtkMessage("Debug",2,"   OK"<<std::endl);
-               break; // a package was found; we stop iterating
-            }
+        {
+           bbtkMessage("Debug",2,"   OK"<<std::endl);
+           break; // a package was found; we stop iterating
+        }
     } //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
-      //  }
+
+}
 
     if( !ok )  // nothing was loaded
     {
@@ -357,11 +400,11 @@ namespace bbtk
       else
       {
 #if defined(__GNUC__)
-        bbtkError("could not load package \""<< pkgname
-                  <<"\" :" << std::endl << "   " <<dlerror());
+        bbtkError("could not load package ["<< pkgname
+                  <<"] :" << std::endl << "   " << dlerror());
 #elif defined(_WIN32)
-        bbtkError("could not load package \""<<pkgname
-                 <<"\" : " << std::endl << "   " <<libname<<" not found");
+        bbtkError("could not load package ["<<pkgname
+                 <<"] : " << std::endl << "   " <<libname<<" not found");
 
     // look how to get the error message on win
     //<<dlerror());
@@ -373,16 +416,14 @@ namespace bbtk
     bbtkMessage("Output",2,"[" << libname << "] loaded" << std::endl);
 
   }
-    
+
   //===================================================================
   /// \brief UnLoads a package.
   ///
   /// The package must have been previously loaded by LoadPackage.
   /// If the entry is found in the map, calls ClosePackage
- void Factory::UnLoadPackage( const std::string& userSuppliedName )
-  { 
-    std::string path;
-    std::string name = Utilities::ExtractPackageName(userSuppliedName,path);
+ void Factory::UnLoadPackage( const std::string& name )
+ {
     bbtkDebugMessageInc("Core",7,"Factory::UnLoadPackage(\""
                        <<name<<"\")"<<std::endl);
   
@@ -431,16 +472,16 @@ namespace bbtk
                      <<"\" :"<<dlerror());
         }    
 #elif defined(_WIN32)
-        void *delf = GetProcAddress(i->second.mDynamicLibraryHandler, 
+   void *delf = GetProcAddress(i->second.mDynamicLibraryHandler, 
                                  delfname.c_str());
-        if (!delf)
-        {  
-           bbtkError("could not close package \""
+     if (!delf)
+     {  
+       bbtkError("could not close package \""
                 <<i->second.mPackage->GetName()
                 <<"\" : "<<delfname
                 <<" symbol not found (how did you open it ???");
                //<<"\" :"<<dlerror());
-        }    
+     }    
 #endif     
 
    // deletes the package
@@ -489,9 +530,8 @@ namespace bbtk
 
   //===================================================================  
   /// Displays help on a package
-  void Factory::HelpPackage(const std::string& name/* &userSuppliedName */, bool adaptors) const
+  void Factory::HelpPackage(const std::string& name, bool adaptors) const
   {
-   // std::string name = ExtractPackageName(userSuppliedName);
     bbtkDebugMessageInc("Core",9,"Factory::HelpPackage(\""<<name<<"\")"
                         <<std::endl);
 
@@ -778,13 +818,12 @@ namespace bbtk
     fprintf( ff , "  color=lightgrey%s\n",";");
     fprintf( ff , "  rankdir=TB%s\n",";");
 
+    std::string url;
     PackageMapType::const_iterator i;
     for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
     {
-       std::string url = GetPackage(i->first)->GetDocURL();
-       fprintf(ff,"  %s [shape=ellipse, URL=\"%s\"]%s\n",
-              i->first.c_str(),
-              url.c_str(),";" );
+       url=GetPackage(i->first)->GetDocURL();
+       fprintf(ff,"  %s [shape=ellipse, URL=\"%s\"]%s\n",i->first.c_str(),url.c_str(),";" );
     }
     fprintf( ff , "}\n\n");
     bbtkDebugDecTab("Core",9);
@@ -792,49 +831,49 @@ namespace bbtk
   //===================================================================
 
 
-  void Factory::ShowGraphTypes(const std::string& name) const
-  {
-    bool found = false;
-    PackageMapType::const_iterator i;
-    for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
+ void Factory::ShowGraphTypes(const std::string& name) const
+ {
+   bool found = false;
+   PackageMapType::const_iterator i;
+   for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
+   {
+      if (i->second.mPackage->ContainsBlackBox(name)) 
       {
-       if (i->second.mPackage->ContainsBlackBox(name)) 
-         {
-           std::string separator = ConfigurationFile::GetInstance().Get_file_separator ();
-           
+         std::string separator = ConfigurationFile::GetInstance().Get_file_separator ();
+
             // Don't pollute the file store with  "doc_tmp" directories ...    
-           std::string default_doc_dir = ConfigurationFile::GetInstance().Get_default_doc_tmp();
-           std::string directory = "\"" + default_doc_dir + separator + "doc_tmp"  +separator + "\"";
-           std::string filename2 =  default_doc_dir + separator + "doc_tmp" + separator + "tmp.html"; 
-           
+         std::string default_doc_dir = ConfigurationFile::GetInstance().Get_default_doc_tmp();
+         std::string directory = "\"" + default_doc_dir + separator + "doc_tmp"  +separator + "\"";
+         std::string filename2 =  default_doc_dir + separator + "doc_tmp" + separator + "tmp.html"; 
+
 #if defined(_WIN32)  
-           std::string command("start \"Titre\" /D ");
+        std::string command("start \"Titre\" /D ");
 #else 
-           std::string command("gnome-open ");
+        std::string command("gnome-open ");
 #endif
-           command=command + directory +" tmp.html";
-           FILE *ff;
-           ff=fopen(filename2.c_str(),"w");
-           
-           fprintf(ff,"<html><head><title>TMP</title> <script type=\"text/javascript\"> <!--\n");
-           fprintf(ff,"  window.location=\"%s#%s\";\n" , i->second.mPackage->GetDocURL().c_str(),name.c_str() );
-           fprintf(ff,"//--></script></head><body></body></html>\n");
-           
-           
-           //fprintf(ff, "<a  href=\"%s#%s\">Link</a>\n", i->second.mPackage->GetDocURL().c_str(),name.c_str() );
-           fclose(ff);
-           system( command.c_str() );      
-           found = true;
-         }
-      }
+        command=command + directory +" tmp.html";
+        FILE *ff;
+        ff=fopen(filename2.c_str(),"w");
+
+        fprintf(ff,"<html><head><title>TMP</title> <script type=\"text/javascript\"> <!--\n");
+        fprintf(ff,"  window.location=\"%s#%s\";\n" , i->second.mPackage->GetDocURL().c_str(),name.c_str() );
+        fprintf(ff,"//--></script></head><body></body></html>\n");
+
+
+        //fprintf(ff, "<a  href=\"%s#%s\">Link</a>\n", i->second.mPackage->GetDocURL().c_str(),name.c_str() );
+        fclose(ff);
+        system( command.c_str() );      
+        found = true;
+     }
+   }
     
-    bbtkDebugDecTab("Core",9);
-    if (!found) 
-      {
-       bbtkError("No package of the factory contains any black box <"
-                 <<name<<">");
-      }
 }
+   bbtkDebugDecTab("Core",9);
+   if (!found) 
+   {
+      bbtkError("No package of the factory contains any black box <"
+                <<name<<">");
+   }
+ }
 
 }
   
index 76d87e3bf65f53ae629bd69c467006baae3aac01..18b3b763edca5e515271fab03d43cd33f59fb138 100644 (file)
@@ -3,8 +3,8 @@
   Program:   bbtk
   Module:    $RCSfile: bbtkInterpreter.cxx,v $ $
   Language:  C++
-  Date:      $Date: 2008/01/23 07:51:51 $
-  Version:   $Revision: 1.3 $
+  Date:      $Date: 2008/01/28 09:12:49 $
+  Version:   $Revision: 1.4 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -324,7 +324,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 +347,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,7 +391,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
        bbtkMessage("Interpreter",9,"Multiline Comment"<<std::endl);
        return;
     }
-                
+
     // Command 
     CommandInfoType command;
     InterpretCommand(words,command);
@@ -405,144 +405,144 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
     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 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],"user",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);
@@ -700,6 +700,13 @@ 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: ...
+  //
     bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \""
                          <<name<<"\")"<<std::endl);
 
@@ -708,7 +715,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     std::string pkgname;  // e.g. <scriptname>.bbs
      
     pkgname = Utilities::ExtractScriptName(name);
-
+std::cout << "pkgname [" << pkgname << "] name [" << name << "]" << std::endl;
     if (use_configuration_file)
     {
       if (verbose)
@@ -719,10 +726,10 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     bool fullnameGiven = false; 
     bool foundFile     = false;
     std::string::size_type slash_position = name.find_last_of("/\\");
-  
+            
     if (slash_position != std::string::npos)
-    {
-      fullnameGiven = true;     
+    {       // ------------------------------------- check user supplied location 
+      fullnameGiven = true;
       libname =  Utilities::ExpandLibName(name, verbose);
       if (libname != "") {
         if ( Utilities::FileExists(libname))
@@ -731,9 +738,9 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
         }
       }
     }
-    else    // ----------------------- iterate on the paths
+    else    // ------------------------------------- iterate on the paths
     {
-      std::string path;    
+      std::string path;
       std::vector<std::string>::iterator i;
       for (i=script_paths.begin();i!=script_paths.end();++i)
       {
@@ -743,7 +750,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
         if (path == ".") {
           char buf[2048]; // for getcwd
           char * currentDir = getcwd(buf, 2048);
-          std::string cwd(currentDir);        
+          std::string cwd(currentDir);
           path = currentDir;
         }
 
@@ -752,9 +759,12 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
       // Check if library exists           
         if ( ! Utilities::FileExists(libname) )
         {
+        // 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
+          continue;  // try next path
         }
         foundFile = true;
         break; // a script was found; we stop iterating
@@ -768,11 +778,11 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     {
        if (fullnameGiven)
          if(libname == "")
-            bbtkError("Path \""<<name<<"\" doesn't exist");
+            bbtkError("Path ["<<name<<"] doesn't exist");
          else
-            bbtkError("Script \""<<libname<<"\" not found");
+            bbtkError("Script ["<<libname<<"] not found");
        else
-          bbtkError("No \""<<pkgname<<".bbs\" script found");
+          bbtkError("No ["<<pkgname<<".bbs] script found");
        return;    
     }
 
@@ -782,7 +792,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>&
     s->open(libname.c_str());
     if (!s->good()) 
     {
-        bbtkError("Could not open file \""<<libname<<"\"");
+        bbtkError("Could not open file ["<<libname<<"]");
         return;     
     }
 
@@ -1307,7 +1317,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 +1333,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 (...)
       {
index 51f85193ff0b9ec5554611e86cb3ff44d0ae9662..2e771a94baca939286ac7941fb263774b738e661 100644 (file)
@@ -3,8 +3,8 @@
   Program:   bbtk
   Module:    $RCSfile: bbtkUtilities.h,v $
   Language:  C++
-  Date:      $Date: 2008/01/23 07:51:51 $
-  Version:   $Revision: 1.3 $
+  Date:      $Date: 2008/01/28 09:12:49 $
+  Version:   $Revision: 1.4 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See doc/license.txt or
 #define BBTK_USE_TERMIOS_BASED_PROMPT
 #endif
 
+//#include "bbtkMessageManager.h"
+
 namespace bbtk
 {
   /// Holds various usefull methods 
   struct BBTK_EXPORT Utilities
   {
+  
+
+// ===================================================================================
    // See : http://www.techbytes.ca/techbyte103.html for more O.S.
    static inline bool FileExists(std::string strFilename) 
    {
@@ -81,23 +87,23 @@ namespace bbtk
 
     std::string::size_type slash_position = name.find_last_of("/\\");
     if (slash_position != std::string::npos) 
-      {
-       pkgname = name.substr(slash_position+1,std::string::npos);   
-       path = name.substr(0,slash_position); 
-       //      std::cout << "F:P='"<<path<<"'"<<std::endl;//+1,std::string::npos); 
-      } 
+    {
+          pkgname = name.substr(slash_position+1,std::string::npos);
+          path = name.substr(0,slash_position);
+          //   std::cout << "F:P='"<<path<<"'"<<std::endl;//+1,std::string::npos);
+    }
     else 
-      {
-       pkgname = name;  
-      }      
-          
+    {
+          pkgname = name;
+    }
+    
     // remove {.so | dll} if any
     std::string::size_type dot_position = pkgname.find_last_of('.');      
     if (dot_position != std::string::npos){
       pkgname = pkgname.substr(0,dot_position);
     }      
 #if defined(__GNUC__)
-    
+
     // GCC mechanism
     // shared lib name = libbb<name>.so
 
@@ -117,8 +123,8 @@ namespace bbtk
      // remove {bb} if any
     if (memcmp (pkgname.c_str(), "bb", 2) == 0) {
        pkgname =  pkgname.substr(2, pkgname.length());  
-    } 
-         
+    }
+
      /*
      /// \ \todo     what would happen if (stupid) user names his package 'bb' ?!?
      /// \ --> Should be forbidden!
@@ -159,20 +165,28 @@ namespace bbtk
     char * currentDir = getcwd(buf, 2048);
     std::string cwd(currentDir);
     std::string libname(name);
-
+    std::string fileSeparator;
+    fileSeparator = ConfigurationFile::GetInstance().Get_file_separator();
     // tooHigh : true is user supplies a library pathname with too many "../"
     bool tooHigh = false;
-
+    
+//std::cout << "------------------cwd ["  << cwd << "]" << std::endl;
     if ( name[0] == '/' ||  name[0] == '\\' )
     {
       return(libname);
-    } 
-    else if  (name[0] == '.' && (name[1] == '/' || name[1] == '\\') ) 
+    }
+    else if  ( name =="." )
     {
-      libname = cwd  + ConfigurationFile::GetInstance().Get_file_separator () + name.substr(2, name.length());
+      libname = cwd  + fileSeparator;
       return(libname);
-    } 
-    else if ( name[0] == '.' &&  name[1] == '.' && (name[2] == '/' || name[2] == '\\') ) 
+    }
+    else if  (name[0] == '.' && (name[1] == '/' || name[1] == '\\') )
+    {
+      libname = cwd  + fileSeparator + name.substr(2, name.length());
+      return(libname);
+    }
+    else if ( name[0] == '.' &&  name[1] == '.' /*  && (name[2] == '/' || name[2] == '\\') */ ) 
     {
       if ( IsAtRoot(cwd) )  // hope it gets / (for Linux),  C: D: (for Windows)
       {  
@@ -186,18 +200,30 @@ namespace bbtk
          // iterate on ../ and go up from the current working dir!
          std::string a(name); 
          bool alreadyProcessRoot = false;
-         for(;;)
+
+          //if (a[a.size()-1] != fileSeparator[0])
+          //   a.append(fileSeparator);
+//std::cout << "------------------a ["  << a << "]" << std::endl;
+
+         for(;;)  // wild loop !
          {
-            std::string::size_type slash_position = cwd.find_last_of(ConfigurationFile::GetInstance().Get_file_separator ());
+            std::string::size_type slash_position = cwd.find_last_of(fileSeparator);
             if (slash_position != std::string::npos) {
              if (slash_position == 0)
                 slash_position = 1;
               cwd = cwd.substr(0,slash_position/*+1*/);
-                 a = a.substr(3, name.length());  // remove ../
+//std::cout << "------------------cwd ["  << cwd << "]" << std::endl;
+            //  if (a == "..") {
+            //    a = "";
+            //    break;
+            //   }
+            //   else
+                 a = a.substr(3, /*name.length()*/ a.length());  // remove ../
+//std::cout << "------------------a ["  << a << "]" << std::endl;  
               if (a == "" || alreadyProcessRoot)
               {
                 if (verbose)
-                  std::cout << "   File path [" <<  name << "] doesn't exist" << std::endl;
+                  std::cout << "   File path [" <<  name << "] doesn't exist" << std::endl;
                 tooHigh = true;
                 break;
               }
@@ -205,7 +231,7 @@ namespace bbtk
               libname =  cwd;
               char c = cwd[cwd.size()-1];
               if (c != '/' && c != '\\' )
-                libname += ConfigurationFile::GetInstance().Get_file_separator ();
+                libname += fileSeparator;
               libname += a;
 
               if ( a[0] != '.' ) // if . (probabely ../), loop again
@@ -216,12 +242,14 @@ namespace bbtk
             }
          } // end iterating on ../
       }
+//std::cout << "------------------out of loop]" << std::endl;        
       if (tooHigh)
          libname="";
       return (libname);
 
     }  // -----   End of expanding path name   ( ./ ../ ../../ )
 
+    std::cout <<"* ERROR in ExpandLibName : should never get here!" << std::endl;
     // To avoid warning
     return(""); // Will never get here!
   }
@@ -235,6 +263,8 @@ namespace bbtk
 #if defined(__GNUC__)
        if (c != '/')
           libname += "/libbb";
+       else
+          libname += "libbb";
        libname += pkgname;
        libname += ".so";
          
@@ -271,6 +301,7 @@ namespace bbtk
       return(false);
 }
 
+
 // ===================================================================================
 
     static inline void SplitAroundFirstDot( const std::string& in,
@@ -287,12 +318,14 @@ namespace bbtk
       }
       else
       {
-       // bbtkError(in<<" : expected 'a.b' format but no dot found");
-       left ="";
-       right = "";
+            // bbtkError(in<<" : expected 'a.b' format but no dot found");
+            left ="";
+            right = "";
       }
     }
 
+// ===================================================================================
+
     static inline std::string get_file_name(const std::string& s) 
     { 
       std::string::size_type slash_position = s.find_last_of("/\\");
@@ -308,9 +341,9 @@ namespace bbtk
 
 
   //========================================================================
-    // Usefull functions for html generation
-   
-    //========================================================================
+  // Usefull functions for html generation
+  //========================================================================
+
     static inline void replace( std::string& str,
                                 const std::string& from, 
                                 const std::string& to )
@@ -325,7 +358,6 @@ namespace bbtk
     }
     //========================================================================
 
-    //========================================================================
     static inline void html_format(std::string& str)
     {
       replace( str, "&", "&amp;" );