diff --git a/include/boost/regex/v4/cpp_regex_traits.hpp b/include/boost/regex/v4/cpp_regex_traits.hpp index 106ffcbf..853a8a4e 100644 --- a/include/boost/regex/v4/cpp_regex_traits.hpp +++ b/include/boost/regex/v4/cpp_regex_traits.hpp @@ -415,8 +415,9 @@ template class cpp_regex_traits_implementation : public cpp_regex_traits_char_layer { public: - typedef typename cpp_regex_traits::char_class_type char_class_type; - typedef typename std::ctype::mask native_mask_type; + typedef typename cpp_regex_traits::char_class_type char_class_type; + typedef typename std::ctype::mask native_mask_type; + typedef typename boost::make_unsigned::type unsigned_native_mask_type; #ifndef BOOST_REGEX_BUGGY_CTYPE_FACET BOOST_STATIC_CONSTANT(char_class_type, mask_blank = 1u << 24); BOOST_STATIC_CONSTANT(char_class_type, mask_word = 1u << 25); @@ -753,19 +754,19 @@ void cpp_regex_traits_implementation::init() #ifndef BOOST_REGEX_BUGGY_CTYPE_FACET static const char_class_type masks[16] = { - std::ctype::alnum, - std::ctype::alpha, - std::ctype::cntrl, - std::ctype::digit, - std::ctype::graph, + static_cast(std::ctype::alnum), + static_cast(std::ctype::alpha), + static_cast(std::ctype::cntrl), + static_cast(std::ctype::digit), + static_cast(std::ctype::graph), cpp_regex_traits_implementation::mask_horizontal, - std::ctype::lower, - std::ctype::print, - std::ctype::punct, - std::ctype::space, - std::ctype::upper, + static_cast(std::ctype::lower), + static_cast(std::ctype::print), + static_cast(std::ctype::punct), + static_cast(std::ctype::space), + static_cast(std::ctype::upper), cpp_regex_traits_implementation::mask_vertical, - std::ctype::xdigit, + static_cast(std::ctype::xdigit), cpp_regex_traits_implementation::mask_blank, cpp_regex_traits_implementation::mask_word, cpp_regex_traits_implementation::mask_unicode, @@ -814,27 +815,27 @@ typename cpp_regex_traits_implementation::char_class_type static const char_class_type masks[22] = { 0, - std::ctype::alnum, - std::ctype::alpha, + static_cast(std::ctype::alnum), + static_cast(std::ctype::alpha), cpp_regex_traits_implementation::mask_blank, - std::ctype::cntrl, - std::ctype::digit, - std::ctype::digit, - std::ctype::graph, + static_cast(std::ctype::cntrl), + static_cast(std::ctype::digit), + static_cast(std::ctype::digit), + static_cast(std::ctype::graph), cpp_regex_traits_implementation::mask_horizontal, - std::ctype::lower, - std::ctype::lower, - std::ctype::print, - std::ctype::punct, - std::ctype::space, - std::ctype::space, - std::ctype::upper, + static_cast(std::ctype::lower), + static_cast(std::ctype::lower), + static_cast(std::ctype::print), + static_cast(std::ctype::punct), + static_cast(std::ctype::space), + static_cast(std::ctype::space), + static_cast(std::ctype::upper), cpp_regex_traits_implementation::mask_unicode, - std::ctype::upper, + static_cast(std::ctype::upper), cpp_regex_traits_implementation::mask_vertical, - std::ctype::alnum | cpp_regex_traits_implementation::mask_word, - std::ctype::alnum | cpp_regex_traits_implementation::mask_word, - std::ctype::xdigit, + static_cast(std::ctype::alnum) | cpp_regex_traits_implementation::mask_word, + static_cast(std::ctype::alnum) | cpp_regex_traits_implementation::mask_word, + static_cast(std::ctype::xdigit), }; #else static const char_class_type masks[22] = @@ -1009,6 +1010,18 @@ public: else if((f & re_detail::cpp_regex_traits_implementation::mask_horizontal) && this->isctype(c, std::ctype::space) && !this->isctype(c, re_detail::cpp_regex_traits_implementation::mask_vertical)) return true; +#ifdef __CYGWIN__ + // + // Cygwin has a buggy ctype facet, see https://www.cygwin.com/ml/cygwin/2012-08/msg00178.html: + // + else if((f & std::ctype::xdigit) == std::ctype::xdigit) + { + if((c >= 'a') && (c <= 'f')) + return true; + if((c >= 'A') && (c <= 'F')) + return true; + } +#endif return false; #else return m_pimpl->isctype(c, f);