]> git.tdb.fi Git - libs/core.git/blobdiff - source/fs/utils.cpp
Add common_ancestor function
[libs/core.git] / source / fs / utils.cpp
index d34a750903a45dd64864e11f56cd48947a097fb9..1da18591b1c87119c2fccd0012898af78c5e3412 100644 (file)
@@ -1,10 +1,8 @@
 #include <cstdio>
-#include <msp/core/systemerror.h>
 #ifndef WIN32
-#include <fnmatch.h>
-#else
-#include <msp/strings/glob.h>
+#include <unistd.h>
 #endif
+#include <msp/core/systemerror.h>
 #include <msp/strings/utils.h>
 #include "dir.h"
 #include "path.h"
@@ -114,8 +112,7 @@ Path realpath(const Path &path)
                Path next = real/queue.front();
                queue.pop_front();
 
-               struct stat st = lstat(next);
-               if(S_ISLNK(st.st_mode))
+               if(is_link(next))
                {
                        if(++n_links>64)
                                throw runtime_error("too many symbolic links");
@@ -157,6 +154,16 @@ Path relative(const Path &path, const Path &base)
        return result;
 }
 
+Path common_ancestor(const Path &path1, const Path &path2)
+{
+       Path::Iterator i = path1.begin();
+       Path::Iterator j = path2.begin();
+       Path result;
+       for(; (i!=path1.end() && j!=path2.end() && *i==*j); ++i, ++j)
+               result /= *i;
+       return result;
+}
+
 int descendant_depth(const Path &path, const Path &parent)
 {
        Path::Iterator i = path.begin();