]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkUtilities.cxx
Merge branch 'wt-version'
[bbtk.git] / kernel / src / bbtkUtilities.cxx
index b0eda99f67cbd9db5739e83436edf08c74be4660..7e85dc76787497b9e350fc332188b4283f88304b 100644 (file)
@@ -1,37 +1,56 @@
-/*=========================================================================                                                                               
+/*
+ # ---------------------------------------------------------------------
+ #
+ # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+ #                        pour la SantÈ)
+ # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+ # Previous Authors : Laurent Guigues, Jean-Pierre Roux
+ # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+ #
+ #  This software is governed by the CeCILL-B license under French law and
+ #  abiding by the rules of distribution of free software. You can  use,
+ #  modify and/ or redistribute the software under the terms of the CeCILL-B
+ #  license as circulated by CEA, CNRS and INRIA at the following URL
+ #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ #  or in the file LICENSE.txt.
+ #
+ #  As a counterpart to the access to the source code and  rights to copy,
+ #  modify and redistribute granted by the license, users are provided only
+ #  with a limited warranty  and the software's author,  the holder of the
+ #  economic rights,  and the successive licensors  have only  limited
+ #  liability.
+ #
+ #  The fact that you are presently reading this means that you have had
+ #  knowledge of the CeCILL-B license and that you accept its terms.
+ # ------------------------------------------------------------------------ */
+
+
+/*=========================================================================
   Program:   bbtk
   Module:    $RCSfile: bbtkUtilities.cxx,v $
   Language:  C++
-  Date:      $Date: 2008/11/12 12:47:01 $
-  Version:   $Revision: 1.8 $
+  Date:      $Date: 2012/11/16 08:49:01 $
+  Version:   $Revision: 1.15 $
 =========================================================================*/
 
-/* ---------------------------------------------------------------------
-
-* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
-* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
-*
-*  This software is governed by the CeCILL-B license under French law and 
-*  abiding by the rules of distribution of free software. You can  use, 
-*  modify and/ or redistribute the software under the terms of the CeCILL-B 
-*  license as circulated by CEA, CNRS and INRIA at the following URL 
-*  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
-*  or in the file LICENSE.txt.
-*
-*  As a counterpart to the access to the source code and  rights to copy,
-*  modify and redistribute granted by the license, users are provided only
-*  with a limited warranty  and the software's author,  the holder of the
-*  economic rights,  and the successive licensors  have only  limited
-*  liability. 
-*
-*  The fact that you are presently reading this means that you have had
-*  knowledge of the CeCILL-B license and that you accept its terms.
-* ------------------------------------------------------------------------ */                                                                         
+
 
 
 #include "bbtkUtilities.h"
+#include "bbtkMessageManager.h"
 
