Remove use of _alloca

This commit is contained in:
Peter Dimov
2019-02-26 17:22:58 +02:00
parent f726c068c3
commit ef7c34fc30

View File

@ -81,36 +81,53 @@ inline char const * system_category_message_win32( int ev, char * buffer, std::s
return buffer; return buffer;
} }
#if defined(__GNUC__) boost::winapi::UINT_ const code_page = message_cp_win32();
# define BOOST_SYSTEM_ALLOCA __builtin_alloca
#else
# define BOOST_SYSTEM_ALLOCA _alloca
#endif
wchar_t * wbuffer = static_cast<wchar_t*>( BOOST_SYSTEM_ALLOCA( len * sizeof( wchar_t ) ) ); int r = 0;
#undef BOOST_SYSTEM_ALLOCA #if !defined(BOOST_NO_ANSI_APIS)
if( code_page == boost::winapi::CP_ACP_ )
{
using namespace boost::winapi; using namespace boost::winapi;
DWORD_ retval = boost::winapi::FormatMessageW( DWORD_ retval = boost::winapi::FormatMessageA(
FORMAT_MESSAGE_FROM_SYSTEM_ | FORMAT_MESSAGE_IGNORE_INSERTS_, FORMAT_MESSAGE_FROM_SYSTEM_ | FORMAT_MESSAGE_IGNORE_INSERTS_,
NULL, NULL,
ev, ev,
MAKELANGID_( LANG_NEUTRAL_, SUBLANG_DEFAULT_ ), // Default language MAKELANGID_( LANG_NEUTRAL_, SUBLANG_DEFAULT_ ), // Default language
wbuffer, buffer,
static_cast<DWORD_>( len ), static_cast<DWORD_>( len ),
NULL NULL
); );
if( retval == 0 ) r = static_cast<int>( retval );
{
return unknown_message_win32( ev, buffer, len );
} }
else
UINT_ const code_page = message_cp_win32(); #endif
int r = boost::winapi::WideCharToMultiByte( code_page, 0, wbuffer, -1, buffer, static_cast<int>( len ), NULL, NULL ); {
using namespace boost::winapi;
wchar_t * lpMsgBuf = 0;
DWORD_ retval = boost::winapi::FormatMessageW(
FORMAT_MESSAGE_ALLOCATE_BUFFER_ | FORMAT_MESSAGE_FROM_SYSTEM_ | FORMAT_MESSAGE_IGNORE_INSERTS_,
NULL,
ev,
MAKELANGID_( LANG_NEUTRAL_, SUBLANG_DEFAULT_ ), // Default language
(LPWSTR_) &lpMsgBuf,
0,
NULL
);
if( retval != 0 )
{
r = boost::winapi::WideCharToMultiByte( code_page, 0, lpMsgBuf, -1, buffer, static_cast<int>( len ), NULL, NULL );
boost::winapi::LocalFree( lpMsgBuf );
}
}
if( r == 0 ) if( r == 0 )
{ {