diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-07-23 15:25:44 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-07-23 15:25:44 +0200 |
commit | 8286ac511144e4f17d34eac9affb97e50646344a (patch) | |
tree | f1af7320d7b6be6be059216d0ad08ac7b4f73fd0 /libcutl/cutl/fs/path.cxx | |
parent | a15cf65c44d5c224169c32ef5495b68c758134b7 (diff) |
Imported Upstream version 4.0.0upstream/4.0.0
Diffstat (limited to 'libcutl/cutl/fs/path.cxx')
-rw-r--r-- | libcutl/cutl/fs/path.cxx | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/libcutl/cutl/fs/path.cxx b/libcutl/cutl/fs/path.cxx new file mode 100644 index 0000000..87b7f5f --- /dev/null +++ b/libcutl/cutl/fs/path.cxx @@ -0,0 +1,115 @@ +// file : cutl/fs/path.cxx +// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC +// license : MIT; see accompanying LICENSE file + +#ifdef _WIN32 +# include <stdlib.h> // _MAX_PATH +# include <direct.h> // _[w]getcwd, _[w]chdir +#else +# include <stdlib.h> // mbstowcs, wcstombs +# include <limits.h> // PATH_MAX +# include <unistd.h> // getcwd, chdir +#endif + +#include <cutl/fs/path.hxx> + +namespace cutl +{ + namespace fs + { + char const* invalid_path_base:: + what () const throw () + { + return "invalid filesystem path"; + } + + // + // char + // + + template <> + basic_path<char> basic_path<char>:: + current () + { +#ifdef _WIN32 + char cwd[_MAX_PATH]; + if(_getcwd(cwd, _MAX_PATH) == 0) + throw invalid_basic_path<char> ("."); +#else + char cwd[PATH_MAX]; + if (getcwd (cwd, PATH_MAX) == 0) + throw invalid_basic_path<char> ("."); +#endif + + return basic_path<char> (cwd); + } + + template <> + void basic_path<char>:: + current (basic_path const& p) + { + 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); +#else + if (chdir (s.c_str ()) != 0) + throw invalid_basic_path<char> (s); +#endif + } + + // + // wchar_t + // + + template <> + basic_path<wchar_t> basic_path<wchar_t>:: + current () + { +#ifdef _WIN32 + wchar_t wcwd[_MAX_PATH]; + if(_wgetcwd(wcwd, _MAX_PATH) == 0) + throw invalid_basic_path<wchar_t> (L"."); +#else + char cwd[PATH_MAX]; + if (getcwd (cwd, PATH_MAX) == 0) + throw invalid_basic_path<wchar_t> (L"."); + + wchar_t wcwd[PATH_MAX]; + if (mbstowcs (wcwd, cwd, PATH_MAX) == size_type (-1)) + throw invalid_basic_path<wchar_t> (L"."); +#endif + + return basic_path<wchar_t> (wcwd); + } + + template <> + void basic_path<wchar_t>:: + current (basic_path const& p) + { + 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); +#else + char ns[PATH_MAX + 1]; + + if (wcstombs (ns, s.c_str (), PATH_MAX) == size_type (-1)) + throw invalid_basic_path<wchar_t> (s); + + ns[PATH_MAX] = '\0'; + + if (chdir (ns) != 0) + throw invalid_basic_path<wchar_t> (s); +#endif + } + } +} |