|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r72855 - in trunk: boost/filesystem/v3 libs/filesystem/v3/src
From: bdawes_at_[hidden]
Date: 2011-07-02 10:43:19
Author: bemandawes
Date: 2011-07-02 10:43:18 EDT (Sat, 02 Jul 2011)
New Revision: 72855
URL: http://svn.boost.org/trac/boost/changeset/72855
Log:
Fix problem of locale("") exception being thrown before main() starts on misconfigured (e.g. LANG="bad name") POSIX systems. Resolves the most serious aspect of tickets 4688, 5100, 5289.
Text files modified:
trunk/boost/filesystem/v3/path.hpp | 13 ++++++++++++-
trunk/libs/filesystem/v3/src/path.cpp | 37 +++++++++++++++++++++----------------
2 files changed, 33 insertions(+), 17 deletions(-)
Modified: trunk/boost/filesystem/v3/path.hpp
==============================================================================
--- trunk/boost/filesystem/v3/path.hpp (original)
+++ trunk/boost/filesystem/v3/path.hpp 2011-07-02 10:43:18 EDT (Sat, 02 Jul 2011)
@@ -125,7 +125,7 @@
path(){}
path(const path& p) : m_pathname(p.m_pathname) {}
-
+
template <class Source>
path(Source const& source,
typename boost::enable_if<path_traits::is_pathable<
@@ -134,6 +134,17 @@
path_traits::dispatch(source, m_pathname, codecvt());
}
+ // Overloads for the operating system API's native character type. Rationale:
+ // - Avoids use of codecvt() for native value_type strings. This limits the
+ // impact of locale("") initialization failures on POSIX systems to programs
+ // that actually depend on locale(""). It further ensures that exceptions thrown
+ // as a result of such failues occur after main() has started, so can be caught.
+ // This is a partial resolution of tickets 4688, 5100, and 5289.
+ // - A slight optimization for a common use case, particularly on POSIX since
+ // value_type is char and that is the most common useage.
+ path(const value_type* s) : m_pathname(s) {}
+ path(const std::basic_string<value_type>& s) : m_pathname(s) {}
+
template <class Source>
path(Source const& source, const codecvt_type& cvt)
// see note above explaining why codecvt() default arguments are not used
Modified: trunk/libs/filesystem/v3/src/path.cpp
==============================================================================
--- trunk/libs/filesystem/v3/src/path.cpp (original)
+++ trunk/libs/filesystem/v3/src/path.cpp 2011-07-02 10:43:18 EDT (Sat, 02 Jul 2011)
@@ -727,11 +727,6 @@
// locale helpers //
//------------------------------------------------------------------------------------//
- // std::locale construction can throw (if LC_MESSAGES is wrong, for example),
- // so a static at function scope is used to ensure that exceptions can be
- // caught. (A previous version was at namespace scope, so initialization
- // occurred before main(), preventing exceptions from being caught.)
-
std::locale default_locale()
{
# ifdef BOOST_WINDOWS_API
@@ -741,32 +736,43 @@
# elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
// "All BSD system functions expect their string parameters to be in UTF-8 encoding
- // and nothing else." http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPInternational/Articles/FileEncodings.html
+ // and nothing else." See
+ // http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPInternational/Articles/FileEncodings.html
//
// "The kernel will reject any filename that is not a valid UTF-8 string, and it will
// even be normalized (to Unicode NFD) before stored on disk, at least when using HFS.
// The right way to deal with it would be to always convert the filename to UTF-8
- // before trying to open/create a file." http://lists.apple.com/archives/unix-porting/2007/Sep/msg00023.html
+ // before trying to open/create a file." See
+ // http://lists.apple.com/archives/unix-porting/2007/Sep/msg00023.html
//
// "How a file name looks at the API level depends on the API. Current Carbon APIs
// handle file names as an array of UTF-16 characters; POSIX ones handle them as an
// array of UTF-8, which is why UTF-8 works well in Terminal. How it's stored on disk
// depends on the disk format; HFS+ uses UTF-16, but that's not important in most
- // cases." http://lists.apple.com/archives/applescript-users/2002/Sep/msg00319.html
+ // cases." See
+ // http://lists.apple.com/archives/applescript-users/2002/Sep/msg00319.html
//
// Many thanks to Peter Dimov for digging out the above references!
+
std::locale global_loc = std::locale();
std::locale loc(global_loc, new boost::filesystem::detail::utf8_codecvt_facet);
return loc;
-# else
- // ISO C calls this "the locale-specific native environment":
+# else // Other POSIX
+
+ // ISO C calls std::locale("") "the locale-specific native environment", and this
+ // locale is the default for many POSIX-based operating systems such as Linux.
+
+ // std::locale("") construction can throw (if environmental variables LC_MESSAGES or
+ // or LANG are wrong, for example), so dynamic initialization is used to ensure
+ // that exceptions can be caught.
+
return std::locale("");
# endif
}
- std::locale & path_locale()
+ std::locale& path_locale()
{
static std::locale loc(default_locale());
return loc;
@@ -783,8 +789,7 @@
namespace filesystem3
{
- const path::codecvt_type *&
- path::wchar_t_codecvt_facet()
+ const path::codecvt_type *& path::wchar_t_codecvt_facet()
{
static const std::codecvt<wchar_t, char, std::mbstate_t> *
facet(
@@ -797,12 +802,12 @@
{
std::locale temp(path_locale());
path_locale() = loc;
- wchar_t_codecvt_facet() = &std::use_facet
- <std::codecvt<wchar_t, char, std::mbstate_t> >(path_locale());
+ wchar_t_codecvt_facet() =
+ &std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(path_locale());
return temp;
}
} // namespace filesystem3
} // namespace boost
-#endif // no wide character support
+#endif // has wide character support
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk