File: system_category_test.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (120 lines) | stat: -rw-r--r-- 2,389 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120

// 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 <boost/system/error_code.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/core/snprintf.hpp>
#include <cstring>
#include <cstdio>

//

#if defined(BOOST_WINDOWS_API) && defined(BOOST_SYSTEM_USE_UTF8)

#include <boost/config/pragma_message.hpp>

BOOST_PRAGMA_MESSAGE( "Skipping test due to BOOST_WINDOWS_API && BOOST_SYSTEM_USE_UTF8" )

int main() {}

#else

#if defined(BOOST_WINDOWS_API)

#include <windows.h>

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 };
    (void)lf_;

    if( retval == 0 )
    {
        char buffer[ 38 ];

        boost::core::snprintf( buffer, sizeof( buffer ), "Unknown error (%d)", ev );
        return buffer;
    }

    std::string str( static_cast<char const*>( 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)