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/29 14:01:31 $
+ Version: $Revision: 1.8 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See doc/license.txt or
* \class bbtk::Utilities
* \brief various usefull methods
*/
-
+
#ifndef __bbtkUtilities_h_INCLUDED__
#define __bbtkUtilities_h_INCLUDED__
#define BBTK_USE_TERMIOS_BASED_PROMPT
#endif
+#ifdef _MSC_VER
+ #include <windows.h>
+ #include <direct.h>
+#else
+ #include <dirent.h>
+ #include <sys/types.h>
+#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)
{
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
// 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!
// ===================================================================================
- static std::string ExtractScriptName(const std::string &name)
+ static std::string ExtractScriptName(const std::string &name,
+ std::string& path)
{
std::string pkgname;
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);
} else {
pkgname = name;
}
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;
-
- if ( name[0] == '/' || name[0] == '\\' )
+
+//std::cout << "------------------cwd [" << cwd << "] name [" << name << "]" << std::endl;
+
+ if ( name[0] == '/' || name[1] == ':' ) // Linux or Windows absolute name
+ {
+ return(libname);
+ }
+ else if ( name =="." )
{
+ libname = cwd + fileSeparator;
return(libname);
- }
- else if (name[0] == '.' && (name[1] == '/' || name[1] == '\\') )
+ }
+ else if (name[0] == '.' && (name[1] == '/' || name[1] == '\\') )
{
- libname = cwd + ConfigurationFile::GetInstance().Get_file_separator () + name.substr(2, name.length());
+ libname = cwd + fileSeparator + name.substr(2, name.length());
return(libname);
- }
- else if ( name[0] == '.' && name[1] == '.' && (name[2] == '/' || name[2] == '\\') )
+ }
+ else if ( name[0] == '.' && name[1] == '.' /* && (name[2] == '/' || name[2] == '\\') */ )
{
if ( IsAtRoot(cwd) ) // hope it gets / (for Linux), C: D: (for Windows)
{
// 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;
}
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
}
} // 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!
}
#if defined(__GNUC__)
if (c != '/')
libname += "/libbb";
+ else
+ libname += "libbb";
libname += pkgname;
libname += ".so";
// ===================================================================================
- static inline std::string MakePkgnameFromPath(std::string path, std::string pkgname)
+ static inline std::string 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;
- libname += ".bbs";
+ 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;
}
// ===================================================================================
static inline bool 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);
+ }
+
+// ===================================================================================
+
+static bool IsDirectory(std::string const &dirName)
+{
+ struct stat fs;
+
+ if ( stat(dirName.c_str(), &fs) == 0 )
+ {
+#if _WIN32
+ return ((fs.st_mode & _S_IFDIR) != 0);
+#else
+ return S_ISDIR(fs.st_mode);
+#endif
+ }
+ else
+ {
+ return false;
+ }
}
// ===================================================================================
}
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("/\\");
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
+ */
+static int Explore(std::string const &dirpath, bool recursive, std::vector<std::string> &Filenames)
+{
+ int numberOfFiles = 0;
+ std::string fileName;
+
+ std::string dirName = dirpath;
+
+#ifdef _MSC_VER
+ WIN32_FIND_DATA fileData;
+ HANDLE hFile = FindFirstFile((dirName+"*").c_str(), &fileData);
+
+ for(BOOL b = (hFile != INVALID_HANDLE_VALUE); b;
+ b = FindNextFile(hFile, &fileData))
+ {
+ fileName = fileData.cFileName;
+ if ( fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
+ {
+ // Need to check for . and .. to avoid infinite loop
+ if ( fileName != "." && fileName != ".." && recursive )
+ {
+ numberOfFiles += Explore(dirName+ "\\"+fileName,recursive,Filenames);
+ }
+ }
+ else
+ {
+ Filenames.push_back(dirName+fileName);
+ numberOfFiles++;
+ }
+ }
+ DWORD dwError = GetLastError();
+ if (hFile != INVALID_HANDLE_VALUE)
+ FindClose(hFile);
+ if (dwError != ERROR_NO_MORE_FILES)
+ {
+ LPVOID lpMsgBuf;
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
+ FORMAT_MESSAGE_FROM_SYSTEM|
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+ (LPTSTR) &lpMsgBuf,0,NULL);
+
+ // ErrorMacro("FindNextFile error. Error is " << (char *)lpMsgBuf
+ // <<" for the directory : "<<dirName);
+
+ return 0;
+ }
+
+#else
+ // Real POSIX implementation: scandir is a BSD extension only, and doesn't
+ // work on debian for example
+//std::cout <<"in Explor dirname[" << dirName << "]" << std::endl;
+ DIR* dir = opendir(dirName.c_str());
+ if (!dir)
+ {
+ return 0;
+ }
+//std::cout <<"Open OK" << std::endl;
+ // According to POSIX, the dirent structure contains a field char d_name[]
+ // of unspecified size, with at most NAME_MAX characters preceeding the
+ // terminating null character. Use of other fields will harm the porta-
+ // bility of your programs.
+
+ struct stat buf;
+ dirent *d;
+ for (d = readdir(dir); d; d = readdir(dir))
+ {
+ fileName = dirName + "/" + d->d_name;
+//std::cout <<"in Explor filename[" << fileName << "]" << std::endl;
+ if( stat(fileName.c_str(), &buf) != 0 )
+ {
+ //ErrorMacro( strerror(errno) );
+ }
+ if ( S_ISREG(buf.st_mode) ) //is it a regular file?
+ {
+ Filenames.push_back( fileName );
+ numberOfFiles++;
+ }
+ else if ( S_ISDIR(buf.st_mode) ) //directory?
+ {
+ if ( d->d_name[0] != '.' && recursive ) //we also skip hidden files
+ {
+ numberOfFiles += Explore( fileName, recursive, Filenames);
+ }
+ }
+ else
+ {
+ //ErrorMacro( "Unexpected error" );
+ return -1;
+ }
+ }
+ if( closedir(dir) != 0 )
+ {
+ // ErrorMacro( strerror(errno) );
+ }
+#endif
+
+ return numberOfFiles;
+}
//========================================================================
- // 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 )
}
//========================================================================
- //========================================================================
static inline void html_format(std::string& str)
{
replace( str, "&", "&" );