X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Futils.cpp;h=a2fe40be72ee6f39eef6909e576c5703fe9787da;hp=2bfd1bf3ff4c63d9152084fe1ffdc0b802223aa5;hb=e93a28713fe3a50eff4f7e5c07d191e895135748;hpb=609c9a508cfdc7b42c46c4f21d17639204165a00 diff --git a/source/fs/utils.cpp b/source/fs/utils.cpp index 2bfd1bf..a2fe40b 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()) @@ -43,7 +45,7 @@ Path fix_case(const Path &path) Path result; for(Path::Iterator i=path.begin(); i!=path.end(); ++i) { - if(!found || *i=="/") + if(!found || (result.empty() && (*i=="/" || *i=="."))) result /= *i; else { @@ -71,6 +73,9 @@ Path fix_case(const Path &path) Path relative(const Path &path, const Path &base) { + if(path.is_absolute()!=base.is_absolute()) + throw invalid_argument("FS::relative"); + Path::Iterator i = path.begin(); Path::Iterator j = base.begin(); for(; (i!=path.end() && j!=base.end() && *i==*j); ++i, ++j) ; @@ -96,6 +101,9 @@ Path common_ancestor(const Path &path1, const Path &path2) int descendant_depth(const Path &path, const Path &parent) { + if(path.is_absolute()!=parent.is_absolute()) + throw invalid_argument("FS::descendant_depth"); + Path::Iterator i = path.begin(); Path::Iterator j = parent.begin(); for(; (i!=path.end() && j!=parent.end() && *i==*j); ++i, ++j) ;