]> git.tdb.fi Git - libs/core.git/blobdiff - source/fs/utils.cpp
Add move semantics to Variant
[libs/core.git] / source / fs / utils.cpp
index 9a9802524399e53c8b21e723764f939a6fd9f8c1..7ceb7adae843e149c3c05dd6d464d9b2e0bd9396 100644 (file)
@@ -1,14 +1,5 @@
-#include <cstdio>
-#ifdef WIN32
-#include <windows.h>
-#else
-#include <unistd.h>
-#endif
-#include <msp/core/systemerror.h>
 #include <msp/strings/utils.h>
 #include "dir.h"
-#include "path.h"
-#include "stat.h"
 #include "utils.h"
 
 using namespace std;
@@ -18,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())
@@ -50,111 +43,41 @@ 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<string> files;
+                       vector<string> files;
                        if(result.size())
                                files = list_files(result);
                        else
                                files = list_files(".");
 
                        found = false;
-                       for(list<string>::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;
                }
        }
 
        return result;
 }
 
-Path readlink(const Path &link)
-{
-#ifdef WIN32
-       (void)link;
-       throw logic_error("no symbolic links on win32");
-#else
-       char buf[4096];
-       int len = ::readlink(link.str().c_str(), buf, sizeof(buf));
-       if(len==-1)
-               throw system_error("readlink");
-       return string(buf, len);
-#endif
-}
-
-Path realpath(const Path &path)
-{
-#ifdef WIN32
-       if(path.is_absolute())
-               return path;
-       else
-               return getcwd()/path;
-#else
-       list<string> queue(path.begin(), path.end());
-       if(!path.is_absolute())
-       {
-               Path cwd = getcwd();
-               queue.insert(queue.begin(), cwd.begin(), cwd.end());
-       }
-
-       Path real;
-       unsigned n_links = 0;
-       while(!queue.empty())
-       {
-               Path next = real/queue.front();
-               queue.pop_front();
-
-               if(is_link(next))
-               {
-                       if(++n_links>64)
-                               throw runtime_error("too many symbolic links");
-                       Path link = readlink(next);
-                       queue.insert(queue.begin(), link.begin(), link.end());
-               }
-               else
-                       real = next;
-       }
-
-       return real;
-#endif
-}
-
-void rename(const Path &from, const Path &to)
-{
-#ifdef WIN32
-       if(!MoveFileEx(from.c_str(), to.c_str(), MOVEFILE_REPLACE_EXISTING))
-               throw system_error("MoveFileEx");
-#else
-       if(::rename(from.str().c_str(), to.str().c_str())==-1)
-               throw system_error("rename");
-#endif
-}
-
-void unlink(const Path &path)
-{
-#ifdef WIN32
-       if(!DeleteFile(path.c_str()))
-               throw system_error("DeleteFile");
-#else
-       if(::unlink(path.str().c_str())==-1)
-               throw system_error("unlink");
-#endif
-}
-
 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;
@@ -168,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;
@@ -178,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())