X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkUtilities.cxx;h=7e85dc76787497b9e350fc332188b4283f88304b;hb=f5ee1c433d1c86bc0aa11fdaba7aa891cbad9b8a;hp=b0eda99f67cbd9db5739e83436edf08c74be4660;hpb=2d2fc4c6349d5040a9f13a240f079e7a1c6687dd;p=bbtk.git diff --git a/kernel/src/bbtkUtilities.cxx b/kernel/src/bbtkUtilities.cxx index b0eda99..7e85dc7 100644 --- a/kernel/src/bbtkUtilities.cxx +++ b/kernel/src/bbtkUtilities.cxx @@ -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 +# include // _NSGetExecutablePath : must add -framework CoreFoundation to link line +# include +# 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& 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 '"<& 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 &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 &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 tokens; - SplitString ( stdOptions,"|", tokens); - int i,size=tokens.size(); - for (i=0; i tokens; + SplitString ( stdOptions,"|", tokens); + int i,size=tokens.size(); + for (i=0; i 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"<