aboutsummaryrefslogtreecommitdiff
path: root/build/path.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-04-13 15:50:17 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-04-13 15:50:17 +0200
commitace1743f7f78bb13f99553d6e97ad1beecf1ba99 (patch)
tree595bc9dad989e44f4be9a67e351219f3248dc5f0 /build/path.cxx
parent534f9d8db025d58c9ce23f3b81a37e8c34386a27 (diff)
Add separate type to represent directory paths
Diffstat (limited to 'build/path.cxx')
-rw-r--r--build/path.cxx51
1 files changed, 23 insertions, 28 deletions
diff --git a/build/path.cxx b/build/path.cxx
index efd0532..899dc8f 100644
--- a/build/path.cxx
+++ b/build/path.cxx
@@ -8,11 +8,16 @@
# 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 build
{
char const* invalid_path_base::
@@ -26,7 +31,7 @@ namespace build
//
template <>
- basic_path<char> basic_path<char>::
+ path_traits<char>::string_type path_traits<char>::
current ()
{
// @@ throw system_error (and in the other current() versions).
@@ -34,31 +39,26 @@ namespace build
#ifdef _WIN32
char cwd[_MAX_PATH];
if(_getcwd(cwd, _MAX_PATH) == 0)
- throw invalid_basic_path<char> (".");
+ throw system_error (errno, system_category ());
#else
char cwd[PATH_MAX];
if (getcwd (cwd, PATH_MAX) == 0)
- throw invalid_basic_path<char> (".");
+ throw system_error (errno, system_category ());
#endif
- return basic_path<char> (cwd);
+ return string_type (cwd);
}
template <>
- void basic_path<char>::
- current (basic_path const& p)
+ void path_traits<char>::
+ current (string_type const& s)
{
- string_type const& s (p.string ());
-
- if (p.empty ())
- throw invalid_basic_path<char> (s);
-
#ifdef _WIN32
if(_chdir(s.c_str ()) != 0)
- throw invalid_basic_path<char> (s);
+ throw system_error (errno, system_category ());
#else
if (chdir (s.c_str ()) != 0)
- throw invalid_basic_path<char> (s);
+ throw system_error (errno, system_category ());
#endif
}
@@ -67,48 +67,43 @@ namespace build
//
template <>
- basic_path<wchar_t> basic_path<wchar_t>::
+ 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 invalid_basic_path<wchar_t> (L".");
+ throw system_error (errno, system_category ());
#else
char cwd[PATH_MAX];
if (getcwd (cwd, PATH_MAX) == 0)
- throw invalid_basic_path<wchar_t> (L".");
+ throw system_error (errno, system_category ());
wchar_t wcwd[PATH_MAX];
if (mbstowcs (wcwd, cwd, PATH_MAX) == size_type (-1))
- throw invalid_basic_path<wchar_t> (L".");
+ throw system_error (EINVAL, system_category ());
#endif
- return basic_path<wchar_t> (wcwd);
+ return string_type (wcwd);
}
template <>
- void basic_path<wchar_t>::
- current (basic_path const& p)
+ void path_traits<wchar_t>::
+ current (string_type const& s)
{
- string_type const& s (p.string ());
-
- if (p.empty ())
- throw invalid_basic_path<wchar_t> (s);
-
#ifdef _WIN32
if(_wchdir(s.c_str ()) != 0)
- throw invalid_basic_path<wchar_t> (s);
+ throw system_error (errno, system_category ());
#else
char ns[PATH_MAX + 1];
if (wcstombs (ns, s.c_str (), PATH_MAX) == size_type (-1))
- throw invalid_basic_path<wchar_t> (s);
+ throw system_error (EINVAL, system_category ());
ns[PATH_MAX] = '\0';
if (chdir (ns) != 0)
- throw invalid_basic_path<wchar_t> (s);
+ throw system_error (errno, system_category ());
#endif
}
}