From 8e761289a2446367267c6c0d9a26e734f0f78306 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 16 Dec 2020 20:29:05 +0300 Subject: Get rid of legacy build systems and rename cutl/ to libcutl/ --- libcutl/fs/path.cxx | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 libcutl/fs/path.cxx (limited to 'libcutl/fs/path.cxx') diff --git a/libcutl/fs/path.cxx b/libcutl/fs/path.cxx new file mode 100644 index 0000000..c163d8b --- /dev/null +++ b/libcutl/fs/path.cxx @@ -0,0 +1,120 @@ +// file : libcutl/fs/path.cxx +// license : MIT; see accompanying LICENSE file + +#ifdef _WIN32 +# include // _MAX_PATH +# include // _[w]getcwd, _[w]chdir +#else +# include // mbstowcs, wcstombs +# include // PATH_MAX +# include // getcwd, chdir +#endif + +#ifndef _WIN32 +# ifndef PATH_MAX +# define PATH_MAX 4096 +# endif +#endif + +#include + +namespace cutl +{ + namespace fs + { + char const* invalid_path_base:: + what () const noexcept + { + return "invalid filesystem path"; + } + + // + // char + // + + template <> + LIBCUTL_EXPORT basic_path basic_path:: + current () + { +#ifdef _WIN32 + char cwd[_MAX_PATH]; + if(_getcwd(cwd, _MAX_PATH) == 0) + throw invalid_basic_path ("."); +#else + char cwd[PATH_MAX]; + if (getcwd (cwd, PATH_MAX) == 0) + throw invalid_basic_path ("."); +#endif + + return basic_path (cwd); + } + + template <> + LIBCUTL_EXPORT void basic_path:: + current (basic_path const& p) + { + string_type const& s (p.string ()); + + if (p.empty ()) + throw invalid_basic_path (s); + +#ifdef _WIN32 + if(_chdir(s.c_str ()) != 0) + throw invalid_basic_path (s); +#else + if (chdir (s.c_str ()) != 0) + throw invalid_basic_path (s); +#endif + } + + // + // wchar_t + // + + template <> + LIBCUTL_EXPORT basic_path basic_path:: + current () + { +#ifdef _WIN32 + wchar_t wcwd[_MAX_PATH]; + if(_wgetcwd(wcwd, _MAX_PATH) == 0) + throw invalid_basic_path (L"."); +#else + char cwd[PATH_MAX]; + if (getcwd (cwd, PATH_MAX) == 0) + throw invalid_basic_path (L"."); + + wchar_t wcwd[PATH_MAX]; + if (mbstowcs (wcwd, cwd, PATH_MAX) == size_type (-1)) + throw invalid_basic_path (L"."); +#endif + + return basic_path (wcwd); + } + + template <> + LIBCUTL_EXPORT void basic_path:: + current (basic_path const& p) + { + string_type const& s (p.string ()); + + if (p.empty ()) + throw invalid_basic_path (s); + +#ifdef _WIN32 + if(_wchdir(s.c_str ()) != 0) + throw invalid_basic_path (s); +#else + char ns[PATH_MAX + 1]; + + if (wcstombs (ns, s.c_str (), PATH_MAX) == size_type (-1)) + throw invalid_basic_path (s); + + ns[PATH_MAX] = '\0'; + + if (chdir (ns) != 0) + throw invalid_basic_path (s); +#endif + } + } +} -- cgit v1.1