mirror of
https://github.com/boostorg/filesystem.git
synced 2026-02-01 20:42:08 +00:00
Merge system and filesystem branches, bringing them in sync with N2415. Several filesystem bugs fixed, and current_path setter added.
[SVN r39173]
This commit is contained in:
55
src/path.cpp
55
src/path.cpp
@@ -36,10 +36,16 @@ namespace
|
||||
return lc;
|
||||
}
|
||||
|
||||
const std::codecvt<wchar_t, char, std::mbstate_t> *
|
||||
converter(
|
||||
const std::codecvt<wchar_t, char, std::mbstate_t> *&
|
||||
converter()
|
||||
{
|
||||
static const std::codecvt<wchar_t, char, std::mbstate_t> *
|
||||
cvtr(
|
||||
&std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> >
|
||||
( loc() ) );
|
||||
return cvtr;
|
||||
}
|
||||
|
||||
bool locked(false);
|
||||
} // unnamed namespace
|
||||
|
||||
@@ -52,7 +58,7 @@ namespace boost
|
||||
if ( locked ) return false;
|
||||
locked = true;
|
||||
loc() = new_loc;
|
||||
converter = &std::use_facet
|
||||
converter() = &std::use_facet
|
||||
<std::codecvt<wchar_t, char, std::mbstate_t> >( loc() );
|
||||
return true;
|
||||
}
|
||||
@@ -62,9 +68,42 @@ namespace boost
|
||||
if ( locked ) boost::throw_exception(
|
||||
wfilesystem_error(
|
||||
"boost::filesystem::wpath_traits::imbue() after lockdown",
|
||||
system::error_code(EOTHER, system::errno_ecat) ) );
|
||||
system::make_error_code( system::posix::not_supported ) ) );
|
||||
imbue( new_loc, std::nothrow );
|
||||
}
|
||||
|
||||
//namespace detail
|
||||
//{
|
||||
// BOOST_FILESYSTEM_DECL
|
||||
// const char * what( const char * sys_err_what,
|
||||
// const path & path1, const path & path2, std::string & target)
|
||||
// {
|
||||
// try
|
||||
// {
|
||||
// if ( target.empty() )
|
||||
// {
|
||||
// target = sys_err_what;
|
||||
// if ( !path1.empty() )
|
||||
// {
|
||||
// target += ": \"";
|
||||
// target += path1.file_string();
|
||||
// target += "\"";
|
||||
// }
|
||||
// if ( !path2.empty() )
|
||||
// {
|
||||
// target += ", \"";
|
||||
// target += path2.file_string();
|
||||
// target += "\"";
|
||||
// }
|
||||
// }
|
||||
// return target.c_str();
|
||||
// }
|
||||
// catch (...)
|
||||
// {
|
||||
// return sys_err_what;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
# ifdef BOOST_POSIX_API
|
||||
|
||||
@@ -81,12 +120,12 @@ namespace boost
|
||||
std::mbstate_t state;
|
||||
const internal_string_type::value_type * from_next;
|
||||
external_string_type::value_type * to_next;
|
||||
if ( converter->out(
|
||||
if ( converter()->out(
|
||||
state, src.c_str(), src.c_str()+src.size(), from_next, work.get(),
|
||||
work.get()+work_size, to_next ) != std::codecvt_base::ok )
|
||||
boost::throw_exception( boost::filesystem::wfilesystem_error(
|
||||
"boost::filesystem::wpath::to_external conversion error",
|
||||
ph, system::error_code( EINVAL, system::errno_ecat ) ) );
|
||||
ph, system::posix::invalid_argument ) );
|
||||
*to_next = '\0';
|
||||
return external_string_type( work.get() );
|
||||
}
|
||||
@@ -100,12 +139,12 @@ namespace boost
|
||||
std::mbstate_t state;
|
||||
const external_string_type::value_type * from_next;
|
||||
internal_string_type::value_type * to_next;
|
||||
if ( converter->in(
|
||||
if ( converter()->in(
|
||||
state, src.c_str(), src.c_str()+src.size(), from_next, work.get(),
|
||||
work.get()+work_size, to_next ) != std::codecvt_base::ok )
|
||||
boost::throw_exception( boost::filesystem::wfilesystem_error(
|
||||
"boost::filesystem::wpath::to_internal conversion error",
|
||||
system::error_code( EINVAL, system::errno_ecat ) ) );
|
||||
system::posix::invalid_argument ) );
|
||||
*to_next = L'\0';
|
||||
return internal_string_type( work.get() );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user