Chris@16: /* Chris@16: * Chris@16: * Copyright (c) 1998-2005 Chris@16: * John Maddock Chris@16: * Chris@16: * Use, modification and distribution are subject to the Chris@16: * Boost Software License, Version 1.0. (See accompanying file Chris@16: * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: * Chris@16: */ Chris@16: Chris@16: /* Chris@16: * LOCATION: see http://www.boost.org for most recent version. Chris@16: * FILE regex_workarounds.cpp Chris@16: * VERSION see Chris@16: * DESCRIPTION: Declares Misc workarounds. Chris@16: */ Chris@16: Chris@16: #ifndef BOOST_REGEX_WORKAROUND_HPP Chris@16: #define BOOST_REGEX_WORKAROUND_HPP Chris@16: Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #ifndef BOOST_NO_STD_LOCALE Chris@16: # include Chris@16: #endif Chris@16: Chris@16: #if defined(BOOST_NO_STDC_NAMESPACE) Chris@16: namespace std{ Chris@16: using ::sprintf; using ::strcpy; using ::strcat; using ::strlen; Chris@16: } Chris@16: #endif Chris@16: Chris@16: namespace boost{ namespace re_detail{ Chris@16: #ifdef BOOST_NO_STD_DISTANCE Chris@16: template Chris@16: std::ptrdiff_t distance(const T& x, const T& y) Chris@16: { return y - x; } Chris@16: #else Chris@16: using std::distance; Chris@16: #endif Chris@16: }} Chris@16: Chris@16: Chris@16: #ifdef BOOST_REGEX_NO_BOOL Chris@16: # define BOOST_REGEX_MAKE_BOOL(x) static_cast((x) ? true : false) Chris@16: #else Chris@16: # define BOOST_REGEX_MAKE_BOOL(x) static_cast(x) Chris@16: #endif Chris@16: Chris@16: /***************************************************************************** Chris@16: * Chris@101: * Fix broken namespace support: Chris@16: * Chris@16: ****************************************************************************/ Chris@16: Chris@16: #if defined(BOOST_NO_STDC_NAMESPACE) && defined(__cplusplus) Chris@16: Chris@16: namespace std{ Chris@16: using ::ptrdiff_t; Chris@16: using ::size_t; Chris@16: using ::abs; Chris@16: using ::memset; Chris@16: using ::memcpy; Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: /***************************************************************************** Chris@16: * Chris@16: * helper functions pointer_construct/pointer_destroy: Chris@16: * Chris@16: ****************************************************************************/ Chris@16: Chris@16: #ifdef __cplusplus Chris@16: namespace boost{ namespace re_detail{ Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning (push) Chris@16: #pragma warning (disable : 4100) Chris@16: #endif Chris@16: Chris@16: template Chris@16: inline void pointer_destroy(T* p) Chris@16: { p->~T(); (void)p; } Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning (pop) Chris@16: #endif Chris@16: Chris@16: template Chris@16: inline void pointer_construct(T* p, const T& t) Chris@16: { new (p) T(t); } Chris@16: Chris@16: }} // namespaces Chris@16: #endif Chris@16: Chris@16: /***************************************************************************** Chris@16: * Chris@16: * helper function copy: Chris@16: * Chris@16: ****************************************************************************/ Chris@16: Chris@16: #ifdef __cplusplus Chris@16: namespace boost{ namespace re_detail{ Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && BOOST_WORKAROUND(BOOST_MSVC, <1600) && defined(_CPPLIB_VER) && defined(BOOST_DINKUMWARE_STDLIB) && !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) Chris@16: // Chris@16: // MSVC 8 will either emit warnings or else refuse to compile Chris@16: // code that makes perfectly legitimate use of std::copy, when Chris@16: // the OutputIterator type is a user-defined class (apparently all user Chris@16: // defined iterators are "unsafe"). This code works around that: Chris@16: // Chris@16: template Chris@16: inline OutputIterator copy( Chris@16: InputIterator first, Chris@16: InputIterator last, Chris@16: OutputIterator dest Chris@16: ) Chris@16: { Chris@16: return stdext::unchecked_copy(first, last, dest); Chris@16: } Chris@16: template Chris@16: inline bool equal( Chris@16: InputIterator1 first, Chris@16: InputIterator1 last, Chris@16: InputIterator2 with Chris@16: ) Chris@16: { Chris@16: return stdext::unchecked_equal(first, last, with); Chris@16: } Chris@16: #elif BOOST_WORKAROUND(BOOST_MSVC, > 1500) Chris@16: // Chris@16: // MSVC 10 will either emit warnings or else refuse to compile Chris@16: // code that makes perfectly legitimate use of std::copy, when Chris@16: // the OutputIterator type is a user-defined class (apparently all user Chris@16: // defined iterators are "unsafe"). What's more Microsoft have removed their Chris@16: // non-standard "unchecked" versions, even though their still in the MS Chris@16: // documentation!! Work around this as best we can: Chris@16: // Chris@16: template Chris@16: inline OutputIterator copy( Chris@16: InputIterator first, Chris@16: InputIterator last, Chris@16: OutputIterator dest Chris@16: ) Chris@16: { Chris@16: while(first != last) Chris@16: *dest++ = *first++; Chris@16: return dest; Chris@16: } Chris@16: template Chris@16: inline bool equal( Chris@16: InputIterator1 first, Chris@16: InputIterator1 last, Chris@16: InputIterator2 with Chris@16: ) Chris@16: { Chris@16: while(first != last) Chris@16: if(*first++ != *with++) return false; Chris@16: return true; Chris@16: } Chris@16: #else Chris@16: using std::copy; Chris@16: using std::equal; Chris@16: #endif Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && defined(__STDC_WANT_SECURE_LIB__) && __STDC_WANT_SECURE_LIB__ Chris@16: Chris@16: // use safe versions of strcpy etc: Chris@16: using ::strcpy_s; Chris@16: using ::strcat_s; Chris@16: #else Chris@16: inline std::size_t strcpy_s( Chris@16: char *strDestination, Chris@16: std::size_t sizeInBytes, Chris@16: const char *strSource Chris@16: ) Chris@16: { Chris@16: if(std::strlen(strSource)+1 > sizeInBytes) Chris@16: return 1; Chris@16: std::strcpy(strDestination, strSource); Chris@16: return 0; Chris@16: } Chris@16: inline std::size_t strcat_s( Chris@16: char *strDestination, Chris@16: std::size_t sizeInBytes, Chris@16: const char *strSource Chris@16: ) Chris@16: { Chris@16: if(std::strlen(strSource) + std::strlen(strDestination) + 1 > sizeInBytes) Chris@16: return 1; Chris@16: std::strcat(strDestination, strSource); Chris@16: return 0; Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: inline void overflow_error_if_not_zero(std::size_t i) Chris@16: { Chris@16: if(i) Chris@16: { Chris@16: std::overflow_error e("String buffer too small"); Chris@16: boost::throw_exception(e); Chris@16: } Chris@16: } Chris@16: Chris@16: }} // namespaces Chris@16: Chris@16: #endif // __cplusplus Chris@16: Chris@16: #endif // include guard Chris@16: