X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Fdir.cpp;h=717c11c132d7e4fe6e99995827e4918d443062fb;hp=f7f34f668492383087c78ddb4f2627a4e551e38e;hb=5a32939eb6e576c223e1be5f80226d9e628a2398;hpb=c8af8a2167685dc52c6e77951f3fa6ee53d67654 diff --git a/source/fs/dir.cpp b/source/fs/dir.cpp index f7f34f6..717c11c 100644 --- a/source/fs/dir.cpp +++ b/source/fs/dir.cpp @@ -1,12 +1,7 @@ #include -#include -#include -#ifdef WIN32 -#include -#else #include -#include -#endif +#include +#include #include #include #include @@ -23,6 +18,15 @@ namespace FS { namespace { +enum +{ +#ifdef _WIN32 + ITEMSEP = ';' +#else + ITEMSEP = ':' +#endif +}; + /** Helper function to determine the location of the program's executable. Caches the last result to cut down filesystem access with repeated calls. */ const Path &get_bin_dir(const string &argv0) @@ -36,7 +40,7 @@ const Path &get_bin_dir(const string &argv0) if(argv0.find('/')==string::npos) { const char *path = getenv("PATH"); - vector dirs = split(path, ':'); + vector dirs = split(path, ITEMSEP); for(vector::const_iterator i=dirs.begin(); i!=dirs.end(); ++i) if(exists(Path(*i)/argv0)) { @@ -44,7 +48,8 @@ const Path &get_bin_dir(const string &argv0) break; } } - else + + if(exe.empty()) exe = realpath(argv0); last_argv0 = argv0; @@ -62,25 +67,13 @@ not_a_directory::not_a_directory(const Path &p): { } -void mkdir(const Path &path, int mode) -{ -#ifdef WIN32 - (void)mode; - if(!CreateDirectory(path.str().c_str(), NULL)) - throw system_error("CreateDirectory"); -#else - if(::mkdir(path.str().c_str(), mode)==-1) - throw system_error("mkdir"); -#endif -} - void mkpath(const Path &path, int mode) { Path p; for(Path::Iterator i=path.begin(); i!=path.end(); ++i) { p /= *i; -#ifdef WIN32 +#ifdef _WIN32 if(p.size()==1 && p.is_absolute()) continue; #endif @@ -95,17 +88,6 @@ void mkpath(const Path &path, int mode) } } -void rmdir(const Path &path) -{ -#ifdef WIN32 - if(!RemoveDirectory(path.str().c_str())) - throw system_error("RemoveDirectory"); -#else - if(::rmdir(path.str().c_str())==-1) - throw system_error("rmdir"); -#endif -} - void rmpath(const Path &path) { list files = list_files(path); @@ -132,56 +114,35 @@ list list_filtered(const Path &path, const string &filter) list result; DIR *dir = opendir(path.str().c_str()); - if(dir) + if(!dir) + throw system_error("opendir"); + + while(dirent *de = readdir(dir)) { - while(dirent *de = readdir(dir)) - { - const char *fn = de->d_name; - if(fn[0]=='.' && (fn[1]==0 || (fn[1]=='.' && fn[2]==0))) - continue; - if(r_filter.match(fn)) - result.push_back(fn); - } - closedir(dir); + const char *fn = de->d_name; + if(fn[0]=='.' && (fn[1]==0 || (fn[1]=='.' && fn[2]==0))) + continue; + if(r_filter.match(fn)) + result.push_back(fn); } + closedir(dir); return result; } -Path getcwd() -{ - char buf[1024]; - return ::getcwd(buf, sizeof(buf)); -} - -Path get_home_dir() +Path get_user_data_dir() { -#ifdef WIN32 - char home[MAX_PATH]; - if(SHGetFolderPath(0, CSIDL_PERSONAL, 0, 0, home)==S_OK) - return home; -#else - const char *home = getenv("HOME"); - if(home) - return home; -#endif - return "."; -} - -Path get_user_data_dir(const string &appname) -{ -#ifdef WIN32 - char datadir[MAX_PATH]; - if(SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, 0, datadir)==S_OK) - return Path(datadir)/appname; - return "."; -#else - return get_home_dir()/("."+appname); -#endif + const string &name = Application::get_name(); + if(name.empty()) + throw logic_error("application name not known"); + return get_user_data_dir(name); } Path get_sys_conf_dir(const string &argv0) { + if(argv0.empty()) + throw invalid_argument("get_sys_conf_dir"); + Path dir = get_bin_dir(argv0); if(dir[-1]=="bin" || dir[-1]=="sbin") @@ -195,18 +156,42 @@ Path get_sys_conf_dir(const string &argv0) return dir; } +Path get_sys_conf_dir() +{ + const char *argv0 = Application::get_argv0(); + if(!argv0) + throw logic_error("no startup command"); + return get_sys_conf_dir(argv0); +} + Path get_sys_data_dir(const string &argv0, const string &appname) { + if(argv0.empty() || appname.empty()) + throw invalid_argument("get_sys_data_dir"); + Path dir = get_bin_dir(argv0); if(dir[-1]=="bin" || dir[-1]=="sbin") return dir/".."/"share"/appname; + else if(dir[-1]=="MacOS") + return dir/".."/"Resources"; else return dir; } +Path get_sys_data_dir() +{ + const char *argv0 = Application::get_argv0(); + if(!argv0) + throw logic_error("no startup command"); + return get_sys_data_dir(argv0, Application::get_name()); +} + Path get_sys_lib_dir(const string &argv0, const string &appname) { + if(argv0.empty() || appname.empty()) + throw invalid_argument("get_sys_data_dir"); + Path dir = get_bin_dir(argv0); if(dir[-1]=="bin" || dir[-1]=="sbin") @@ -215,10 +200,31 @@ Path get_sys_lib_dir(const string &argv0, const string &appname) return dir; } -void chdir(const Path &path) +Path get_sys_lib_dir() +{ + const char *argv0 = Application::get_argv0(); + if(!argv0) + throw logic_error("no startup command"); + return get_sys_lib_dir(argv0, Application::get_name()); +} + +Path path_lookup(const string &name, const list &paths) +{ + for(list::const_iterator i=paths.begin(); i!=paths.end(); ++i) + { + Path full = *i/name; + if(exists(full)) + return realpath(full); + } + + return Path(); +} + +Path path_lookup(const string &name) { - if(::chdir(path.str().c_str())==-1) - throw system_error("chdir"); + const char *path = getenv("PATH"); + vector dirs = split(path, ITEMSEP); + return path_lookup(name, list(dirs.begin(), dirs.end())); } } // namespace FS