diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2015-04-13 15:50:17 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2015-04-13 15:50:17 +0200 |
commit | ace1743f7f78bb13f99553d6e97ad1beecf1ba99 (patch) | |
tree | 595bc9dad989e44f4be9a67e351219f3248dc5f0 /build/path.cxx | |
parent | 534f9d8db025d58c9ce23f3b81a37e8c34386a27 (diff) |
Add separate type to represent directory paths
Diffstat (limited to 'build/path.cxx')
-rw-r--r-- | build/path.cxx | 51 |
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 } } |