From 6fdac341960ca78d7020088c4432ecf80e2e3c60 Mon Sep 17 00:00:00 2001 From: Beman Dawes Date: Fri, 11 Jul 2008 01:25:09 +0000 Subject: [PATCH] Merge accumulated changes from trunk [SVN r47300] --- doc/index.html | 16 ++++--- doc/reference.html | 58 ++++++++++++++--------- include/boost/system/error_code.hpp | 38 +++++++-------- include/boost/system/system_error.hpp | 14 +++++- src/error_code.cpp | 31 +++++-------- test/Jamfile.v2 | 17 ++----- test/error_code_test.cpp | 9 +--- test/header_only_test.cpp | 9 +--- test/system_error_test.cpp | 66 +++++++++++++++++---------- 9 files changed, 139 insertions(+), 119 deletions(-) diff --git a/doc/index.html b/doc/index.html index 3e7b50f..50a6267 100644 --- a/doc/index.html +++ b/doc/index.html @@ -11,10 +11,10 @@ - +
- + boost.png (6897 bytes) System Library @@ -132,14 +132,16 @@ Oleg Abrosimov. Christopher Kohlhoff suggested several improvements to the N2066 paper. Johan Nilsson's comments led to several of the refinements in N2066 .


-

© Copyright Beman Dawes, 1999
-Distributed under the Boost Software License, Version 1.0. See -www.boost.org/LICENSE_1_0.txt

-

Revised -November 12, 2007 +February 23, 2008

+

© Copyright Beman Dawes, 1999

+ +

Distributed under the Boost Software License, Version 1.0. +(See file LICENSE_1_0.txt +or  www.boost.org/LICENSE_1_0.txt)

+ \ No newline at end of file diff --git a/doc/reference.html b/doc/reference.html index 21b8489..be513cd 100644 --- a/doc/reference.html +++ b/doc/reference.html @@ -132,10 +132,10 @@ provided, so users may ignore these macros if they prefer.

template< class T="" > struct is_error_condition_enum { static const bool value = false; }; - // portable error_conditions - namespace posix_error + // generic error_conditions + namespace errc { - enum posix_errno + enum errc_t { success = 0, address_family_not_supported, //EAFNOSUPPORT @@ -218,9 +218,9 @@ provided, so users may ignore these macros if they prefer.

wrong_protocol_type //EPROTOTYPE }; - } // namespace posix_error + } // namespace errc - template<> struct is_error_condition_enum<posix_error::posix_errno> + template<> struct is_error_condition_enum<errc::errc_t> { static const bool value = true; }; bool operator==( const error_code & lhs, const error_code & rhs ); @@ -236,8 +236,8 @@ provided, so users may ignore these macros if they prefer.

bool operator<( const error_code & lhs, const error_code & rhs ); bool operator<( const error_condition & lhs, const error_condition & rhs ); - error_code make_error_code( posix_error::posix_errno e ); - error_condition make_error_condition( posix_error::posix_errno e ); + error_code make_error_code( errc::errc_t e ); + error_condition make_error_condition( errc::errc_t e ); template <class charT, class traits> std::basic_ostream<charT,traits>& @@ -247,7 +247,7 @@ provided, so users may ignore these macros if they prefer.

} } -

The value of each posix_errno constant shall be the same as the +

The value of each errc_t constant shall be the same as the value of the <cerrno> macro shown in the above synopsis.

Users may specialize is_error_code_enum and is_error_condition_enum templates to indicate that a type is eligible for @@ -290,10 +290,10 @@ types should create a single object of each such type. }; const error_category & get_system_category(); - const error_category & get_posix_category(); + const error_category & get_generic_category(); static const error_category & system_category = get_system_category(); - static const error_category & posix_category = get_posix_category(); + static const error_category & generic_category = get_generic_category(); } } @@ -316,7 +316,7 @@ this subclause.

Returns:  error_condition( ev, *this ).

 [--Note: Derived classes will typically convert ev - to some portable error_category, such as posix_category, + to some portable error_category, such as generic_category, and return it as an error_condition for that category. --end note]

@@ -361,7 +361,7 @@ non-member functions identifying errors originating from the operating system.

