From b82e9b016f16f3a85ca33c5ea6896266c3cc662a Mon Sep 17 00:00:00 2001 From: Daniel Kruegler Date: Fri, 14 Nov 2014 04:23:06 +0000 Subject: regex.h: Support embedded zeros in sub_match comparisons (DR 2217) 2014-11-13 Daniel Kruegler * include/bits/regex.h: Support embedded zeros in sub_match comparisons (DR 2217) * testsuite/28_regex/sub_match/embedded_zeros_cmp.cc: Add test cases for embedded zeros From-SVN: r217535 --- libstdc++-v3/ChangeLog | 7 +++ libstdc++-v3/include/bits/regex.h | 20 ++++++-- .../28_regex/sub_match/embedded_zeros_cmp.cc | 55 ++++++++++++++++++++++ 3 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 libstdc++-v3/testsuite/28_regex/sub_match/embedded_zeros_cmp.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 58563cd..6540878 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2014-11-13 Daniel Kruegler + + * include/bits/regex.h: Support embedded zeros in sub_match + comparisons (DR 2217) + * testsuite/28_regex/sub_match/embedded_zeros_cmp.cc: + Add test cases for embedded zeros + 2014-11-13 Tim Shen PR libstdc++/63775 diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index 30189e3..6ff9a82 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -1006,7 +1006,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline bool operator==(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, const sub_match<_Bi_iter>& __rhs) - { return __rhs.compare(__lhs.c_str()) == 0; } + { + typedef typename sub_match<_Bi_iter>::string_type string_type; + return __rhs.compare(string_type(__lhs.data(), __lhs.size())) == 0; + } /** * @brief Tests the inequivalence of a string and a regular expression @@ -1031,7 +1034,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline bool operator<(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, const sub_match<_Bi_iter>& __rhs) - { return __rhs.compare(__lhs.c_str()) > 0; } + { + typedef typename sub_match<_Bi_iter>::string_type string_type; + return __rhs.compare(string_type(__lhs.data(), __lhs.size())) > 0; + } /** * @brief Tests the ordering of a string and a regular expression submatch. @@ -1080,7 +1086,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline bool operator==(const sub_match<_Bi_iter>& __lhs, const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) - { return __lhs.compare(__rhs.c_str()) == 0; } + { + typedef typename sub_match<_Bi_iter>::string_type string_type; + return __lhs.compare(string_type(__rhs.data(), __rhs.size())) == 0; + } /** * @brief Tests the inequivalence of a regular expression submatch and a @@ -1105,7 +1114,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline bool operator<(const sub_match<_Bi_iter>& __lhs, const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) - { return __lhs.compare(__rhs.c_str()) < 0; } + { + typedef typename sub_match<_Bi_iter>::string_type string_type; + return __lhs.compare(string_type(__rhs.data(), __rhs.size())) < 0; + } /** * @brief Tests the ordering of a regular expression submatch and a string. diff --git a/libstdc++-v3/testsuite/28_regex/sub_match/embedded_zeros_cmp.cc b/libstdc++-v3/testsuite/28_regex/sub_match/embedded_zeros_cmp.cc new file mode 100644 index 0000000..0908f12 --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/sub_match/embedded_zeros_cmp.cc @@ -0,0 +1,55 @@ +// { dg-options "-std=gnu++11" } + +// +// 2014-11-13 Daniel Kruegler +// +// Copyright (C) 2014 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// 28.9.2 [re.submatch.op] sub_match members, [DR 2217] + +#include +#include +#include + +int main() +{ + bool test __attribute__((unused)) = true; + + typedef char value_type; + typedef std::basic_string string_type; + typedef std::sub_match sub_match_type; + const string_type test_data1("abc\0d", 4); + value_type test_data2[] = {'a', 'b', 'c'}; + const string_type test_data3("abc"); + + sub_match_type sm; + sm.first = std::begin(test_data2); + sm.second = std::end(test_data2); + sm.matched = true; + + VERIFY( test_data1 != sm ); + VERIFY( sm != test_data1 ); + VERIFY( sm < test_data1 ); + VERIFY( !(test_data1 < sm) ); + VERIFY( test_data1 > sm ); + + VERIFY( test_data3 == sm ); + VERIFY( sm == test_data3 ); + VERIFY( !(sm < test_data3) ); + VERIFY( !(test_data3 < sm) ); +} -- cgit v1.1