X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Futils.cpp;h=7ceb7adae843e149c3c05dd6d464d9b2e0bd9396;hp=ed1ca0ab27c3e3c14070b88822e50cc742ca067c;hb=HEAD;hpb=c4bebb877ec98d518bf02152ca81930e18eda6a7 diff --git a/source/fs/utils.cpp b/source/fs/utils.cpp index ed1ca0a..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; } } @@ -74,8 +76,8 @@ 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(); + auto i = path.begin(); + auto j = base.begin(); for(; (i!=path.end() && j!=base.end() && *i==*j); ++i, ++j) ; Path result; @@ -89,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; @@ -102,8 +104,8 @@ 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(); + auto i = path.begin(); + auto j = parent.begin(); for(; (i!=path.end() && j!=parent.end() && *i==*j); ++i, ++j) ; if(j!=parent.end())