Throws: Nothing.

-
const error_category & get_posix_category();
+
const error_category & get_generic_category();

Returns: A reference to a error_category object identifying portable error conditions.

@@ -370,7 +370,7 @@ non-member functions

Class error_category predefined objects

Predefined objects system_category -and posix_category identify operating system error codes and portable error conditions, respectively.

+and generic_category identify operating system error codes and portable error conditions, respectively.

Class error_code

The class error_code describes an object used to hold error code @@ -454,7 +454,7 @@ error_code modifiers

void clear();

-

postcondition: value() == 0 && category() == posix_category

+

postcondition: value() == 0 && category() == generic_category

Class error_code observers

@@ -538,7 +538,7 @@ constructors
error_condition(); 

Effects: Constructs an object of type error_condition.

-

Postconditions: val_ == 0 and cat_ == posix_category.

+

Postconditions: val_ == 0 and cat_ == generic_category.

Throws: Nothing.

error_condition( value_type val, const error_category & cat );
@@ -571,7 +571,7 @@ modifiers

void clear();

-

postcondition: value() == 0 && category() == posix_category

+

postcondition: value() == 0 && category() == generic_category

Class error_condition observers

@@ -651,13 +651,13 @@ bool operator!=( const error_condition & condition, const error_code & c   || (lhs.category() == rhs.category() && lhs.value() < rhs.value()).

Throws: Nothing.

-
error_code make_error_code( posix_error::posix_errno e );
+
error_code make_error_code( errc::errc_t e );
-

Returns: error_code( e, posix_category).

+

Returns: error_code( e, generic_category).

-
error_condition make_error_condition( posix_error::posix_errno e );
+
error_condition make_error_condition( errc::errc_t e );
-

Returns: error_condition( e, posix_category).

+

Returns: error_condition( e, generic_category).

template <class charT, class traits>
@@ -689,7 +689,10 @@ application program interfaces.

{ public: system_error( error_code ec ); + system_error( error_code ec, const char * what_arg ); system_error( error_code ec, const std::string & what_arg ); + system_error( error_code::value_type ev, const error_category & ecat, + const char * what_arg ); system_error( error_code::value_type ev, const error_category & ecat, const std::string & what_arg ); system_error( error_code::value_type ev, const error_category & ecat); @@ -706,12 +709,25 @@ application program interfaces.

Postcondition: code() == ec
  && std::strcmp( this->runtime_error::what(), "" ) == 0

+
system_error( error_code ec, const char * what_arg );
+
+

Effects: Constructs an object of class system_error.

+

Postcondition: code() == ec
+  && std::strcmp( this->runtime_error::what(), what_arg ) == 0

+
system_error( error_code ec, const std::string & what_arg );

Effects: Constructs an object of class system_error.

Postcondition: code() == ec
  && std::strcmp( this->runtime_error::what(), what_arg.c_str() ) == 0

+
system_error( error_code::value_type ev, const error_category & ecat,
+             const char * what_arg );
+
+

Effects: Constructs an object of class system_error.

+

Postcondition: code() == error_code( ev, ecat )
+  && std::strcmp( this->runtime_error::what(), what_arg ) == 0

+
system_error( error_code::value_type ev, const error_category & ecat,
              const std::string & what_arg );
@@ -743,7 +759,7 @@ Distributed under the Boost Software License, Version 1.0. See www.boost.org/LICENSE_1_0.txt

Revised -November 12, 2007 +June 25, 2008

diff --git a/include/boost/system/error_code.hpp b/include/boost/system/error_code.hpp index d06ddef..a5db008 100644 --- a/include/boost/system/error_code.hpp +++ b/include/boost/system/error_code.hpp @@ -47,11 +47,11 @@ namespace boost template< class T > struct is_error_condition_enum { static const bool value = false; }; - // portable error_conditions -------------------------------------------// + // generic error_conditions --------------------------------------------// - namespace posix_error + namespace errc { - enum posix_errno + enum errc_t { success = 0, address_family_not_supported = EAFNOSUPPORT, @@ -134,13 +134,14 @@ namespace boost wrong_protocol_type = EPROTOTYPE }; - } // namespace posix_error + } // namespace errc # ifndef BOOST_SYSTEM_NO_DEPRECATED - namespace posix = posix_error; + namespace posix = errc; + namespace posix_error = errc; # endif - template<> struct is_error_condition_enum + template<> struct is_error_condition_enum { static const bool value = true; }; @@ -199,15 +200,16 @@ namespace boost // predefined error categories -----------------------------------------// BOOST_SYSTEM_DECL const error_category & get_system_category(); - BOOST_SYSTEM_DECL const error_category & get_posix_category(); + BOOST_SYSTEM_DECL const error_category & get_generic_category(); static const error_category & system_category = get_system_category(); - static const error_category & posix_category = get_posix_category(); + static const error_category & generic_category = get_generic_category(); # ifndef BOOST_SYSTEM_NO_DEPRECATED // deprecated synonyms - static const error_category & errno_ecat = get_posix_category(); - static const error_category & native_ecat = get_system_category(); + static const error_category & posix_category = get_generic_category(); + static const error_category & errno_ecat = get_generic_category(); + static const error_category & native_ecat = get_system_category(); # endif // class error_condition -----------------------------------------------// @@ -219,7 +221,7 @@ namespace boost public: // constructors: - error_condition() : m_val(0), m_cat(&get_posix_category()) {} + error_condition() : m_val(0), m_cat(&get_generic_category()) {} error_condition( int val, const error_category & cat ) : m_val(val), m_cat(&cat) {} template @@ -248,7 +250,7 @@ namespace boost void clear() { m_val = 0; - m_cat = &get_posix_category(); + m_cat = &get_generic_category(); } // observers: @@ -436,17 +438,17 @@ namespace boost + reinterpret_cast(&ec.category()); } - // make_* functions for posix_error::posix_errno -----------------------------// + // make_* functions for errc::errc_t -----------------------------// - namespace posix_error + namespace errc { // explicit conversion: - inline error_code make_error_code( posix_errno e ) - { return error_code( e, get_posix_category() ); } + inline error_code make_error_code( errc_t e ) + { return error_code( e, get_generic_category() ); } // implicit conversion: - inline error_condition make_error_condition( posix_errno e ) - { return error_condition( e, get_posix_category() ); } + inline error_condition make_error_condition( errc_t e ) + { return error_condition( e, get_generic_category() ); } } // error_category default implementation -------------------------------// diff --git a/include/boost/system/system_error.hpp b/include/boost/system/system_error.hpp index 3b4204b..4091647 100644 --- a/include/boost/system/system_error.hpp +++ b/include/boost/system/system_error.hpp @@ -24,13 +24,23 @@ namespace boost public: system_error( error_code ec ) : std::runtime_error(""), m_error_code(ec) {} + system_error( error_code ec, const std::string & what_arg ) : std::runtime_error(what_arg), m_error_code(ec) {} + + system_error( error_code ec, const char* what_arg ) + : std::runtime_error(what_arg), m_error_code(ec) {} + + system_error( int ev, const error_category & ecat ) + : std::runtime_error(""), m_error_code(ev,ecat) {} + system_error( int ev, const error_category & ecat, const std::string & what_arg ) : std::runtime_error(what_arg), m_error_code(ev,ecat) {} - system_error( int ev, const error_category & ecat ) - : std::runtime_error(""), m_error_code(ev,ecat) {} + + system_error( int ev, const error_category & ecat, + const char * what_arg ) + : std::runtime_error(what_arg), m_error_code(ev,ecat) {} virtual ~system_error() throw() {} diff --git a/src/error_code.cpp b/src/error_code.cpp index 02a4cf8..f2623fc 100644 --- a/src/error_code.cpp +++ b/src/error_code.cpp @@ -9,14 +9,7 @@ //----------------------------------------------------------------------------// -// VC++ 8.0 warns on usage of certain Standard Library and API functions that -// can be cause buffer overruns or other possible security issues if misused. -// See http://msdn.microsoft.com/msdnmag/issues/05/05/SafeCandC/default.aspx -// But the wording of the warning is misleading and unsettling, there are no -// portable alternative functions, and VC++ 8.0's own libraries use the -// functions in question. So turn off the warnings. -#define _CRT_SECURE_NO_DEPRECATE -#define _SCL_SECURE_NO_DEPRECATE +#include // define BOOST_SYSTEM_SOURCE so that knows // the library is being built (possibly exporting rather than importing code) @@ -45,12 +38,12 @@ using namespace boost::system::posix_error; namespace { - // standard error categories -------------------------------------------// + // standard error categories ---------------------------------------------// - class posix_error_category : public error_category + class generic_error_category : public error_category { public: - posix_error_category(){} + generic_error_category(){} const char * name() const; std::string message( int ev ) const; }; @@ -64,14 +57,14 @@ namespace error_condition default_error_condition( int ev ) const; }; - // posix_error_category implementation ---------------------------------// + // generic_error_category implementation ---------------------------------// - const char * posix_error_category::name() const + const char * generic_error_category::name() const { - return "POSIX"; + return "GENERIC"; } - std::string posix_error_category::message( int ev ) const + std::string generic_error_category::message( int ev ) const { // strerror_r is preferred because it is always thread safe, // however, we fallback to strerror in certain cases because: @@ -325,7 +318,7 @@ namespace std::string system_error_category::message( int ev ) const { - return posix_category.message( ev ); + return generic_category.message( ev ); } # else // TODO: @@ -409,10 +402,10 @@ namespace boost return system_category_const; } - BOOST_SYSTEM_DECL const error_category & get_posix_category() + BOOST_SYSTEM_DECL const error_category & get_generic_category() { - static const posix_error_category posix_category_const; - return posix_category_const; + static const generic_error_category generic_category_const; + return generic_category_const; } } // namespace system diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index c608255..3dc7468 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -19,31 +19,24 @@ project : # command line : # input files : # requirements - BOOST_SYSTEM_STATIC_LINK static ] [ run error_code_test.cpp - : : : BOOST_SYSTEM_DYN_LINK - : error_code_test_dll + : : : : error_code_test_dll ] [ run error_code_user_test.cpp - : : : BOOST_SYSTEM_STATIC_LINK - static + : : : static ] [ run error_code_user_test.cpp - : : : BOOST_SYSTEM_DYN_LINK - : error_code_user_test_dll + : : : : error_code_user_test_dll ] [ run system_error_test.cpp - : : : BOOST_SYSTEM_STATIC_LINK - static + : : : static ] [ run system_error_test.cpp - : : : BOOST_SYSTEM_DYN_LINK - : system_error_test_dll + : : : : system_error_test_dll ] [ run initialization_test.cpp - : : : BOOST_SYSTEM_DYN_LINK ] [ run header_only_test.cpp : : : static diff --git a/test/error_code_test.cpp b/test/error_code_test.cpp index 3840823..330ddf0 100644 --- a/test/error_code_test.cpp +++ b/test/error_code_test.cpp @@ -9,14 +9,7 @@ //----------------------------------------------------------------------------// -// VC++ 8.0 warns on usage of certain Standard Library and API functions that -// can cause buffer overruns or other possible security issues if misused. -// See http://msdn.microsoft.com/msdnmag/issues/05/05/SafeCandC/default.aspx -// But the wording of the warning is misleading and unsettling, there are no -// portable alternative functions, and VC++ 8.0's own libraries use the -// functions in question. So turn off the warnings. -#define _CRT_SECURE_NO_DEPRECATE -#define _SCL_SECURE_NO_DEPRECATE +#include #include #include diff --git a/test/header_only_test.cpp b/test/header_only_test.cpp index 0f4e17b..20d6179 100644 --- a/test/header_only_test.cpp +++ b/test/header_only_test.cpp @@ -9,14 +9,7 @@ //----------------------------------------------------------------------------// -// VC++ 8.0 warns on usage of certain Standard Library and API functions that -// can cause buffer overruns or other possible security issues if misused. -// See http://msdn.microsoft.com/msdnmag/issues/05/05/SafeCandC/default.aspx -// But the wording of the warning is misleading and unsettling, there are no -// portable altersystem functions, and VC++ 8.0's own libraries use the -// functions in question. So turn off the warnings. -#define _CRT_SECURE_NO_DEPRECATE -#define _SCL_SECURE_NO_DEPRECATE +#include #define BOOST_ERROR_CODE_HEADER_ONLY diff --git a/test/system_error_test.cpp b/test/system_error_test.cpp index 4cbdbd0..269fb5d 100644 --- a/test/system_error_test.cpp +++ b/test/system_error_test.cpp @@ -9,18 +9,12 @@ //----------------------------------------------------------------------------// -// VC++ 8.0 warns on usage of certain Standard Library and API functions that -// can cause buffer overruns or other possible security issues if misused. -// See http://msdn.microsoft.com/msdnmag/issues/05/05/SafeCandC/default.aspx -// But the wording of the warning is misleading and unsettling, there are no -// portable alternative functions, and VC++ 8.0's own libraries use the -// functions in question. So turn off the warnings. -#define _CRT_SECURE_NO_DEPRECATE -#define _SCL_SECURE_NO_DEPRECATE +#include #include #include #include +#include #ifdef BOOST_WINDOWS_API #include @@ -29,6 +23,7 @@ using boost::system::system_error; using boost::system::error_code; using boost::system::system_category; +using std::string; #define TEST(x,v,w) test(#x,x,v,w) @@ -58,29 +53,52 @@ namespace # endif } - const boost::uint_least32_t uvalue = 1u; + const boost::uint_least32_t uvalue = 2u; } int test_main( int, char *[] ) { - // all combinations of constructors: + // all constructors, in the same order as they appear in the header: - system_error se_0_m( error_code(0, system_category), "se_0_m" ); - system_error se_1_m( 1, system_category, "se_1_m" ); - system_error se_0_nm( error_code(0, system_category), "" ); - system_error se_1_nm( 1, system_category, "" ); - system_error se_0_nmx( error_code(0, system_category), "" ); - system_error se_1_nmx( 1, system_category, "" ); - system_error se_1u_m( uvalue, system_category, "se_1u_m" ); + system_error c1_0( error_code(0, system_category) ); + system_error c1_1( error_code(1, system_category) ); + system_error c1_2u( error_code(uvalue, system_category) ); - TEST( se_0_m, 0, "se_0_m" ); - TEST( se_1_m, 1, "se_1_m: Incorrect function" ); - TEST( se_0_nm, 0, "" ); - TEST( se_1_nm, 1, "Incorrect function" ); - TEST( se_0_nmx, 0, "" ); - TEST( se_1_nmx, 1, "Incorrect function" ); - TEST( se_1u_m, 1, "se_1u_m: Incorrect function" ); + system_error c2_0( error_code(0, system_category), string("c2_0") ); + system_error c2_1( error_code(1, system_category), string("c2_1") ); + system_error c3_0( error_code(0, system_category), "c3_0" ); + system_error c3_1( error_code(1, system_category), "c3_1" ); + + system_error c4_0( 0, system_category ); + system_error c4_1( 1, system_category ); + system_error c4_2u( uvalue, system_category ); + + system_error c5_0( 0, system_category, string("c5_0") ); + system_error c5_1( 1, system_category, string("c5_1") ); + + system_error c6_0( 0, system_category, "c6_0" ); + system_error c6_1( 1, system_category, "c6_1" ); + + TEST( c1_0, 0, "" ); + TEST( c1_1, 1, "Incorrect function" ); + TEST( c1_2u, 2, "The system cannot find the file specified" ); + + TEST( c2_0, 0, "c2_0" ); + TEST( c2_1, 1, "c2_1: Incorrect function" ); + + TEST( c3_0, 0, "c3_0" ); + TEST( c3_1, 1, "c3_1: Incorrect function" ); + + TEST( c4_0, 0, "" ); + TEST( c4_1, 1, "Incorrect function" ); + TEST( c4_2u, 2, "The system cannot find the file specified" ); + + TEST( c5_0, 0, "c5_0" ); + TEST( c5_1, 1, "c5_1: Incorrect function" ); + + TEST( c6_0, 0, "c6_0" ); + TEST( c6_1, 1, "c6_1: Incorrect function" ); return 0; }