From 756aa0c30268da6b1de3bf6b9b427eefe8520d57 Mon Sep 17 00:00:00 2001 From: Tim Shen Date: Wed, 2 Oct 2013 15:13:18 +0000 Subject: [PATCH] 2013-10-02 Tim Shen * include/bits/regex_compiler.h (_BracketMatcher<>::_M_add_equivalence_class): Implement it correctly. * include/bits/regex_compiler.tcc (_BracketMatcher<>::operator()): Add _M_equiv_set support. * testsuite/28_regex/algorithms/regex_match/extended/ cstring_bracket_01.cc: Add new "[[=a=]]" testcase. From-SVN: r203117 --- libstdc++-v3/ChangeLog | 9 +++++++++ libstdc++-v3/include/bits/regex_compiler.h | 20 ++++++++++++------- libstdc++-v3/include/bits/regex_compiler.tcc | 6 +++--- .../extended/cstring_bracket_01.cc | 5 +++++ 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index dde2e47a40a..61c20a25665 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2013-10-02 Tim Shen + + * include/bits/regex_compiler.h + (_BracketMatcher<>::_M_add_equivalence_class): Implement it correctly. + * include/bits/regex_compiler.tcc (_BracketMatcher<>::operator()): + Add _M_equiv_set support. + * testsuite/28_regex/algorithms/regex_match/extended/ + cstring_bracket_01.cc: Add new "[[=a=]]" testcase. + 2013-10-01 Tim Shen * doc/xml/manual/status_cxx2011.xml: Change "is not implemented" to diff --git a/libstdc++-v3/include/bits/regex_compiler.h b/libstdc++-v3/include/bits/regex_compiler.h index 4e393e7be9a..297fe3f60e9 100644 --- a/libstdc++-v3/include/bits/regex_compiler.h +++ b/libstdc++-v3/include/bits/regex_compiler.h @@ -213,19 +213,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION void _M_add_equivalence_class(const _StringT& __s) { - _M_add_character_class( - _M_traits.transform_primary(__s.data(), - __s.data() + __s.size())); + auto __st = _M_traits.lookup_collatename(__s.data(), + __s.data() + __s.size()); + if (__st.empty()) + __throw_regex_error(regex_constants::error_collate); + __st = _M_traits.transform_primary(__st.data(), + __st.data() + __st.size()); + _M_equiv_set.insert(__st); } void _M_add_character_class(const _StringT& __s) { - auto __st = _M_traits. - lookup_classname(__s.data(), __s.data() + __s.size(), _M_is_icase()); - if (__st == 0) + auto __mask = _M_traits.lookup_classname(__s.data(), + __s.data() + __s.size(), + _M_is_icase()); + if (__mask == 0) __throw_regex_error(regex_constants::error_ctype); - _M_class_set |= __st; + _M_class_set |= __mask; } void @@ -260,6 +265,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } std::set<_CharT> _M_char_set; + std::set<_StringT> _M_equiv_set; std::set> _M_range_set; const _TraitsT& _M_traits; _CharClassT _M_class_set; diff --git a/libstdc++-v3/include/bits/regex_compiler.tcc b/libstdc++-v3/include/bits/regex_compiler.tcc index 94f3d5ea86c..5225bc1ee6c 100644 --- a/libstdc++-v3/include/bits/regex_compiler.tcc +++ b/libstdc++-v3/include/bits/regex_compiler.tcc @@ -437,9 +437,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator()(_CharT __ch) const { bool __ret = false; - if (_M_traits.isctype(__ch, _M_class_set)) - __ret = true; - else if (_M_char_set.count(_M_translate(__ch))) + if (_M_traits.isctype(__ch, _M_class_set) + || _M_char_set.count(_M_translate(__ch)) + || _M_equiv_set.count(_M_traits.transform_primary(&__ch, &__ch+1))) __ret = true; else { diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc index 3a4ff31f104..5d8378556c6 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc @@ -56,6 +56,11 @@ test01() VERIFY( std::regex_match("pre/a", re) ); VERIFY( std::regex_match("pre/0", re) ); } + { + std::regex re("pre/[[=a=]]", std::regex::extended); + VERIFY( std::regex_match("pre/a", re) ); + VERIFY( std::regex_match("pre/A", re) ); + } } int