+#if defined(MACOSX) // assume this is OSX 
+# include <sys/param.h>
+# include <mach-o/dyld.h> // _NSGetExecutablePath : must add -framework CoreFoundation to link line 
+# include <string.h>
+# ifndef PATH_MAX
+#  define PATH_MAX MAXPATHLEN
+# endif
+#endif // MACOSX
+
+#ifndef PATH_MAX // If not defined yet : do it 
+#  define PATH_MAX 2048
+#endif 
 
 namespace bbtk
 {
@@ -253,7 +272,8 @@ namespace bbtk
   std::string Utilities::MakeLibnameFromPath(std::string path, std::string pkgname)
   {
     std::string libname = path;
-    char c = path[path.size()-1];    
+       if(path.size()>0){
+               char c = path[path.size()-1];    
 #if defined(__GNUC__)
        if (c != '/')
           libname += "/libbb";
@@ -267,11 +287,15 @@ namespace bbtk
 #endif 
          
 #elif defined(_WIN32)
-       if (c != '\\')
-          libname = path+"\\bb";
+       if (c != '\\') 
+          libname += "\\bb";
+       else
+          libname += "bb";
        libname += pkgname;
        libname += ".dll";
 #endif
+       }
+    
     return libname;    
   }
 
@@ -280,147 +304,170 @@ namespace bbtk
   std::string Utilities::MakePkgnameFromPath(std::string path, std::string pkgname, bool addExt)
   {
     std::string libname = path;
-    char c = path[path.size()-1];
-    if (c != '/' && c != '\\')
-    {
-       libname +=  ConfigurationFile::GetInstance().Get_file_separator ();
-    }
-    libname += pkgname;
-    if (addExt)
-    {
-       int l = libname.size();
-       if (l>4)
-       {
-          if (libname.substr(l-4, 4) != ".bbs")
-          {
-               libname = libname + ".bbs";
-          }
-       }
-    }
+       if(path.size()>0){
+               char c = path[path.size()-1];
+               if (c != '/' && c != '\\')
+               {
+                  libname +=  ConfigurationFile::GetInstance().Get_file_separator ();
+               }
+               libname += pkgname;
+               if (addExt)
+               {
+                  int l = libname.size();
+                  if (l>4)
+                  {
+                         if (libname.substr(l-4, 4) != ".bbs")
+                         {
+                                  libname = libname + ".bbs";
+                         }
+                  }
+               }
+       }
+    
     return libname;
   }
+  // =======================================================================
+
+  // =======================================================================
+  /// Returns the user settings dir, e.g. /home/username/.bbtk
+  std::string Utilities::GetUserSettingsDir()
+  {
+    std::string str_Home=Utilities::GetEnvHome();
+    std::string fullname = str_Home + "/.bbtk";
+    MakeValidFileName(fullname);
+    return fullname;
+  }
+  
 
   // =======================================================================
   /// Builds the complete path to the file 'name' located 
   /// in user settings dir, e.g. /home/username/.bbtk/
   std::string Utilities::MakeUserSettingsFullFileName(const std::string& name)
   {
-#if defined(__GNUC__)
-    std::string str_home(getenv("HOME"));
-#elif defined(_WIN32)
-    std::string str_home(getenv("USERPROFILE"));
-#endif
+    std::string str_home=Utilities::GetEnvHome();
     std::string fullname = str_home + "/.bbtk/" + name;
-    Utilities::replace( fullname, 
-                       INVALID_FILE_SEPARATOR , 
-                       VALID_FILE_SEPARATOR);
+    MakeValidFileName(fullname);
     return fullname;
   }
+  // =======================================================================
   
 
+  // =======================================================================
+  void Utilities::CreateDirectoryIfNeeded( std::string const &dirName)
+  {
+    if (FileExists(dirName)) return;
+    std::string cmd("mkdir \"");
+    cmd += dirName;
+    cmd += "\"";
+    system(cmd.c_str());
+  }  
+  // =======================================================================
+  
+  
+  //========================================================================
+  bool Utilities::IsAtRoot(std::string cwd)
+  {
+    if ( cwd == "/"              // hope it gets /     (for Linux)
+        || (cwd.size() <= 3 && cwd[1] == ':') ) // hope it gets C: D: (for Windows)
+      return (true);
+    else
+      return(false);
+  }
+  // ======================================================================
 
-    //========================================================================
-    
-    bool Utilities::IsAtRoot(std::string cwd)
-    {
-      if ( cwd == "/"              // hope it gets /     (for Linux)
-          || (cwd.size() <= 3 && cwd[1] == ':') ) // hope it gets C: D: (for Windows)
-       return (true);
-      else
-       return(false);
-    }
-    
-    // ======================================================================
+  // ======================================================================
+  bool Utilities::IsDirectory(std::string const &dirName)
+  {
+    struct stat fs;
     
-    bool Utilities::IsDirectory(std::string const &dirName)
-    {
-      struct stat fs;
-      
-      if ( stat(dirName.c_str(), &fs) == 0 )
-       {
+    if ( stat(dirName.c_str(), &fs) == 0 )
+      {
 #if _WIN32
-         return ((fs.st_mode & _S_IFDIR) != 0);
+       return ((fs.st_mode & _S_IFDIR) != 0);
 #else
-         return S_ISDIR(fs.st_mode);
+       return S_ISDIR(fs.st_mode);
 #endif
-       }
-      else
-       {
-         return false;
-       }
-    }
-    
-    // ===================================================================================
-    
-    void Utilities::SplitAroundFirstDot( const std::string& in,
-                                            std::string& left,
-                                            std::string& right)
-    {
-      std::string delimiter = ".";
-      std::string::size_type pos = in.find_first_of(delimiter);
-      if (std::string::npos != pos) 
-       {
-         left = in.substr(0,pos);
-         right = in.substr(pos+1,in.size());
-         
-       }
-      else
-       {
-         // bbtkError(in<<" : expected 'a.b' format but no dot found");
-         left ="";
-         right = "";
-       }
-    }
-    //=======================================================================
-    void Utilities::SplitString ( const std::string& str, 
-                                    const std::string& delimiters, 
-                                    std::vector<std::string>& tokens)
-    {
-      // Skip delimiters at beginning.
-      std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
-      // Find first delimiter.
-      std::string::size_type pos     = str.find_first_of(delimiters, lastPos);
-      
-      while (std::string::npos != pos || std::string::npos != lastPos)
-       {
-         // Found a token, add it to the vector.
-         tokens.push_back(str.substr(lastPos, pos - lastPos));
-         // Skip delimiters.  Note the "not_of"
-         lastPos = str.find_first_not_of(delimiters, pos);
-         // Find next delimiter
-         pos = str.find_first_of(delimiters, lastPos);
-       }
-      
-    }
-    //=======================================================================
-    
+      }
+    else
+      {
+       return false;
+      }
+  }
+  // =======================================================================
     
-    // ===================================================================================
+  // =======================================================================
+  void Utilities::SplitAroundFirstDot( const std::string& in,
+                                      std::string& left,
+                                      std::string& right)
+  {
+    std::string delimiter = ".";
+    std::string::size_type pos = in.find_first_of(delimiter);
+    if (std::string::npos != pos) 
+      {
+       left = in.substr(0,pos);
+       right = in.substr(pos+1,in.size());
+       
+      }
+    else
+      {
+       left ="";
+       right = "";
+       bbtkGlobalError("Token '"<<in<<"' : expected 'a.b' format but no dot found");
+      }
+  }
+  //=======================================================================
+
+  //=======================================================================
+  void Utilities::SplitString ( const std::string& str, 
+                               const std::string& delimiters, 
+                               std::vector<std::string>& tokens)
+  {
+    // Skip delimiters at beginning.
+    std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
+    // Find first delimiter.
+    std::string::size_type pos     = str.find_first_of(delimiters, lastPos);
     
-    std::string Utilities::get_file_name(const std::string& s) 
-    { 
-      std::string::size_type slash_position = s.find_last_of("/\\");
-      if (slash_position != std::string::npos) 
-       {
-         return  s.substr(slash_position+1,std::string::npos);   
-       }
-      else 
-       {
-         return s;
-       }
-    }
+    while (std::string::npos != pos || std::string::npos != lastPos)
+      {
+       // Found a token, add it to the vector.
+       tokens.push_back(str.substr(lastPos, pos - lastPos));
+       // Skip delimiters.  Note the "not_of"
+       lastPos = str.find_first_not_of(delimiters, pos);
+       // Find next delimiter
+       pos = str.find_first_of(delimiters, lastPos);
+      }
     
-    // ===================================================================================
-    /**
-     * \brief   Explore a directory with possibility of recursion
-     *          return number of files read
-     * @param  dirpath   directory to explore
-     * @param  recursive whether we want recursion or not
-     */
-    int Utilities::Explore(std::string const &dirpath, bool recursive, std::vector<std::string> &Filenames)
-    {
-      int numberOfFiles = 0;
-      std::string fileName;
+  }
+  //=======================================================================
+  
+  
+  // ======================================================================
+  std::string Utilities::get_file_name(const std::string& s) 
+  { 
+    std::string::size_type slash_position = s.find_last_of("/\\");
+    if (slash_position != std::string::npos) 
+      {
+       return  s.substr(slash_position+1,std::string::npos);   
+      }
+    else 
+      {
+       return s;
+      }
+  }
+  //=======================================================================
+
+  // ========================================================================
+  /**
+   * \brief   Explore a directory with possibility of recursion
+   *          return number of files read
+   * @param  dirpath   directory to explore
+   * @param  recursive whether we want recursion or not
+   */
+  int Utilities::Explore(std::string const &dirpath, bool recursive, std::vector<std::string> &Filenames)
+  {
+    int numberOfFiles = 0;
+    std::string fileName;
       
       std::string dirName = dirpath;
       
@@ -517,7 +564,8 @@ namespace bbtk
   return numberOfFiles;
 
 }
-
+  //=======================================================================
 
     //=======================================================================
     // Replaces substrings "\\n" by a real carriage return "\n"
@@ -526,7 +574,7 @@ namespace bbtk
       std::string ss("\\n");
       std::string::size_type pos = 0;
       pos = s.find(ss,0);
-      char* cr = "\n";
+      const char* cr = "\n";
       while ( pos != std::string::npos )
        {
          s.replace(pos,2,cr,1);
@@ -536,31 +584,253 @@ namespace bbtk
     //=======================================================================
 
 
+   //=======================================================================
 
-bool Utilities::loosematch(std::string stdLine,std::string stdOptions) 
-{
-       bool result=false;
-         std::vector<std::string> tokens;
-         SplitString ( stdOptions,"|", tokens);
-         int i,size=tokens.size();  
-         for (i=0; i<size; i++)
-         {               
+  bool Utilities::loosematch(std::string stdLine,std::string stdOptions) 
+  {
+    bool result=false;
+    std::vector<std::string> tokens;
+    SplitString ( stdOptions,"|", tokens);
+    int i,size=tokens.size();  
+    for (i=0; i<size; i++)
+      {                  
 #ifdef WIN32
-                 if ( strcmpi(stdLine.c_str(),tokens[i].c_str())==0) 
-                 
-                         result=true; 
-                 }               
+       if ( strcmpi(stdLine.c_str(),tokens[i].c_str())==0) 
+         { 
+           result=true; 
+         }               
 #else
-                 if ( strcasecmp(stdLine.c_str(),tokens[i].c_str())==0) 
-                 
-                         result=true; 
-                 }               
+       if ( strcasecmp(stdLine.c_str(),tokens[i].c_str())==0) 
+         { 
+           result=true; 
+         }               
 #endif
-
+       
+      }
+    return result;
+  }
+  //=========================================================================  
+  
+  //=========================================================================  
+  // From http://www.fltk.org/newsgroups.php?gfltk.general+v:22083
+  //
+  int get_app_path (char *pname, size_t pathsize)
+  {
+#ifdef LINUX
+    /* Oddly, the readlink(2) man page says no NULL is appended. */
+    /* So you have to do it yourself, based on the return value: */
+    pathsize --; /* Preserve a space to add the trailing NULL */
+    long result = readlink("/proc/self/exe", pname, pathsize);
+    if (result > 0)
+      {
+       pname[result] = 0; /* add the #@!%ing NULL */
+       
+       if ((access(pname, 0) == 0))
+         return 0; /* file exists, return OK */
+       /*else name doesn't seem to exist, return FAIL (falls
+         through) */
+      }
+#endif /* LINUX */
+    
+#ifdef WIN32
+    long result = GetModuleFileName(NULL, pname, pathsize);
+    if (result > 0)
+      {
+       /* fix up the dir slashes... */
+       int len = strlen(pname);
+       int idx;
+       for (idx = 0; idx < len; idx++)
+         {
+           if (pname[idx] == '\\') pname[idx] = '/';
+         }
+       
+       for (idx = len-1; idx >=0 ; idx--)
+         {
+           if (pname[idx] == '/')
+             { 
+               pname[idx+1] = '\0';
+               idx = -1;
+             }
+         }
+       
+       if ((access(pname, 0) == 0))
+         return 0; /* file exists, return OK */
+       /*else name doesn't seem to exist, return FAIL (falls
+         through) */
+      }
+#endif /* WIN32 */
+    
+#ifdef SOLARIS
+    char *p = getexecname();
+    if (p)
+      {
+       /* According to the Sun manpages, getexecname will
+          "normally" return an */
+       /* absolute path - BUT might not... AND that IF it is not,
+          pre-pending */
+       /* getcwd() will "usually" be the correct thing... Urgh!
+        */
+       
+       /* check pathname is absolute (begins with a / ???) */
+       if (p[0] == '/') /* assume this means we have an
+                           absolute path */
+         {
+           strncpy(pname, p, pathsize);
+           if ((access(pname, 0) == 0))
+             return 0; /* file exists, return OK */
+         }
+       else /* if not, prepend getcwd() then check if file
+               exists */
+         {
+           getcwd(pname, pathsize);
+           long result = strlen(pname);
+           strncat(pname, "/", (pathsize - result));
+           result ++;
+           strncat(pname, p, (pathsize - result));
+           
+           if ((access(pname, 0) == 0))
+             return 0; /* file exists, return OK */
+           /*else name doesn't seem to exist, return FAIL
+             (falls through) */
+         }
+      }
+#endif /* SOLARIS */
+    
+#ifdef MACOSX /* assume this is OSX */
+    /*
+      from http://www.hmug.org/man/3/NSModule.html
+      
+      extern int _NSGetExecutablePath(char *buf, unsigned long
+      *bufsize);
+      
+      _NSGetExecutablePath  copies  the  path  of the executable
+      into the buffer and returns 0 if the path was successfully
+      copied  in the provided buffer. If the buffer is not large
+      enough, -1 is returned and the  expected  buffer  size  is
+      copied  in  *bufsize.  Note that _NSGetExecutablePath will
+      return "a path" to the executable not a "real path" to the
+      executable.  That  is  the path may be a symbolic link and
+      not the real file. And with  deep  directories  the  total
+      bufsize needed could be more than MAXPATHLEN.
+    */
+    int status = -1;
+    char *given_path = (char*)malloc(MAXPATHLEN * 2);
+    if (!given_path) return status;
+    
+    uint32_t npathsize = MAXPATHLEN * 2;
+    long result = _NSGetExecutablePath(given_path, &npathsize);
+    if (result == 0)
+      { /* OK, we got something - now try and resolve the real path...
+        */
+       if (realpath(given_path, pname) != NULL)
+         {
+           if ((access(pname, 0) == 0))
+             status = 0; /* file exists, return OK */
          }
-         return result;
+      }
+    free (given_path);
+    return status;
+#endif /* MACOSX */
+    
+    return -1; /* Path Lookup Failed */
+  } 
+  //=========================================================================
+       
+
+       
+  //=========================================================================
+  std::string Utilities::GetExecutablePath()
+  {
+    char name[PATH_MAX];
+    int err = get_app_path(name, PATH_MAX);
+    if (err) 
+      {
+       bbtkGlobalError("Could not determine current executable path ?");  
+      }
+    
+    // remove the exe name
+    char *slash;               
+    slash = strrchr(name, VALID_FILE_SEPARATOR_CHAR);
+    if (slash)
+      {
+       *slash = 0;
+      }
+    return name;
+  }
+  //=========================================================================
+
+
+std::string Utilities::GetEnvHome()
+{
+#if defined(__GNUC__)
+       std::string strHome;
+    char *envHome=getenv("HOME");
+    if (envHome!=NULL)  
+       { 
+               strHome=envHome; 
+       } else {
+               strHome = "/var/www/testwtdbg/docroot";
+       } // if
+#elif defined(_WIN32)
+       std::string strHome( getenv("USERPROFILE") );
+#endif
+       return strHome;
+}   
+
+
+
+//TAD Arbol CFT
+
+
+//---------NodeTree---------------
+
+NodeTreeC::NodeTreeC() 
+{
+       
+}
+
+NodeTreeC::NodeTreeC(std::string _data)
+{
+       data = _data;
 }
 
+NodeTreeC::~NodeTreeC()
+{
 
+}
+void NodeTreeC::deleteTree()
+{
+       data = "";
+       std::cout<<"NodeTreeC::deleteTree 1"<<std::endl;
+       childs.erase(childs.begin(),childs.begin()+childs.size());
+       std::cout<<"NodeTreeC::deleteTree 2"<<std::endl;
+}
+
+void NodeTreeC::insertChild(std::string _data)
+{
+       NodeTreeC temp = NodeTreeC(_data);
+       childs.push_back(temp);
+       //std::cout<<"NodeTreeC::insertChild"<<std::endl;
+}
+
+void NodeTreeC::treeTour(int lvl)
+{
+       std::string space = "";
+       for (int j=0; j<lvl ; j++){
+                               space += "   ";
+       }
+       lvl++;
+       std::cout <<space<<"data: "<< data << "  size: "<< childs.size() << std::endl;
+       for(int i = 0 ; i < childs.size(); i++)
+       {
+               childs[i].treeTour(lvl);                
+       }
+}
+
+void NodeTreeC::setData(std::string _data)
+{
+       data = _data;
+       //std::cout<<"NodeTreeC::setData"<<std::endl;
+}
 
 }