aboutsummaryrefslogtreecommitdiff
path: root/butl/path.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-06-18 14:41:44 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-06-18 14:41:44 +0200
commit08903414e3546bc2c76bef73b2337ccf79886530 (patch)
tree17d76af2771ad209b781b13156da5160ba0f07ae /butl/path.cxx
parent5a79b446475c9643346024a83bb14c2ba9c55dbd (diff)
Move path and filesystem from build2 to libbutl
Diffstat (limited to 'butl/path.cxx')
-rw-r--r--butl/path.cxx109
1 files changed, 109 insertions, 0 deletions
diff --git a/butl/path.cxx b/butl/path.cxx
new file mode 100644
index 0000000..5d804a9
--- /dev/null
+++ b/butl/path.cxx
@@ -0,0 +1,109 @@
+// file : butl/path.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <butl/path>
+
+#ifdef _WIN32
+# include <stdlib.h> // _MAX_PATH
+# include <direct.h> // _[w]getcwd, _[w]chdir
+#else
+# include <errno.h> // EINVAL
+# include <stdlib.h> // mbstowcs, wcstombs
+# include <limits.h> // PATH_MAX
+# include <unistd.h> // getcwd, chdir
+#endif
+
+#include <system_error>
+
+using namespace std;
+
+namespace butl
+{
+ char const* invalid_path_base::
+ what () const throw ()
+ {
+ return "invalid filesystem path";
+ }
+
+ //
+ // char
+ //
+
+ template <>
+ path_traits<char>::string_type path_traits<char>::
+ current ()
+ {
+ // @@ throw system_error (and in the other current() versions).
+
+#ifdef _WIN32
+ char cwd[_MAX_PATH];
+ if(_getcwd(cwd, _MAX_PATH) == 0)
+ throw system_error (errno, system_category ());
+#else
+ char cwd[PATH_MAX];
+ if (getcwd (cwd, PATH_MAX) == 0)
+ throw system_error (errno, system_category ());
+#endif
+
+ return string_type (cwd);
+ }
+
+ template <>
+ void path_traits<char>::
+ current (string_type const& s)
+ {
+#ifdef _WIN32
+ if(_chdir(s.c_str ()) != 0)
+ throw system_error (errno, system_category ());
+#else
+ if (chdir (s.c_str ()) != 0)
+ throw system_error (errno, system_category ());
+#endif
+ }
+
+ //
+ // wchar_t
+ //
+
+ template <>
+ path_traits<wchar_t>::string_type path_traits<wchar_t>::
+ current ()
+ {
+#ifdef _WIN32
+ wchar_t wcwd[_MAX_PATH];
+ if(_wgetcwd(wcwd, _MAX_PATH) == 0)
+ throw system_error (errno, system_category ());
+#else
+ char cwd[PATH_MAX];
+ if (getcwd (cwd, PATH_MAX) == 0)
+ throw system_error (errno, system_category ());
+
+ wchar_t wcwd[PATH_MAX];
+ if (mbstowcs (wcwd, cwd, PATH_MAX) == size_type (-1))
+ throw system_error (EINVAL, system_category ());
+#endif
+
+ return string_type (wcwd);
+ }
+
+ template <>
+ void path_traits<wchar_t>::
+ current (string_type const& s)
+ {
+#ifdef _WIN32
+ if(_wchdir(s.c_str ()) != 0)
+ throw system_error (errno, system_category ());
+#else
+ char ns[PATH_MAX + 1];
+
+ if (wcstombs (ns, s.c_str (), PATH_MAX) == size_type (-1))
+ throw system_error (EINVAL, system_category ());
+
+ ns[PATH_MAX] = '\0';
+
+ if (chdir (ns) != 0)
+ throw system_error (errno, system_category ());
+#endif
+ }
+}