X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Futils.cpp;h=7ceb7adae843e149c3c05dd6d464d9b2e0bd9396;hp=2bfd1bf3ff4c63d9152084fe1ffdc0b802223aa5;hb=HEAD;hpb=609c9a508cfdc7b42c46c4f21d17639204165a00 diff --git a/source/fs/utils.cpp b/source/fs/utils.cpp index 2bfd1bf..7ceb7ad 100644 --- a/source/fs/utils.cpp +++ b/source/fs/utils.cpp @@ -9,11 +9,13 @@ namespace FS { string basename(const Path &p) { - return p[-1]; + return p.empty() ? string() : p[-1]; } Path dirname(const Path &p) { + if(p.empty()) + return p; if(p.size()==1) { if(p.is_absolute()) @@ -41,28 +43,28 @@ Path fix_case(const Path &path) { bool found = true; Path result; - for(Path::Iterator i=path.begin(); i!=path.end(); ++i) + for(const string &c: path) { - if(!found || *i=="/") - result /= *i; + if(!found || (result.empty() && (c=="/" || c=="."))) + result /= c; else { - list files; + vector files; if(result.size()) files = list_files(result); else files = list_files("."); found = false; - for(list::iterator j=files.begin(); (j!=files.end() && !found); ++j) - if(!strcasecmp(*j,*i)) + for(const string &f: files) + if(!strcasecmp(f, c)) { - result /= *j; + result /= f; found = true; } if(!found) - result /= *i; + result /= c; } } @@ -71,8 +73,11 @@ Path fix_case(const Path &path) Path relative(const Path &path, const Path &base) { - Path::Iterator i = path.begin(); - Path::Iterator j = base.begin(); + if(path.is_absolute()!=base.is_absolute()) + throw invalid_argument("FS::relative"); + + auto i = path.begin(); + auto j = base.begin(); for(; (i!=path.end() && j!=base.end() && *i==*j); ++i, ++j) ; Path result; @@ -86,8 +91,8 @@ Path relative(const Path &path, const Path &base) Path common_ancestor(const Path &path1, const Path &path2) { - Path::Iterator i = path1.begin(); - Path::Iterator j = path2.begin(); + auto i = path1.begin(); + auto j = path2.begin(); Path result; for(; (i!=path1.end() && j!=path2.end() && *i==*j); ++i, ++j) result /= *i; @@ -96,8 +101,11 @@ Path common_ancestor(const Path &path1, const Path &path2) int descendant_depth(const Path &path, const Path &parent) { - Path::Iterator i = path.begin(); - Path::Iterator j = parent.begin(); + if(path.is_absolute()!=parent.is_absolute()) + throw invalid_argument("FS::descendant_depth"); + + auto i = path.begin(); + auto j = parent.begin(); for(; (i!=path.end() && j!=parent.end() && *i==*j); ++i, ++j) ; if(j!=parent.end())