diff --git a/include/boost/system/detail/generic_category.hpp b/include/boost/system/detail/generic_category.hpp index bad6085..d9ee1b5 100644 --- a/include/boost/system/detail/generic_category.hpp +++ b/include/boost/system/detail/generic_category.hpp @@ -11,6 +11,7 @@ // See library home page at http://www.boost.org/libs/system #include +#include #include #include #include @@ -56,82 +57,16 @@ public: // generic_error_category::message -#if defined(__GLIBC__) - -// glibc has two incompatible strerror_r definitions - -inline char const * strerror_r_helper( char const * r, char const * ) BOOST_NOEXCEPT -{ - return r; -} - -inline char const * strerror_r_helper( int r, char const * buffer ) BOOST_NOEXCEPT -{ - return r == 0? buffer: "Unknown error"; -} - inline char const * generic_error_category::message( int ev, char * buffer, std::size_t len ) const BOOST_NOEXCEPT { - return strerror_r_helper( strerror_r( ev, buffer, len ), buffer ); + return generic_error_category_message( ev, buffer, len ); } inline std::string generic_error_category::message( int ev ) const { - char buffer[ 128 ]; - return generic_error_category_message( ev, buffer, sizeof( buffer ) ); + return generic_error_category_message( ev ); } -#else // #if defined(__GLIBC__) - -// std::strerror is thread-safe on everything else, incl. Windows - -# if defined( BOOST_MSVC ) -# pragma warning( push ) -# pragma warning( disable: 4996 ) -# elif defined(__clang__) && defined(__has_warning) -# pragma clang diagnostic push -# if __has_warning("-Wdeprecated-declarations") -# pragma clang diagnostic ignored "-Wdeprecated-declarations" -# endif -# endif - -inline std::string generic_error_category::message( int ev ) const -{ - char const * m = std::strerror( ev ); - return m? m: "Unknown error"; -} - -inline char const * generic_error_category::message( int ev, char * buffer, std::size_t len ) const BOOST_NOEXCEPT -{ - if( len == 0 ) - { - return buffer; - } - - if( len == 1 ) - { - buffer[0] = 0; - return buffer; - } - - char const * m = std::strerror( ev ); - - if( m == 0 ) return "Unknown error"; - - std::strncpy( buffer, m, len - 1 ); - buffer[ len-1 ] = 0; - - return buffer; -} - -# if defined( BOOST_MSVC ) -# pragma warning( pop ) -# elif defined(__clang__) && defined(__has_warning) -# pragma clang diagnostic pop -# endif - -#endif // #if defined(__GLIBC__) - } // namespace detail // generic_category() diff --git a/include/boost/system/detail/generic_category_impl.hpp b/include/boost/system/detail/generic_category_impl.hpp new file mode 100644 index 0000000..5b968ad --- /dev/null +++ b/include/boost/system/detail/generic_category_impl.hpp @@ -0,0 +1,108 @@ +#ifndef BOOST_SYSTEM_DETAIL_GENERIC_CATEGORY_IMPL_HPP_INCLUDED +#define BOOST_SYSTEM_DETAIL_GENERIC_CATEGORY_IMPL_HPP_INCLUDED + +// Implementation details of generic_error_category +// +// Copyright 2018 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// See library home page at http://www.boost.org/libs/system + +#include +#include +#include + +namespace boost +{ + +namespace system +{ + +namespace detail +{ + +#if defined(__GLIBC__) + +// glibc has two incompatible strerror_r definitions + +inline char const * strerror_r_helper( char const * r, char const * ) BOOST_NOEXCEPT +{ + return r; +} + +inline char const * strerror_r_helper( int r, char const * buffer ) BOOST_NOEXCEPT +{ + return r == 0? buffer: "Unknown error"; +} + +inline char const * generic_error_category_message( int ev, char * buffer, std::size_t len ) BOOST_NOEXCEPT +{ + return strerror_r_helper( strerror_r( ev, buffer, len ), buffer ); +} + +inline std::string generic_error_category_message( int ev ) +{ + char buffer[ 128 ]; + return generic_error_category_message( ev, buffer, sizeof( buffer ) ); +} + +#else // #if defined(__GLIBC__) + +// std::strerror is thread-safe on everything else, incl. Windows + +# if defined( BOOST_MSVC ) +# pragma warning( push ) +# pragma warning( disable: 4996 ) +# elif defined(__clang__) && defined(__has_warning) +# pragma clang diagnostic push +# if __has_warning("-Wdeprecated-declarations") +# pragma clang diagnostic ignored "-Wdeprecated-declarations" +# endif +# endif + +inline std::string generic_error_category_message( int ev ) +{ + char const * m = std::strerror( ev ); + return m? m: "Unknown error"; +} + +inline char const * generic_error_category_message( int ev, char * buffer, std::size_t len ) BOOST_NOEXCEPT +{ + if( len == 0 ) + { + return buffer; + } + + if( len == 1 ) + { + buffer[0] = 0; + return buffer; + } + + char const * m = std::strerror( ev ); + + if( m == 0 ) return "Unknown error"; + + std::strncpy( buffer, m, len - 1 ); + buffer[ len-1 ] = 0; + + return buffer; +} + +# if defined( BOOST_MSVC ) +# pragma warning( pop ) +# elif defined(__clang__) && defined(__has_warning) +# pragma clang diagnostic pop +# endif + +#endif // #if defined(__GLIBC__) + +} // namespace detail + +} // namespace system + +} // namespace boost + +#endif // #ifndef BOOST_SYSTEM_DETAIL_GENERIC_CATEGORY_IMPL_HPP_INCLUDED