// 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 // Avoid spurious VC++ warnings # define _CRT_SECURE_NO_WARNINGS #include #include #include #include // #if defined(BOOST_WINDOWS_API) && defined(BOOST_SYSTEM_USE_UTF8) #include BOOST_PRAGMA_MESSAGE( "Skipping test due to BOOST_WINDOWS_API && BOOST_SYSTEM_USE_UTF8" ) int main() {} #else #if defined(BOOST_WINDOWS_API) #include std::string sys_strerror( int ev ) { void * lpMsgBuf = 0; DWORD retval = FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ev, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR) &lpMsgBuf, 0, NULL ); struct local_free { void * p_; ~local_free() { LocalFree( p_ ); } }; local_free lf_ = { lpMsgBuf }; if( retval == 0 ) { char buffer[ 38 ]; std::sprintf( buffer, "Unknown error (%d)", ev ); return buffer; } std::string str( static_cast( lpMsgBuf ) ); while( !str.empty() && (str[str.size()-1] == '\n' || str[str.size()-1] == '\r') ) { str.erase( str.size()-1 ); } if( !str.empty() && str[str.size()-1] == '.' ) { str.erase( str.size()-1 ); } return str; } #else std::string sys_strerror( int ev ) { return std::strerror( ev ); } #endif // namespace sys = boost::system; static void test_message( sys::error_category const & cat, int ev ) { BOOST_TEST_EQ( cat.message( ev ), sys_strerror( ev ) ); char buffer[ 4096 ]; // yes, really BOOST_TEST_CSTR_EQ( cat.message( ev, buffer, sizeof( buffer ) ), sys_strerror( ev ).c_str() ); } int main() { sys::error_category const & cat = sys::system_category(); // message for( int i = -2; i < 16000; ++i ) { test_message( cat, i ); } return boost::report_errors(); } #endif // #if defined(BOOST_WINDOWS_API) && defined(BOOST_SYSTEM_USE_UTF8)