2013-09-24 04:05:00 +02:00
|
|
|
// class template regex -*- C++ -*-
|
|
|
|
|
2022-01-03 10:42:10 +01:00
|
|
|
// Copyright (C) 2013-2022 Free Software Foundation, Inc.
|
2013-09-24 04:05:00 +02:00
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
|
|
|
|
// Under Section 7 of GPL version 3, you are granted additional
|
|
|
|
// permissions described in the GCC Runtime Library Exception, version
|
|
|
|
// 3.1, as published by the Free Software Foundation.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License and
|
|
|
|
// a copy of the GCC Runtime Library Exception along with this program;
|
|
|
|
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
|
|
// <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @file bits/regex.tcc
|
|
|
|
* This is an internal header file, included by other library headers.
|
|
|
|
* Do not attempt to use it directly. @headername{regex}
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace std _GLIBCXX_VISIBILITY(default)
|
|
|
|
{
|
2013-10-06 19:53:14 +02:00
|
|
|
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
|
|
|
2017-07-23 10:41:35 +02:00
|
|
|
namespace __detail
|
|
|
|
{
|
2019-05-07 17:30:40 +02:00
|
|
|
/// @cond undocumented
|
|
|
|
|
2013-10-06 19:53:14 +02:00
|
|
|
// Result of merging regex_match and regex_search.
|
|
|
|
//
|
2013-10-20 12:07:29 +02:00
|
|
|
// __policy now can be _S_auto (auto dispatch) and _S_alternate (use
|
|
|
|
// the other one if possible, for test purpose).
|
2013-10-06 19:53:14 +02:00
|
|
|
//
|
|
|
|
// That __match_mode is true means regex_match, else regex_search.
|
|
|
|
template<typename _BiIter, typename _Alloc,
|
2021-12-17 19:04:28 +01:00
|
|
|
typename _CharT, typename _TraitsT>
|
2013-10-06 19:53:14 +02:00
|
|
|
bool
|
|
|
|
__regex_algo_impl(_BiIter __s,
|
|
|
|
_BiIter __e,
|
|
|
|
match_results<_BiIter, _Alloc>& __m,
|
|
|
|
const basic_regex<_CharT, _TraitsT>& __re,
|
2021-12-17 19:04:28 +01:00
|
|
|
regex_constants::match_flag_type __flags,
|
|
|
|
_RegexExecutorPolicy __policy,
|
|
|
|
bool __match_mode)
|
2013-10-06 19:53:14 +02:00
|
|
|
{
|
|
|
|
if (__re._M_automaton == nullptr)
|
|
|
|
return false;
|
|
|
|
|
libstdc++: Reduce use of debug containers in <regex>
The std::regex code uses std::map and std::vector, which means that when
_GLIBCXX_DEBUG is defined it uses the debug versions of those
containers. That no longer compiles, because I changed <regex> to
include <bits/stl_map.h> and <bits/stl_vector.h> instead of <map> and
<vector>, so the debug versions aren't defined, and std::map doesn't
compile. There is also a use of std::stack, which defaults to std::deque
which is the debug deque when _GLIBCXX_DEBUG is defined.
Using std::map, std::vector, and std::deque is probably a mistake, and
we should qualify them with _GLIBCXX_STD_C instead so that the debug
versions aren't used. We do not need the overhead of checking our own
uses of those containers, which should be correct anyway. The exception
is the vector base class of std::match_results, which exposes iterators
to users, so can benefit from debug mode checks for its iterators. For
other accesses to the vector elements, match_results already does its
own checks, so can access the _GLIBCXX_STD_C::vector base class
directly.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/regex.h (basic_regex::transform_primary): Use
_GLIBCXX_STD_C::vector for local variable.
* include/bits/regex.tcc (__regex_algo_impl): Use reference to
_GLIBCXX_STD_C::vector base class of match_results.
* include/bits/regex_automaton.tcc (_StateSeq:_M_clone): Use
_GLIBCXX_STD_C::map and _GLIBCXX_STD_C::deque for local
variables.
* include/bits/regex_compiler.h (_BracketMatcher): Use
_GLIBCXX_STD_C::vector for data members.
* include/bits/regex_executor.h (_Executor): Likewise.
* include/std/regex [_GLIBCXX_DEBUG]: Include <debug/vector>.
2021-08-09 12:49:09 +02:00
|
|
|
typename match_results<_BiIter, _Alloc>::_Unchecked& __res = __m;
|
2014-12-13 23:19:18 +01:00
|
|
|
__m._M_begin = __s;
|
re PR libstdc++/64441 (A match_results returns an incorrect sub_match if the sub_match::matched is false)
PR libstdc++/64441
* include/bits/regex.h (match_results<>::size,
match_results<>::position, match_results<>::str,
match_results<>::operator[], match_results<>::prefix,
match_results<>::suffix, match_results<>::end,
match_results<>::_M_resize, match_results<>::_M_unmatched_sub,
match_results<>::_M_prefix, match_results<>::_M_suffix): Remove
global __unmatched_sub. Add unmatched submatch as part of
match_results.
* include/bits/regex.tcc (__regex_algo_impl<>, regex_replace<>,
regex_iterator<>::operator++): Adjust to use match_results::_M_prefix.
* testsuite/28_regex/match_results/out_of_range_submatches.cc:
New testcases.
From-SVN: r221330
2015-03-10 19:41:46 +01:00
|
|
|
__m._M_resize(__re._M_automaton->_M_sub_count());
|
2013-10-06 19:53:14 +02:00
|
|
|
|
|
|
|
bool __ret;
|
2015-04-28 06:16:48 +02:00
|
|
|
if ((__re.flags() & regex_constants::__polynomial)
|
|
|
|
|| (__policy == _RegexExecutorPolicy::_S_alternate
|
|
|
|
&& !__re._M_automaton->_M_has_backref))
|
2013-10-26 18:09:28 +02:00
|
|
|
{
|
|
|
|
_Executor<_BiIter, _Alloc, _TraitsT, false>
|
libstdc++: Reduce use of debug containers in <regex>
The std::regex code uses std::map and std::vector, which means that when
_GLIBCXX_DEBUG is defined it uses the debug versions of those
containers. That no longer compiles, because I changed <regex> to
include <bits/stl_map.h> and <bits/stl_vector.h> instead of <map> and
<vector>, so the debug versions aren't defined, and std::map doesn't
compile. There is also a use of std::stack, which defaults to std::deque
which is the debug deque when _GLIBCXX_DEBUG is defined.
Using std::map, std::vector, and std::deque is probably a mistake, and
we should qualify them with _GLIBCXX_STD_C instead so that the debug
versions aren't used. We do not need the overhead of checking our own
uses of those containers, which should be correct anyway. The exception
is the vector base class of std::match_results, which exposes iterators
to users, so can benefit from debug mode checks for its iterators. For
other accesses to the vector elements, match_results already does its
own checks, so can access the _GLIBCXX_STD_C::vector base class
directly.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/regex.h (basic_regex::transform_primary): Use
_GLIBCXX_STD_C::vector for local variable.
* include/bits/regex.tcc (__regex_algo_impl): Use reference to
_GLIBCXX_STD_C::vector base class of match_results.
* include/bits/regex_automaton.tcc (_StateSeq:_M_clone): Use
_GLIBCXX_STD_C::map and _GLIBCXX_STD_C::deque for local
variables.
* include/bits/regex_compiler.h (_BracketMatcher): Use
_GLIBCXX_STD_C::vector for data members.
* include/bits/regex_executor.h (_Executor): Likewise.
* include/std/regex [_GLIBCXX_DEBUG]: Include <debug/vector>.
2021-08-09 12:49:09 +02:00
|
|
|
__executor(__s, __e, __res, __re, __flags);
|
2013-10-26 18:09:28 +02:00
|
|
|
if (__match_mode)
|
|
|
|
__ret = __executor._M_match();
|
|
|
|
else
|
|
|
|
__ret = __executor._M_search();
|
|
|
|
}
|
2013-10-06 19:53:14 +02:00
|
|
|
else
|
2013-10-26 18:09:28 +02:00
|
|
|
{
|
|
|
|
_Executor<_BiIter, _Alloc, _TraitsT, true>
|
libstdc++: Reduce use of debug containers in <regex>
The std::regex code uses std::map and std::vector, which means that when
_GLIBCXX_DEBUG is defined it uses the debug versions of those
containers. That no longer compiles, because I changed <regex> to
include <bits/stl_map.h> and <bits/stl_vector.h> instead of <map> and
<vector>, so the debug versions aren't defined, and std::map doesn't
compile. There is also a use of std::stack, which defaults to std::deque
which is the debug deque when _GLIBCXX_DEBUG is defined.
Using std::map, std::vector, and std::deque is probably a mistake, and
we should qualify them with _GLIBCXX_STD_C instead so that the debug
versions aren't used. We do not need the overhead of checking our own
uses of those containers, which should be correct anyway. The exception
is the vector base class of std::match_results, which exposes iterators
to users, so can benefit from debug mode checks for its iterators. For
other accesses to the vector elements, match_results already does its
own checks, so can access the _GLIBCXX_STD_C::vector base class
directly.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/regex.h (basic_regex::transform_primary): Use
_GLIBCXX_STD_C::vector for local variable.
* include/bits/regex.tcc (__regex_algo_impl): Use reference to
_GLIBCXX_STD_C::vector base class of match_results.
* include/bits/regex_automaton.tcc (_StateSeq:_M_clone): Use
_GLIBCXX_STD_C::map and _GLIBCXX_STD_C::deque for local
variables.
* include/bits/regex_compiler.h (_BracketMatcher): Use
_GLIBCXX_STD_C::vector for data members.
* include/bits/regex_executor.h (_Executor): Likewise.
* include/std/regex [_GLIBCXX_DEBUG]: Include <debug/vector>.
2021-08-09 12:49:09 +02:00
|
|
|
__executor(__s, __e, __res, __re, __flags);
|
2013-10-26 18:09:28 +02:00
|
|
|
if (__match_mode)
|
|
|
|
__ret = __executor._M_match();
|
|
|
|
else
|
|
|
|
__ret = __executor._M_search();
|
|
|
|
}
|
2013-10-06 19:53:14 +02:00
|
|
|
if (__ret)
|
|
|
|
{
|
2014-12-31 11:27:41 +01:00
|
|
|
for (auto& __it : __res)
|
2013-10-06 19:53:14 +02:00
|
|
|
if (!__it.matched)
|
|
|
|
__it.first = __it.second = __e;
|
re PR libstdc++/64441 (A match_results returns an incorrect sub_match if the sub_match::matched is false)
PR libstdc++/64441
* include/bits/regex.h (match_results<>::size,
match_results<>::position, match_results<>::str,
match_results<>::operator[], match_results<>::prefix,
match_results<>::suffix, match_results<>::end,
match_results<>::_M_resize, match_results<>::_M_unmatched_sub,
match_results<>::_M_prefix, match_results<>::_M_suffix): Remove
global __unmatched_sub. Add unmatched submatch as part of
match_results.
* include/bits/regex.tcc (__regex_algo_impl<>, regex_replace<>,
regex_iterator<>::operator++): Adjust to use match_results::_M_prefix.
* testsuite/28_regex/match_results/out_of_range_submatches.cc:
New testcases.
From-SVN: r221330
2015-03-10 19:41:46 +01:00
|
|
|
auto& __pre = __m._M_prefix();
|
|
|
|
auto& __suf = __m._M_suffix();
|
2013-10-06 19:53:14 +02:00
|
|
|
if (__match_mode)
|
|
|
|
{
|
|
|
|
__pre.matched = false;
|
|
|
|
__pre.first = __s;
|
|
|
|
__pre.second = __s;
|
|
|
|
__suf.matched = false;
|
|
|
|
__suf.first = __e;
|
|
|
|
__suf.second = __e;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__pre.first = __s;
|
|
|
|
__pre.second = __res[0].first;
|
|
|
|
__pre.matched = (__pre.first != __pre.second);
|
|
|
|
__suf.first = __res[0].second;
|
|
|
|
__suf.second = __e;
|
|
|
|
__suf.matched = (__suf.first != __suf.second);
|
|
|
|
}
|
|
|
|
}
|
re PR libstdc++/64441 (A match_results returns an incorrect sub_match if the sub_match::matched is false)
PR libstdc++/64441
* include/bits/regex.h (match_results<>::size,
match_results<>::position, match_results<>::str,
match_results<>::operator[], match_results<>::prefix,
match_results<>::suffix, match_results<>::end,
match_results<>::_M_resize, match_results<>::_M_unmatched_sub,
match_results<>::_M_prefix, match_results<>::_M_suffix): Remove
global __unmatched_sub. Add unmatched submatch as part of
match_results.
* include/bits/regex.tcc (__regex_algo_impl<>, regex_replace<>,
regex_iterator<>::operator++): Adjust to use match_results::_M_prefix.
* testsuite/28_regex/match_results/out_of_range_submatches.cc:
New testcases.
From-SVN: r221330
2015-03-10 19:41:46 +01:00
|
|
|
else
|
|
|
|
{
|
2019-05-14 14:19:05 +02:00
|
|
|
__m._M_establish_failed_match(__e);
|
re PR libstdc++/64441 (A match_results returns an incorrect sub_match if the sub_match::matched is false)
PR libstdc++/64441
* include/bits/regex.h (match_results<>::size,
match_results<>::position, match_results<>::str,
match_results<>::operator[], match_results<>::prefix,
match_results<>::suffix, match_results<>::end,
match_results<>::_M_resize, match_results<>::_M_unmatched_sub,
match_results<>::_M_prefix, match_results<>::_M_suffix): Remove
global __unmatched_sub. Add unmatched submatch as part of
match_results.
* include/bits/regex.tcc (__regex_algo_impl<>, regex_replace<>,
regex_iterator<>::operator++): Adjust to use match_results::_M_prefix.
* testsuite/28_regex/match_results/out_of_range_submatches.cc:
New testcases.
From-SVN: r221330
2015-03-10 19:41:46 +01:00
|
|
|
}
|
2013-10-06 19:53:14 +02:00
|
|
|
return __ret;
|
|
|
|
}
|
2019-05-07 17:30:40 +02:00
|
|
|
/// @endcond
|
|
|
|
} // namespace __detail
|
|
|
|
|
|
|
|
/// @cond
|
2013-10-06 19:53:14 +02:00
|
|
|
|
2013-09-24 04:05:00 +02:00
|
|
|
template<typename _Ch_type>
|
|
|
|
template<typename _Fwd_iter>
|
|
|
|
typename regex_traits<_Ch_type>::string_type
|
|
|
|
regex_traits<_Ch_type>::
|
|
|
|
lookup_collatename(_Fwd_iter __first, _Fwd_iter __last) const
|
|
|
|
{
|
|
|
|
typedef std::ctype<char_type> __ctype_type;
|
|
|
|
const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale));
|
|
|
|
|
|
|
|
static const char* __collatenames[] =
|
|
|
|
{
|
|
|
|
"NUL",
|
|
|
|
"SOH",
|
|
|
|
"STX",
|
|
|
|
"ETX",
|
|
|
|
"EOT",
|
|
|
|
"ENQ",
|
|
|
|
"ACK",
|
|
|
|
"alert",
|
|
|
|
"backspace",
|
|
|
|
"tab",
|
|
|
|
"newline",
|
|
|
|
"vertical-tab",
|
|
|
|
"form-feed",
|
|
|
|
"carriage-return",
|
|
|
|
"SO",
|
|
|
|
"SI",
|
|
|
|
"DLE",
|
|
|
|
"DC1",
|
|
|
|
"DC2",
|
|
|
|
"DC3",
|
|
|
|
"DC4",
|
|
|
|
"NAK",
|
|
|
|
"SYN",
|
|
|
|
"ETB",
|
|
|
|
"CAN",
|
|
|
|
"EM",
|
|
|
|
"SUB",
|
|
|
|
"ESC",
|
|
|
|
"IS4",
|
|
|
|
"IS3",
|
|
|
|
"IS2",
|
|
|
|
"IS1",
|
|
|
|
"space",
|
|
|
|
"exclamation-mark",
|
|
|
|
"quotation-mark",
|
|
|
|
"number-sign",
|
|
|
|
"dollar-sign",
|
|
|
|
"percent-sign",
|
|
|
|
"ampersand",
|
|
|
|
"apostrophe",
|
|
|
|
"left-parenthesis",
|
|
|
|
"right-parenthesis",
|
|
|
|
"asterisk",
|
|
|
|
"plus-sign",
|
|
|
|
"comma",
|
|
|
|
"hyphen",
|
|
|
|
"period",
|
|
|
|
"slash",
|
|
|
|
"zero",
|
|
|
|
"one",
|
|
|
|
"two",
|
|
|
|
"three",
|
|
|
|
"four",
|
|
|
|
"five",
|
|
|
|
"six",
|
|
|
|
"seven",
|
|
|
|
"eight",
|
|
|
|
"nine",
|
|
|
|
"colon",
|
|
|
|
"semicolon",
|
|
|
|
"less-than-sign",
|
|
|
|
"equals-sign",
|
|
|
|
"greater-than-sign",
|
|
|
|
"question-mark",
|
|
|
|
"commercial-at",
|
|
|
|
"A",
|
|
|
|
"B",
|
|
|
|
"C",
|
|
|
|
"D",
|
|
|
|
"E",
|
|
|
|
"F",
|
|
|
|
"G",
|
|
|
|
"H",
|
|
|
|
"I",
|
|
|
|
"J",
|
|
|
|
"K",
|
|
|
|
"L",
|
|
|
|
"M",
|
|
|
|
"N",
|
|
|
|
"O",
|
|
|
|
"P",
|
|
|
|
"Q",
|
|
|
|
"R",
|
|
|
|
"S",
|
|
|
|
"T",
|
|
|
|
"U",
|
|
|
|
"V",
|
|
|
|
"W",
|
|
|
|
"X",
|
|
|
|
"Y",
|
|
|
|
"Z",
|
|
|
|
"left-square-bracket",
|
|
|
|
"backslash",
|
|
|
|
"right-square-bracket",
|
|
|
|
"circumflex",
|
|
|
|
"underscore",
|
|
|
|
"grave-accent",
|
|
|
|
"a",
|
|
|
|
"b",
|
|
|
|
"c",
|
|
|
|
"d",
|
|
|
|
"e",
|
|
|
|
"f",
|
|
|
|
"g",
|
|
|
|
"h",
|
|
|
|
"i",
|
|
|
|
"j",
|
|
|
|
"k",
|
|
|
|
"l",
|
|
|
|
"m",
|
|
|
|
"n",
|
|
|
|
"o",
|
|
|
|
"p",
|
|
|
|
"q",
|
|
|
|
"r",
|
|
|
|
"s",
|
|
|
|
"t",
|
|
|
|
"u",
|
|
|
|
"v",
|
|
|
|
"w",
|
|
|
|
"x",
|
|
|
|
"y",
|
|
|
|
"z",
|
|
|
|
"left-curly-bracket",
|
|
|
|
"vertical-line",
|
|
|
|
"right-curly-bracket",
|
|
|
|
"tilde",
|
|
|
|
"DEL",
|
|
|
|
};
|
|
|
|
|
2015-01-22 06:02:38 +01:00
|
|
|
string __s;
|
|
|
|
for (; __first != __last; ++__first)
|
|
|
|
__s += __fctyp.narrow(*__first, 0);
|
|
|
|
|
2015-01-20 00:00:13 +01:00
|
|
|
for (const auto& __it : __collatenames)
|
|
|
|
if (__s == __it)
|
|
|
|
return string_type(1, __fctyp.widen(
|
|
|
|
static_cast<char>(&__it - __collatenames)));
|
2013-09-24 04:05:00 +02:00
|
|
|
|
2015-01-20 00:00:13 +01:00
|
|
|
// TODO Add digraph support:
|
|
|
|
// http://boost.sourceforge.net/libs/regex/doc/collating_names.html
|
2013-09-24 04:05:00 +02:00
|
|
|
|
|
|
|
return string_type();
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _Ch_type>
|
|
|
|
template<typename _Fwd_iter>
|
|
|
|
typename regex_traits<_Ch_type>::char_class_type
|
|
|
|
regex_traits<_Ch_type>::
|
|
|
|
lookup_classname(_Fwd_iter __first, _Fwd_iter __last, bool __icase) const
|
|
|
|
{
|
|
|
|
typedef std::ctype<char_type> __ctype_type;
|
|
|
|
const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale));
|
|
|
|
|
2015-01-20 00:00:13 +01:00
|
|
|
// Mappings from class name to class mask.
|
|
|
|
static const pair<const char*, char_class_type> __classnames[] =
|
2013-09-24 04:05:00 +02:00
|
|
|
{
|
|
|
|
{"d", ctype_base::digit},
|
|
|
|
{"w", {ctype_base::alnum, _RegexMask::_S_under}},
|
|
|
|
{"s", ctype_base::space},
|
|
|
|
{"alnum", ctype_base::alnum},
|
|
|
|
{"alpha", ctype_base::alpha},
|
2014-11-04 03:49:30 +01:00
|
|
|
{"blank", ctype_base::blank},
|
2013-09-24 04:05:00 +02:00
|
|
|
{"cntrl", ctype_base::cntrl},
|
|
|
|
{"digit", ctype_base::digit},
|
|
|
|
{"graph", ctype_base::graph},
|
|
|
|
{"lower", ctype_base::lower},
|
|
|
|
{"print", ctype_base::print},
|
|
|
|
{"punct", ctype_base::punct},
|
|
|
|
{"space", ctype_base::space},
|
|
|
|
{"upper", ctype_base::upper},
|
|
|
|
{"xdigit", ctype_base::xdigit},
|
|
|
|
};
|
|
|
|
|
2015-01-20 00:00:13 +01:00
|
|
|
string __s;
|
2015-01-22 06:02:38 +01:00
|
|
|
for (; __first != __last; ++__first)
|
|
|
|
__s += __fctyp.narrow(__fctyp.tolower(*__first), 0);
|
2015-01-20 00:00:13 +01:00
|
|
|
|
|
|
|
for (const auto& __it : __classnames)
|
|
|
|
if (__s == __it.first)
|
|
|
|
{
|
|
|
|
if (__icase
|
|
|
|
&& ((__it.second
|
|
|
|
& (ctype_base::lower | ctype_base::upper)) != 0))
|
|
|
|
return ctype_base::alpha;
|
|
|
|
return __it.second;
|
|
|
|
}
|
2013-09-24 04:05:00 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _Ch_type>
|
|
|
|
bool
|
|
|
|
regex_traits<_Ch_type>::
|
|
|
|
isctype(_Ch_type __c, char_class_type __f) const
|
|
|
|
{
|
|
|
|
typedef std::ctype<char_type> __ctype_type;
|
|
|
|
const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale));
|
|
|
|
|
|
|
|
return __fctyp.is(__f._M_base, __c)
|
|
|
|
// [[:w:]]
|
|
|
|
|| ((__f._M_extended & _RegexMask::_S_under)
|
2014-11-04 03:49:30 +01:00
|
|
|
&& __c == __fctyp.widen('_'));
|
2013-09-24 04:05:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _Ch_type>
|
|
|
|
int
|
|
|
|
regex_traits<_Ch_type>::
|
|
|
|
value(_Ch_type __ch, int __radix) const
|
|
|
|
{
|
|
|
|
std::basic_istringstream<char_type> __is(string_type(1, __ch));
|
2013-10-06 19:53:14 +02:00
|
|
|
long __v;
|
2013-09-24 04:05:00 +02:00
|
|
|
if (__radix == 8)
|
|
|
|
__is >> std::oct;
|
|
|
|
else if (__radix == 16)
|
|
|
|
__is >> std::hex;
|
|
|
|
__is >> __v;
|
|
|
|
return __is.fail() ? -1 : __v;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _Bi_iter, typename _Alloc>
|
|
|
|
template<typename _Out_iter>
|
2019-05-07 17:30:40 +02:00
|
|
|
_Out_iter
|
|
|
|
match_results<_Bi_iter, _Alloc>::
|
2013-09-24 04:05:00 +02:00
|
|
|
format(_Out_iter __out,
|
|
|
|
const match_results<_Bi_iter, _Alloc>::char_type* __fmt_first,
|
|
|
|
const match_results<_Bi_iter, _Alloc>::char_type* __fmt_last,
|
|
|
|
match_flag_type __flags) const
|
|
|
|
{
|
Enable lightweight checks with _GLIBCXX_ASSERTIONS.
* doc/xml/manual/using.xml (_GLIBCXX_ASSERTIONS): Document.
* doc/html/manual/using_macros.html: Regenerate.
* include/bits/c++config: Define _GLIBCXX_ASSERTIONS when
_GLIBCXX_DEBUG is defined. Disable std::string extern templates when
(_GLIBCXX_EXTERN_TEMPLATE, __glibcxx_assert): Depend on
_GLIBCXX_ASSERTIONS instead of _GLIBCXX_DEBUG.
* include/debug/debug.h [!_GLIBCXX_DEBUG]: Define
__glibcxx_requires_non_empty_range and __glibcxx_requires_nonempty.
* include/backward/auto_ptr.h (auto_ptr::operator*,
auto_ptr::operator->): Replace _GLIBCXX_DEBUG_ASSERT with
__glibcxx_assert.
* include/bits/basic_string.h (basic_string::operator[],
basic_string::front, basic_string::back, basic_string::pop_back):
Likewise.
* include/bits/random.h
(uniform_int_distribution::param_type::param_type,
uniform_real_distribution::param_type::param_type,
normal_distribution::param_type::param_type,
gamma_distribution::param_type::param_type,
bernoulli_distribution::param_type::param_type,
binomial_distribution::param_type::param_type,
geometric_distribution::param_type::param_type,
negative_binomial_distribution::param_type::param_type,
poisson_distribution::param_type::param_type,
exponential_distribution::param_type::param_type): Likewise.
* include/bits/regex.h (match_results::operator[],
match_results::prefix, match_results::suffix): Likewise.
* include/bits/regex.tcc (format, regex_iterator::operator++):
Likewise.
* include/bits/regex_automaton.tcc (_StateSeq::_M_clone): Likewise.
* include/bits/regex_compiler.tcc (_Compiler::_Compiler,
_Compiler::_M_insert_character_class_matcher): Likewise.
* include/bits/regex_executor.tcc (_Executor::_M_dfs): Likewise.
* include/bits/regex_scanner.tcc (_Scanner::_M_advance,
_Scanner::_M_scan_normal): Likewise.
* include/bits/shared_ptr_base.h (__shared_ptr::_M_reset,
__shared_ptr::operator*): Likewise.
* include/bits/stl_iterator_base_funcs.h (__advance): Likewise.
* include/bits/unique_ptr.h (unique_ptr::operator*,
unique_ptr::operator[]): Likewise.
* include/experimental/fs_path.h (path::path(string_type, _Type),
path::iterator::operator++, path::iterator::operator--,
path::iterator::operator*): Likewise.
* include/experimental/string_view (basic_string_view::operator[],
basic_string_view::front, basic_string_view::back,
basic_string_view::remove_prefix): Likewise.
* include/ext/random (beta_distribution::param_type::param_type,
normal_mv_distribution::param_type::param_type,
rice_distribution::param_type::param_type,
pareto_distribution::param_type::param_type,
k_distribution::param_type::param_type,
arcsine_distribution::param_type::param_type,
hoyt_distribution::param_type::param_type,
triangular_distribution::param_type::param_type,
von_mises_distribution::param_type::param_type,
hypergeometric_distribution::param_type::param_type,
logistic_distribution::param_type::param_type): Likewise.
* include/ext/vstring.h (__versa_string::operator[]): Likewise.
* include/std/complex (polar): Likewise.
* include/std/mutex [!_GTHREAD_USE_MUTEX_TIMEDLOCK]
(timed_mutex::~timed_mutex, timed_mutex::unlock,
(recursive_timed_mutex::~timed_mutex, recursive_timed_mutex::unlock):
Likewise.
* include/std/shared_mutex [!PTHREAD_RWLOCK_INITIALIZER]
(__shared_mutex_pthread::__shared_mutex_pthread,
__shared_mutex_pthread::~__shared_mutex_pthread): Likewise.
(__shared_mutex_pthread::lock, __shared_mutex_pthread::try_lock,
__shared_mutex_pthread::unlock, __shared_mutex_pthread::lock_shared,
__shared_mutex_pthread::try_lock_shared): Likewise.
(__shared_mutex_cv::~__shared_mutex_cv, __shared_mutex_cv::unlock,
__shared_mutex_cv::unlock_shared): Likewise.
(shared_timed_mutex::try_lock_until,
shared_timed_mutex::try_lock_shared_until): Likewise.
* include/std/valarray (valarray::valarray(const _Tp*, size_t),
valarray::operator=, valarray::sum, valarray::min, valarray::max,
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT, _DEFINE_BINARY_OPERATOR):
Likewise.
From-SVN: r227595
2015-09-09 19:12:47 +02:00
|
|
|
__glibcxx_assert( ready() );
|
2013-09-24 04:05:00 +02:00
|
|
|
regex_traits<char_type> __traits;
|
|
|
|
typedef std::ctype<char_type> __ctype_type;
|
|
|
|
const __ctype_type&
|
|
|
|
__fctyp(use_facet<__ctype_type>(__traits.getloc()));
|
|
|
|
|
2013-10-06 19:53:14 +02:00
|
|
|
auto __output = [&](size_t __idx)
|
2013-09-24 04:05:00 +02:00
|
|
|
{
|
re PR libstdc++/64441 (A match_results returns an incorrect sub_match if the sub_match::matched is false)
PR libstdc++/64441
* include/bits/regex.h (match_results<>::size,
match_results<>::position, match_results<>::str,
match_results<>::operator[], match_results<>::prefix,
match_results<>::suffix, match_results<>::end,
match_results<>::_M_resize, match_results<>::_M_unmatched_sub,
match_results<>::_M_prefix, match_results<>::_M_suffix): Remove
global __unmatched_sub. Add unmatched submatch as part of
match_results.
* include/bits/regex.tcc (__regex_algo_impl<>, regex_replace<>,
regex_iterator<>::operator++): Adjust to use match_results::_M_prefix.
* testsuite/28_regex/match_results/out_of_range_submatches.cc:
New testcases.
From-SVN: r221330
2015-03-10 19:41:46 +01:00
|
|
|
auto& __sub = (*this)[__idx];
|
2013-09-24 04:05:00 +02:00
|
|
|
if (__sub.matched)
|
2014-02-26 20:45:15 +01:00
|
|
|
__out = std::copy(__sub.first, __sub.second, __out);
|
2013-09-24 04:05:00 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
if (__flags & regex_constants::format_sed)
|
|
|
|
{
|
2018-01-14 01:48:30 +01:00
|
|
|
bool __escaping = false;
|
|
|
|
for (; __fmt_first != __fmt_last; __fmt_first++)
|
|
|
|
{
|
|
|
|
if (__escaping)
|
|
|
|
{
|
|
|
|
__escaping = false;
|
|
|
|
if (__fctyp.is(__ctype_type::digit, *__fmt_first))
|
|
|
|
__output(__traits.value(*__fmt_first, 10));
|
|
|
|
else
|
|
|
|
*__out++ = *__fmt_first;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (*__fmt_first == '\\')
|
|
|
|
{
|
|
|
|
__escaping = true;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (*__fmt_first == '&')
|
|
|
|
{
|
|
|
|
__output(0);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
*__out++ = *__fmt_first;
|
|
|
|
}
|
|
|
|
if (__escaping)
|
|
|
|
*__out++ = '\\';
|
2013-09-24 04:05:00 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
auto __next = std::find(__fmt_first, __fmt_last, '$');
|
|
|
|
if (__next == __fmt_last)
|
|
|
|
break;
|
|
|
|
|
2014-02-26 20:45:15 +01:00
|
|
|
__out = std::copy(__fmt_first, __next, __out);
|
2013-09-24 04:05:00 +02:00
|
|
|
|
|
|
|
auto __eat = [&](char __ch) -> bool
|
|
|
|
{
|
|
|
|
if (*__next == __ch)
|
|
|
|
{
|
|
|
|
++__next;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
|
|
|
if (++__next == __fmt_last)
|
|
|
|
*__out++ = '$';
|
|
|
|
else if (__eat('$'))
|
|
|
|
*__out++ = '$';
|
|
|
|
else if (__eat('&'))
|
|
|
|
__output(0);
|
|
|
|
else if (__eat('`'))
|
re PR libstdc++/64441 (A match_results returns an incorrect sub_match if the sub_match::matched is false)
PR libstdc++/64441
* include/bits/regex.h (match_results<>::size,
match_results<>::position, match_results<>::str,
match_results<>::operator[], match_results<>::prefix,
match_results<>::suffix, match_results<>::end,
match_results<>::_M_resize, match_results<>::_M_unmatched_sub,
match_results<>::_M_prefix, match_results<>::_M_suffix): Remove
global __unmatched_sub. Add unmatched submatch as part of
match_results.
* include/bits/regex.tcc (__regex_algo_impl<>, regex_replace<>,
regex_iterator<>::operator++): Adjust to use match_results::_M_prefix.
* testsuite/28_regex/match_results/out_of_range_submatches.cc:
New testcases.
From-SVN: r221330
2015-03-10 19:41:46 +01:00
|
|
|
{
|
|
|
|
auto& __sub = _M_prefix();
|
|
|
|
if (__sub.matched)
|
|
|
|
__out = std::copy(__sub.first, __sub.second, __out);
|
|
|
|
}
|
2013-09-24 04:05:00 +02:00
|
|
|
else if (__eat('\''))
|
re PR libstdc++/64441 (A match_results returns an incorrect sub_match if the sub_match::matched is false)
PR libstdc++/64441
* include/bits/regex.h (match_results<>::size,
match_results<>::position, match_results<>::str,
match_results<>::operator[], match_results<>::prefix,
match_results<>::suffix, match_results<>::end,
match_results<>::_M_resize, match_results<>::_M_unmatched_sub,
match_results<>::_M_prefix, match_results<>::_M_suffix): Remove
global __unmatched_sub. Add unmatched submatch as part of
match_results.
* include/bits/regex.tcc (__regex_algo_impl<>, regex_replace<>,
regex_iterator<>::operator++): Adjust to use match_results::_M_prefix.
* testsuite/28_regex/match_results/out_of_range_submatches.cc:
New testcases.
From-SVN: r221330
2015-03-10 19:41:46 +01:00
|
|
|
{
|
|
|
|
auto& __sub = _M_suffix();
|
|
|
|
if (__sub.matched)
|
|
|
|
__out = std::copy(__sub.first, __sub.second, __out);
|
|
|
|
}
|
2013-09-24 04:05:00 +02:00
|
|
|
else if (__fctyp.is(__ctype_type::digit, *__next))
|
|
|
|
{
|
2013-10-06 19:53:14 +02:00
|
|
|
long __num = __traits.value(*__next, 10);
|
2013-09-24 04:05:00 +02:00
|
|
|
if (++__next != __fmt_last
|
|
|
|
&& __fctyp.is(__ctype_type::digit, *__next))
|
|
|
|
{
|
|
|
|
__num *= 10;
|
|
|
|
__num += __traits.value(*__next++, 10);
|
|
|
|
}
|
|
|
|
if (0 <= __num && __num < this->size())
|
|
|
|
__output(__num);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
*__out++ = '$';
|
|
|
|
__fmt_first = __next;
|
|
|
|
}
|
2014-02-26 20:45:15 +01:00
|
|
|
__out = std::copy(__fmt_first, __fmt_last, __out);
|
2013-09-24 04:05:00 +02:00
|
|
|
}
|
|
|
|
return __out;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _Out_iter, typename _Bi_iter,
|
|
|
|
typename _Rx_traits, typename _Ch_type>
|
|
|
|
_Out_iter
|
2021-12-12 22:15:17 +01:00
|
|
|
__regex_replace(_Out_iter __out, _Bi_iter __first, _Bi_iter __last,
|
|
|
|
const basic_regex<_Ch_type, _Rx_traits>& __e,
|
|
|
|
const _Ch_type* __fmt, size_t __len,
|
|
|
|
regex_constants::match_flag_type __flags)
|
2013-09-24 04:05:00 +02:00
|
|
|
{
|
|
|
|
typedef regex_iterator<_Bi_iter, _Ch_type, _Rx_traits> _IterT;
|
|
|
|
_IterT __i(__first, __last, __e, __flags);
|
|
|
|
_IterT __end;
|
|
|
|
if (__i == __end)
|
|
|
|
{
|
|
|
|
if (!(__flags & regex_constants::format_no_copy))
|
2014-02-26 20:45:15 +01:00
|
|
|
__out = std::copy(__first, __last, __out);
|
2013-09-24 04:05:00 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sub_match<_Bi_iter> __last;
|
|
|
|
for (; __i != __end; ++__i)
|
|
|
|
{
|
|
|
|
if (!(__flags & regex_constants::format_no_copy))
|
2014-02-26 20:45:15 +01:00
|
|
|
__out = std::copy(__i->prefix().first, __i->prefix().second,
|
|
|
|
__out);
|
2013-09-24 04:05:00 +02:00
|
|
|
__out = __i->format(__out, __fmt, __fmt + __len, __flags);
|
|
|
|
__last = __i->suffix();
|
|
|
|
if (__flags & regex_constants::format_first_only)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!(__flags & regex_constants::format_no_copy))
|
2014-02-26 20:45:15 +01:00
|
|
|
__out = std::copy(__last.first, __last.second, __out);
|
2013-09-24 04:05:00 +02:00
|
|
|
}
|
|
|
|
return __out;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _Bi_iter,
|
|
|
|
typename _Ch_type,
|
|
|
|
typename _Rx_traits>
|
|
|
|
bool
|
|
|
|
regex_iterator<_Bi_iter, _Ch_type, _Rx_traits>::
|
2018-06-26 14:24:47 +02:00
|
|
|
operator==(const regex_iterator& __rhs) const noexcept
|
2013-09-24 04:05:00 +02:00
|
|
|
{
|
2016-11-09 23:11:32 +01:00
|
|
|
if (_M_pregex == nullptr && __rhs._M_pregex == nullptr)
|
|
|
|
return true;
|
|
|
|
return _M_pregex == __rhs._M_pregex
|
|
|
|
&& _M_begin == __rhs._M_begin
|
|
|
|
&& _M_end == __rhs._M_end
|
|
|
|
&& _M_flags == __rhs._M_flags
|
|
|
|
&& _M_match[0] == __rhs._M_match[0];
|
2013-09-24 04:05:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _Bi_iter,
|
|
|
|
typename _Ch_type,
|
|
|
|
typename _Rx_traits>
|
|
|
|
regex_iterator<_Bi_iter, _Ch_type, _Rx_traits>&
|
|
|
|
regex_iterator<_Bi_iter, _Ch_type, _Rx_traits>::
|
|
|
|
operator++()
|
|
|
|
{
|
|
|
|
// In all cases in which the call to regex_search returns true,
|
|
|
|
// match.prefix().first shall be equal to the previous value of
|
|
|
|
// match[0].second, and for each index i in the half-open range
|
|
|
|
// [0, match.size()) for which match[i].matched is true,
|
|
|
|
// match[i].position() shall return distance(begin, match[i].first).
|
|
|
|
// [28.12.1.4.5]
|
|
|
|
if (_M_match[0].matched)
|
|
|
|
{
|
|
|
|
auto __start = _M_match[0].second;
|
|
|
|
auto __prefix_first = _M_match[0].second;
|
|
|
|
if (_M_match[0].first == _M_match[0].second)
|
2013-10-17 22:46:50 +02:00
|
|
|
{
|
|
|
|
if (__start == _M_end)
|
|
|
|
{
|
2016-11-09 23:11:32 +01:00
|
|
|
_M_pregex = nullptr;
|
2013-10-17 22:46:50 +02:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (regex_search(__start, _M_end, _M_match, *_M_pregex,
|
|
|
|
_M_flags
|
|
|
|
| regex_constants::match_not_null
|
|
|
|
| regex_constants::match_continuous))
|
|
|
|
{
|
Enable lightweight checks with _GLIBCXX_ASSERTIONS.
* doc/xml/manual/using.xml (_GLIBCXX_ASSERTIONS): Document.
* doc/html/manual/using_macros.html: Regenerate.
* include/bits/c++config: Define _GLIBCXX_ASSERTIONS when
_GLIBCXX_DEBUG is defined. Disable std::string extern templates when
(_GLIBCXX_EXTERN_TEMPLATE, __glibcxx_assert): Depend on
_GLIBCXX_ASSERTIONS instead of _GLIBCXX_DEBUG.
* include/debug/debug.h [!_GLIBCXX_DEBUG]: Define
__glibcxx_requires_non_empty_range and __glibcxx_requires_nonempty.
* include/backward/auto_ptr.h (auto_ptr::operator*,
auto_ptr::operator->): Replace _GLIBCXX_DEBUG_ASSERT with
__glibcxx_assert.
* include/bits/basic_string.h (basic_string::operator[],
basic_string::front, basic_string::back, basic_string::pop_back):
Likewise.
* include/bits/random.h
(uniform_int_distribution::param_type::param_type,
uniform_real_distribution::param_type::param_type,
normal_distribution::param_type::param_type,
gamma_distribution::param_type::param_type,
bernoulli_distribution::param_type::param_type,
binomial_distribution::param_type::param_type,
geometric_distribution::param_type::param_type,
negative_binomial_distribution::param_type::param_type,
poisson_distribution::param_type::param_type,
exponential_distribution::param_type::param_type): Likewise.
* include/bits/regex.h (match_results::operator[],
match_results::prefix, match_results::suffix): Likewise.
* include/bits/regex.tcc (format, regex_iterator::operator++):
Likewise.
* include/bits/regex_automaton.tcc (_StateSeq::_M_clone): Likewise.
* include/bits/regex_compiler.tcc (_Compiler::_Compiler,
_Compiler::_M_insert_character_class_matcher): Likewise.
* include/bits/regex_executor.tcc (_Executor::_M_dfs): Likewise.
* include/bits/regex_scanner.tcc (_Scanner::_M_advance,
_Scanner::_M_scan_normal): Likewise.
* include/bits/shared_ptr_base.h (__shared_ptr::_M_reset,
__shared_ptr::operator*): Likewise.
* include/bits/stl_iterator_base_funcs.h (__advance): Likewise.
* include/bits/unique_ptr.h (unique_ptr::operator*,
unique_ptr::operator[]): Likewise.
* include/experimental/fs_path.h (path::path(string_type, _Type),
path::iterator::operator++, path::iterator::operator--,
path::iterator::operator*): Likewise.
* include/experimental/string_view (basic_string_view::operator[],
basic_string_view::front, basic_string_view::back,
basic_string_view::remove_prefix): Likewise.
* include/ext/random (beta_distribution::param_type::param_type,
normal_mv_distribution::param_type::param_type,
rice_distribution::param_type::param_type,
pareto_distribution::param_type::param_type,
k_distribution::param_type::param_type,
arcsine_distribution::param_type::param_type,
hoyt_distribution::param_type::param_type,
triangular_distribution::param_type::param_type,
von_mises_distribution::param_type::param_type,
hypergeometric_distribution::param_type::param_type,
logistic_distribution::param_type::param_type): Likewise.
* include/ext/vstring.h (__versa_string::operator[]): Likewise.
* include/std/complex (polar): Likewise.
* include/std/mutex [!_GTHREAD_USE_MUTEX_TIMEDLOCK]
(timed_mutex::~timed_mutex, timed_mutex::unlock,
(recursive_timed_mutex::~timed_mutex, recursive_timed_mutex::unlock):
Likewise.
* include/std/shared_mutex [!PTHREAD_RWLOCK_INITIALIZER]
(__shared_mutex_pthread::__shared_mutex_pthread,
__shared_mutex_pthread::~__shared_mutex_pthread): Likewise.
(__shared_mutex_pthread::lock, __shared_mutex_pthread::try_lock,
__shared_mutex_pthread::unlock, __shared_mutex_pthread::lock_shared,
__shared_mutex_pthread::try_lock_shared): Likewise.
(__shared_mutex_cv::~__shared_mutex_cv, __shared_mutex_cv::unlock,
__shared_mutex_cv::unlock_shared): Likewise.
(shared_timed_mutex::try_lock_until,
shared_timed_mutex::try_lock_shared_until): Likewise.
* include/std/valarray (valarray::valarray(const _Tp*, size_t),
valarray::operator=, valarray::sum, valarray::min, valarray::max,
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT, _DEFINE_BINARY_OPERATOR):
Likewise.
From-SVN: r227595
2015-09-09 19:12:47 +02:00
|
|
|
__glibcxx_assert(_M_match[0].matched);
|
re PR libstdc++/64441 (A match_results returns an incorrect sub_match if the sub_match::matched is false)
PR libstdc++/64441
* include/bits/regex.h (match_results<>::size,
match_results<>::position, match_results<>::str,
match_results<>::operator[], match_results<>::prefix,
match_results<>::suffix, match_results<>::end,
match_results<>::_M_resize, match_results<>::_M_unmatched_sub,
match_results<>::_M_prefix, match_results<>::_M_suffix): Remove
global __unmatched_sub. Add unmatched submatch as part of
match_results.
* include/bits/regex.tcc (__regex_algo_impl<>, regex_replace<>,
regex_iterator<>::operator++): Adjust to use match_results::_M_prefix.
* testsuite/28_regex/match_results/out_of_range_submatches.cc:
New testcases.
From-SVN: r221330
2015-03-10 19:41:46 +01:00
|
|
|
auto& __prefix = _M_match._M_prefix();
|
2014-12-04 05:25:12 +01:00
|
|
|
__prefix.first = __prefix_first;
|
|
|
|
__prefix.matched = __prefix.first != __prefix.second;
|
2014-12-13 23:19:18 +01:00
|
|
|
// [28.12.1.4.5]
|
2013-10-17 22:46:50 +02:00
|
|
|
_M_match._M_begin = _M_begin;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
++__start;
|
|
|
|
}
|
|
|
|
}
|
2013-09-24 04:05:00 +02:00
|
|
|
_M_flags |= regex_constants::match_prev_avail;
|
|
|
|
if (regex_search(__start, _M_end, _M_match, *_M_pregex, _M_flags))
|
|
|
|
{
|
Enable lightweight checks with _GLIBCXX_ASSERTIONS.
* doc/xml/manual/using.xml (_GLIBCXX_ASSERTIONS): Document.
* doc/html/manual/using_macros.html: Regenerate.
* include/bits/c++config: Define _GLIBCXX_ASSERTIONS when
_GLIBCXX_DEBUG is defined. Disable std::string extern templates when
(_GLIBCXX_EXTERN_TEMPLATE, __glibcxx_assert): Depend on
_GLIBCXX_ASSERTIONS instead of _GLIBCXX_DEBUG.
* include/debug/debug.h [!_GLIBCXX_DEBUG]: Define
__glibcxx_requires_non_empty_range and __glibcxx_requires_nonempty.
* include/backward/auto_ptr.h (auto_ptr::operator*,
auto_ptr::operator->): Replace _GLIBCXX_DEBUG_ASSERT with
__glibcxx_assert.
* include/bits/basic_string.h (basic_string::operator[],
basic_string::front, basic_string::back, basic_string::pop_back):
Likewise.
* include/bits/random.h
(uniform_int_distribution::param_type::param_type,
uniform_real_distribution::param_type::param_type,
normal_distribution::param_type::param_type,
gamma_distribution::param_type::param_type,
bernoulli_distribution::param_type::param_type,
binomial_distribution::param_type::param_type,
geometric_distribution::param_type::param_type,
negative_binomial_distribution::param_type::param_type,
poisson_distribution::param_type::param_type,
exponential_distribution::param_type::param_type): Likewise.
* include/bits/regex.h (match_results::operator[],
match_results::prefix, match_results::suffix): Likewise.
* include/bits/regex.tcc (format, regex_iterator::operator++):
Likewise.
* include/bits/regex_automaton.tcc (_StateSeq::_M_clone): Likewise.
* include/bits/regex_compiler.tcc (_Compiler::_Compiler,
_Compiler::_M_insert_character_class_matcher): Likewise.
* include/bits/regex_executor.tcc (_Executor::_M_dfs): Likewise.
* include/bits/regex_scanner.tcc (_Scanner::_M_advance,
_Scanner::_M_scan_normal): Likewise.
* include/bits/shared_ptr_base.h (__shared_ptr::_M_reset,
__shared_ptr::operator*): Likewise.
* include/bits/stl_iterator_base_funcs.h (__advance): Likewise.
* include/bits/unique_ptr.h (unique_ptr::operator*,
unique_ptr::operator[]): Likewise.
* include/experimental/fs_path.h (path::path(string_type, _Type),
path::iterator::operator++, path::iterator::operator--,
path::iterator::operator*): Likewise.
* include/experimental/string_view (basic_string_view::operator[],
basic_string_view::front, basic_string_view::back,
basic_string_view::remove_prefix): Likewise.
* include/ext/random (beta_distribution::param_type::param_type,
normal_mv_distribution::param_type::param_type,
rice_distribution::param_type::param_type,
pareto_distribution::param_type::param_type,
k_distribution::param_type::param_type,
arcsine_distribution::param_type::param_type,
hoyt_distribution::param_type::param_type,
triangular_distribution::param_type::param_type,
von_mises_distribution::param_type::param_type,
hypergeometric_distribution::param_type::param_type,
logistic_distribution::param_type::param_type): Likewise.
* include/ext/vstring.h (__versa_string::operator[]): Likewise.
* include/std/complex (polar): Likewise.
* include/std/mutex [!_GTHREAD_USE_MUTEX_TIMEDLOCK]
(timed_mutex::~timed_mutex, timed_mutex::unlock,
(recursive_timed_mutex::~timed_mutex, recursive_timed_mutex::unlock):
Likewise.
* include/std/shared_mutex [!PTHREAD_RWLOCK_INITIALIZER]
(__shared_mutex_pthread::__shared_mutex_pthread,
__shared_mutex_pthread::~__shared_mutex_pthread): Likewise.
(__shared_mutex_pthread::lock, __shared_mutex_pthread::try_lock,
__shared_mutex_pthread::unlock, __shared_mutex_pthread::lock_shared,
__shared_mutex_pthread::try_lock_shared): Likewise.
(__shared_mutex_cv::~__shared_mutex_cv, __shared_mutex_cv::unlock,
__shared_mutex_cv::unlock_shared): Likewise.
(shared_timed_mutex::try_lock_until,
shared_timed_mutex::try_lock_shared_until): Likewise.
* include/std/valarray (valarray::valarray(const _Tp*, size_t),
valarray::operator=, valarray::sum, valarray::min, valarray::max,
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT, _DEFINE_BINARY_OPERATOR):
Likewise.
From-SVN: r227595
2015-09-09 19:12:47 +02:00
|
|
|
__glibcxx_assert(_M_match[0].matched);
|
re PR libstdc++/64441 (A match_results returns an incorrect sub_match if the sub_match::matched is false)
PR libstdc++/64441
* include/bits/regex.h (match_results<>::size,
match_results<>::position, match_results<>::str,
match_results<>::operator[], match_results<>::prefix,
match_results<>::suffix, match_results<>::end,
match_results<>::_M_resize, match_results<>::_M_unmatched_sub,
match_results<>::_M_prefix, match_results<>::_M_suffix): Remove
global __unmatched_sub. Add unmatched submatch as part of
match_results.
* include/bits/regex.tcc (__regex_algo_impl<>, regex_replace<>,
regex_iterator<>::operator++): Adjust to use match_results::_M_prefix.
* testsuite/28_regex/match_results/out_of_range_submatches.cc:
New testcases.
From-SVN: r221330
2015-03-10 19:41:46 +01:00
|
|
|
auto& __prefix = _M_match._M_prefix();
|
2014-12-04 05:25:12 +01:00
|
|
|
__prefix.first = __prefix_first;
|
|
|
|
__prefix.matched = __prefix.first != __prefix.second;
|
2014-12-13 23:19:18 +01:00
|
|
|
// [28.12.1.4.5]
|
2013-09-24 04:05:00 +02:00
|
|
|
_M_match._M_begin = _M_begin;
|
|
|
|
}
|
|
|
|
else
|
2016-11-09 23:11:32 +01:00
|
|
|
_M_pregex = nullptr;
|
2013-09-24 04:05:00 +02:00
|
|
|
}
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _Bi_iter,
|
|
|
|
typename _Ch_type,
|
|
|
|
typename _Rx_traits>
|
|
|
|
regex_token_iterator<_Bi_iter, _Ch_type, _Rx_traits>&
|
|
|
|
regex_token_iterator<_Bi_iter, _Ch_type, _Rx_traits>::
|
|
|
|
operator=(const regex_token_iterator& __rhs)
|
|
|
|
{
|
|
|
|
_M_position = __rhs._M_position;
|
|
|
|
_M_subs = __rhs._M_subs;
|
|
|
|
_M_n = __rhs._M_n;
|
|
|
|
_M_suffix = __rhs._M_suffix;
|
|
|
|
_M_has_m1 = __rhs._M_has_m1;
|
2014-12-17 10:25:44 +01:00
|
|
|
_M_normalize_result();
|
2013-10-17 00:28:28 +02:00
|
|
|
return *this;
|
2013-09-24 04:05:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _Bi_iter,
|
|
|
|
typename _Ch_type,
|
|
|
|
typename _Rx_traits>
|
|
|
|
bool
|
|
|
|
regex_token_iterator<_Bi_iter, _Ch_type, _Rx_traits>::
|
|
|
|
operator==(const regex_token_iterator& __rhs) const
|
|
|
|
{
|
|
|
|
if (_M_end_of_seq() && __rhs._M_end_of_seq())
|
|
|
|
return true;
|
|
|
|
if (_M_suffix.matched && __rhs._M_suffix.matched
|
|
|
|
&& _M_suffix == __rhs._M_suffix)
|
|
|
|
return true;
|
|
|
|
if (_M_end_of_seq() || _M_suffix.matched
|
|
|
|
|| __rhs._M_end_of_seq() || __rhs._M_suffix.matched)
|
|
|
|
return false;
|
|
|
|
return _M_position == __rhs._M_position
|
|
|
|
&& _M_n == __rhs._M_n
|
|
|
|
&& _M_subs == __rhs._M_subs;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _Bi_iter,
|
|
|
|
typename _Ch_type,
|
|
|
|
typename _Rx_traits>
|
|
|
|
regex_token_iterator<_Bi_iter, _Ch_type, _Rx_traits>&
|
|
|
|
regex_token_iterator<_Bi_iter, _Ch_type, _Rx_traits>::
|
|
|
|
operator++()
|
|
|
|
{
|
|
|
|
_Position __prev = _M_position;
|
|
|
|
if (_M_suffix.matched)
|
|
|
|
*this = regex_token_iterator();
|
|
|
|
else if (_M_n + 1 < _M_subs.size())
|
|
|
|
{
|
|
|
|
_M_n++;
|
|
|
|
_M_result = &_M_current_match();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_M_n = 0;
|
|
|
|
++_M_position;
|
|
|
|
if (_M_position != _Position())
|
|
|
|
_M_result = &_M_current_match();
|
|
|
|
else if (_M_has_m1 && __prev->suffix().length() != 0)
|
|
|
|
{
|
|
|
|
_M_suffix.matched = true;
|
|
|
|
_M_suffix.first = __prev->suffix().first;
|
|
|
|
_M_suffix.second = __prev->suffix().second;
|
|
|
|
_M_result = &_M_suffix;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
*this = regex_token_iterator();
|
|
|
|
}
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _Bi_iter,
|
|
|
|
typename _Ch_type,
|
|
|
|
typename _Rx_traits>
|
|
|
|
void
|
|
|
|
regex_token_iterator<_Bi_iter, _Ch_type, _Rx_traits>::
|
|
|
|
_M_init(_Bi_iter __a, _Bi_iter __b)
|
|
|
|
{
|
|
|
|
_M_has_m1 = false;
|
|
|
|
for (auto __it : _M_subs)
|
|
|
|
if (__it == -1)
|
|
|
|
{
|
|
|
|
_M_has_m1 = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (_M_position != _Position())
|
|
|
|
_M_result = &_M_current_match();
|
|
|
|
else if (_M_has_m1)
|
|
|
|
{
|
|
|
|
_M_suffix.matched = true;
|
|
|
|
_M_suffix.first = __a;
|
|
|
|
_M_suffix.second = __b;
|
|
|
|
_M_result = &_M_suffix;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
_M_result = nullptr;
|
|
|
|
}
|
|
|
|
|
2019-05-07 17:30:40 +02:00
|
|
|
/// @endcond
|
|
|
|
|
2013-09-24 04:05:00 +02:00
|
|
|
_GLIBCXX_END_NAMESPACE_VERSION
|
|
|
|
} // namespace
|