// Copyright (C) 2010, Guy Barrand. All rights reserved. // See the file tools.license for terms. #ifndef tools_sys_dir #define tools_sys_dir // on Windows, avoid windows.h. // See files to get directory entries (that needs windows.h on Windows). #include #ifdef _MSC_VER #include //extern "C" {char* _getdcwd(int,char*,int);} #else #include #include //getenv. #endif #include namespace tools { namespace dir { inline bool pwd(std::string& a_pwd) { // Return current directory. unsigned int mx_path_len = 2048; char* cwd = new char[mx_path_len]; #ifdef _MSC_VER // driveletter = 0 means return the working directory for the default drive. if(::_getdcwd(0,cwd,mx_path_len)==NULL) { delete [] cwd; a_pwd.clear(); return false; } #else if(::getcwd(cwd,mx_path_len)==NULL) { delete [] cwd; a_pwd.clear(); return false; } #endif a_pwd = cwd; delete [] cwd; return true; } inline bool cd(const std::string& a_path){ if(::chdir(a_path.c_str())!=0) return false; return true; } inline bool create(const std::string& a_name){ // a_name should be a single directory name, and not a file system path. // Then it must not contain : ., .., /, \ etc... #ifdef _MSC_VER return (::mkdir(a_name.c_str())==0 ? true : false); #else return (::mkdir(a_name.c_str(), 0755)==0 ? true : false); #endif } inline bool home(std::string& a_s) { #ifdef _WIN32 const char* env = ::getenv("USERPROFILE"); #else const char* env = ::getenv("HOME"); #endif if(!env) {a_s.clear();return false;} a_s = env; return true; } inline bool cd_home() { std::string s; home(s); if(s.empty()) return false; return cd(s); } //NOTE : SWIG : exists is also a method in file // (can be fix with a %rename(directory_exists)) inline bool in_fs(const std::string& a_path){ struct stat finfo; if (::stat(a_path.c_str(),&finfo) < 0) return false; return true; } //NOTE : SWIG : "is" is a Python keyword. inline bool is_a(const std::string& a_path,bool& a_value) { a_value = false; struct stat finfo; if (::stat(a_path.c_str(),&finfo) < 0) return false; a_value = ( ((finfo.st_mode & S_IFMT) == S_IFDIR) ? true : false); return true; } inline bool is_a(const std::string& a_path) { bool _is; if(!is_a(a_path,_is)) return false; return _is; } inline bool is_dot(const std::string& a_path) { #ifdef _WIN32 char sep = '\\'; #else char sep = '/'; #endif size_t l = a_path.size(); if((l==1) && (a_path[0]=='.') ) return true; if((l==2) && (a_path[0]=='.') && (a_path[l]=='.') ) return true; if((l>=2) && (a_path[l-1]=='.') && (a_path[l-2]==sep) ) return true; if((l>=3) && (a_path[l-1]=='.') && (a_path[l-2]=='.') && (a_path[l-3]==sep) ) return true; return false; } inline bool mkdir(const std::string& a_name) { // a_name should be a single directory name, and not a file system path. // Then it must not contain : ., .., /, \ etc... bool is; if(!is_a(a_name,is)) { //a_name does not exist as a file or dir. if(!create(a_name)) return false; } else { if(!is) return false; //a_name exists but is not a directory. } return true; } inline bool mkcd(const std::string& a_name) { // a_name should be a single directory name, and not a file system path. // Then it must not contain : ., .., /, \ etc... if(!mkdir(a_name)) return false; return cd(a_name); } }} #endif