X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Fdir.cpp;h=99de180d20ed026812e7fcb2e371dc843a0c333f;hp=c0583cc5ca6fd9011065ed24d89e2d788e2cdcd8;hb=f24e7b96e76b63c9b9b8a6bce4c7a9db64276ea8;hpb=0b5efb3fb96c0cdf4fe2de60952124d66cb8d229 diff --git a/source/fs/dir.cpp b/source/fs/dir.cpp index c0583cc..99de180 100644 --- a/source/fs/dir.cpp +++ b/source/fs/dir.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -19,7 +20,7 @@ namespace enum { -#ifdef WIN32 +#ifdef _WIN32 ITEMSEP = ';' #else ITEMSEP = ':' @@ -36,17 +37,16 @@ const Path &get_bin_dir(const string &argv0) if(!(argv0==last_argv0)) { Path exe; - if(argv0.find('/')==string::npos) - { - const char *path = getenv("PATH"); - vector dirs = split(path, ITEMSEP); - for(vector::const_iterator i=dirs.begin(); i!=dirs.end(); ++i) - if(exists(Path(*i)/argv0)) - { - exe = realpath(Path(*i)/argv0); - break; - } - } + if(argv0.find(DIRSEP)==string::npos) + if(const char *path = getenv("PATH")) + { + for(const string &d: split(path, ITEMSEP)) + if(exists(Path(d)/argv0)) + { + exe = realpath(Path(d)/argv0); + break; + } + } if(exe.empty()) exe = realpath(argv0); @@ -69,10 +69,10 @@ not_a_directory::not_a_directory(const Path &p): void mkpath(const Path &path, int mode) { Path p; - for(Path::Iterator i=path.begin(); i!=path.end(); ++i) + for(const string &c: path) { - p /= *i; -#ifdef WIN32 + p /= c; +#ifdef _WIN32 if(p.size()==1 && p.is_absolute()) continue; #endif @@ -89,10 +89,9 @@ void mkpath(const Path &path, int mode) void rmpath(const Path &path) { - list files = list_files(path); - for(list::iterator i=files.begin(); i!=files.end(); ++i) + for(const string &f: list_files(path)) { - Path p = path / *i; + Path p = path/f; if(is_dir(p)) rmpath(p); else @@ -129,14 +128,12 @@ list list_filtered(const Path &path, const string &filter) return result; } -Path getcwd() +Path get_sys_conf_dir() { - char buf[1024]; - return ::getcwd(buf, sizeof(buf)); -} + const char *argv0 = Application::get_argv0(); + if(!argv0) + throw logic_error("no startup command"); -Path get_sys_conf_dir(const string &argv0) -{ Path dir = get_bin_dir(argv0); if(dir[-1]=="bin" || dir[-1]=="sbin") @@ -150,32 +147,53 @@ Path get_sys_conf_dir(const string &argv0) return dir; } -Path get_sys_data_dir(const string &argv0, const string &appname) +Path get_sys_data_dir() { + const char *argv0 = Application::get_argv0(); + if(!argv0) + throw logic_error("no startup command"); + Path dir = get_bin_dir(argv0); if(dir[-1]=="bin" || dir[-1]=="sbin") - return dir/".."/"share"/appname; + return dir/".."/"share"/Application::get_name(); else if(dir[-1]=="MacOS") return dir/".."/"Resources"; else return dir; } -Path get_sys_lib_dir(const string &argv0, const string &appname) +Path get_sys_lib_dir() { + const char *argv0 = Application::get_argv0(); + if(!argv0) + throw logic_error("no startup command"); + Path dir = get_bin_dir(argv0); if(dir[-1]=="bin" || dir[-1]=="sbin") - return dir/".."/"lib"/appname; + return dir/".."/"lib"/Application::get_name(); else return dir; } -void chdir(const Path &path) +Path path_lookup(const string &name, const list &paths) +{ + for(const Path &p: paths) + { + Path full = p/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"); + list dirs = split(path, ITEMSEP); + return path_lookup(name, list(dirs.begin(), dirs.end())); } } // namespace FS