2010-06-17 00:34:59 +00:00
|
|
|
// -*- C++ -*-
|
2021-11-17 16:25:01 -05:00
|
|
|
//===----------------------------------------------------------------------===//
|
2010-06-17 00:34:59 +00:00
|
|
|
//
|
2019-01-19 10:56:40 +00:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2010-06-17 00:34:59 +00:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef _LIBCPP_REGEX
|
|
|
|
#define _LIBCPP_REGEX
|
|
|
|
|
|
|
|
/*
|
|
|
|
regex synopsis
|
|
|
|
|
|
|
|
#include <initializer_list>
|
|
|
|
|
|
|
|
namespace std
|
|
|
|
{
|
|
|
|
|
|
|
|
namespace regex_constants
|
|
|
|
{
|
|
|
|
|
2020-06-25 15:31:03 -04:00
|
|
|
enum syntax_option_type
|
2010-06-17 00:34:59 +00:00
|
|
|
{
|
|
|
|
icase = unspecified,
|
|
|
|
nosubs = unspecified,
|
|
|
|
optimize = unspecified,
|
|
|
|
collate = unspecified,
|
|
|
|
ECMAScript = unspecified,
|
|
|
|
basic = unspecified,
|
|
|
|
extended = unspecified,
|
|
|
|
awk = unspecified,
|
|
|
|
grep = unspecified,
|
2020-11-18 18:09:13 +01:00
|
|
|
egrep = unspecified,
|
|
|
|
multiline = unspecified
|
2010-06-17 00:34:59 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
constexpr syntax_option_type operator~(syntax_option_type f);
|
|
|
|
constexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs);
|
|
|
|
constexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs);
|
|
|
|
|
|
|
|
enum match_flag_type
|
|
|
|
{
|
|
|
|
match_default = 0,
|
|
|
|
match_not_bol = unspecified,
|
|
|
|
match_not_eol = unspecified,
|
|
|
|
match_not_bow = unspecified,
|
|
|
|
match_not_eow = unspecified,
|
|
|
|
match_any = unspecified,
|
|
|
|
match_not_null = unspecified,
|
|
|
|
match_continuous = unspecified,
|
|
|
|
match_prev_avail = unspecified,
|
|
|
|
format_default = 0,
|
|
|
|
format_sed = unspecified,
|
|
|
|
format_no_copy = unspecified,
|
|
|
|
format_first_only = unspecified
|
|
|
|
};
|
|
|
|
|
|
|
|
constexpr match_flag_type operator~(match_flag_type f);
|
|
|
|
constexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs);
|
|
|
|
constexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs);
|
|
|
|
|
|
|
|
enum error_type
|
|
|
|
{
|
|
|
|
error_collate = unspecified,
|
|
|
|
error_ctype = unspecified,
|
|
|
|
error_escape = unspecified,
|
|
|
|
error_backref = unspecified,
|
|
|
|
error_brack = unspecified,
|
|
|
|
error_paren = unspecified,
|
|
|
|
error_brace = unspecified,
|
|
|
|
error_badbrace = unspecified,
|
|
|
|
error_range = unspecified,
|
|
|
|
error_space = unspecified,
|
|
|
|
error_badrepeat = unspecified,
|
|
|
|
error_complexity = unspecified,
|
|
|
|
error_stack = unspecified
|
|
|
|
};
|
|
|
|
|
|
|
|
} // regex_constants
|
|
|
|
|
|
|
|
class regex_error
|
|
|
|
: public runtime_error
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit regex_error(regex_constants::error_type ecode);
|
|
|
|
regex_constants::error_type code() const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class charT>
|
|
|
|
struct regex_traits
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef charT char_type;
|
|
|
|
typedef basic_string<char_type> string_type;
|
|
|
|
typedef locale locale_type;
|
|
|
|
typedef /bitmask_type/ char_class_type;
|
|
|
|
|
|
|
|
regex_traits();
|
|
|
|
|
|
|
|
static size_t length(const char_type* p);
|
|
|
|
charT translate(charT c) const;
|
|
|
|
charT translate_nocase(charT c) const;
|
|
|
|
template <class ForwardIterator>
|
|
|
|
string_type
|
|
|
|
transform(ForwardIterator first, ForwardIterator last) const;
|
|
|
|
template <class ForwardIterator>
|
|
|
|
string_type
|
|
|
|
transform_primary( ForwardIterator first, ForwardIterator last) const;
|
|
|
|
template <class ForwardIterator>
|
|
|
|
string_type
|
|
|
|
lookup_collatename(ForwardIterator first, ForwardIterator last) const;
|
|
|
|
template <class ForwardIterator>
|
|
|
|
char_class_type
|
|
|
|
lookup_classname(ForwardIterator first, ForwardIterator last,
|
|
|
|
bool icase = false) const;
|
|
|
|
bool isctype(charT c, char_class_type f) const;
|
|
|
|
int value(charT ch, int radix) const;
|
|
|
|
locale_type imbue(locale_type l);
|
|
|
|
locale_type getloc()const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class charT, class traits = regex_traits<charT>>
|
|
|
|
class basic_regex
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// types:
|
|
|
|
typedef charT value_type;
|
2016-08-02 21:34:48 +00:00
|
|
|
typedef traits traits_type;
|
|
|
|
typedef typename traits::string_type string_type;
|
2010-06-17 00:34:59 +00:00
|
|
|
typedef regex_constants::syntax_option_type flag_type;
|
|
|
|
typedef typename traits::locale_type locale_type;
|
|
|
|
|
|
|
|
// constants:
|
|
|
|
static constexpr regex_constants::syntax_option_type icase = regex_constants::icase;
|
|
|
|
static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
|
|
|
|
static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize;
|
|
|
|
static constexpr regex_constants::syntax_option_type collate = regex_constants::collate;
|
|
|
|
static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
|
|
|
|
static constexpr regex_constants::syntax_option_type basic = regex_constants::basic;
|
|
|
|
static constexpr regex_constants::syntax_option_type extended = regex_constants::extended;
|
|
|
|
static constexpr regex_constants::syntax_option_type awk = regex_constants::awk;
|
|
|
|
static constexpr regex_constants::syntax_option_type grep = regex_constants::grep;
|
|
|
|
static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep;
|
2020-11-18 18:09:13 +01:00
|
|
|
static constexpr regex_constants::syntax_option_type multiline = regex_constants::multiline;
|
2010-06-17 00:34:59 +00:00
|
|
|
|
|
|
|
// construct/copy/destroy:
|
|
|
|
basic_regex();
|
|
|
|
explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
|
2016-08-07 22:26:04 +00:00
|
|
|
basic_regex(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
|
2010-06-17 00:34:59 +00:00
|
|
|
basic_regex(const basic_regex&);
|
2012-07-21 01:31:58 +00:00
|
|
|
basic_regex(basic_regex&&) noexcept;
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class ST, class SA>
|
|
|
|
explicit basic_regex(const basic_string<charT, ST, SA>& p,
|
|
|
|
flag_type f = regex_constants::ECMAScript);
|
|
|
|
template <class ForwardIterator>
|
|
|
|
basic_regex(ForwardIterator first, ForwardIterator last,
|
|
|
|
flag_type f = regex_constants::ECMAScript);
|
|
|
|
basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
|
|
|
|
|
|
|
|
~basic_regex();
|
|
|
|
|
|
|
|
basic_regex& operator=(const basic_regex&);
|
2012-07-21 01:31:58 +00:00
|
|
|
basic_regex& operator=(basic_regex&&) noexcept;
|
2010-06-17 00:34:59 +00:00
|
|
|
basic_regex& operator=(const charT* ptr);
|
|
|
|
basic_regex& operator=(initializer_list<charT> il);
|
|
|
|
template <class ST, class SA>
|
|
|
|
basic_regex& operator=(const basic_string<charT, ST, SA>& p);
|
|
|
|
|
|
|
|
// assign:
|
|
|
|
basic_regex& assign(const basic_regex& that);
|
2012-07-21 01:31:58 +00:00
|
|
|
basic_regex& assign(basic_regex&& that) noexcept;
|
2019-09-25 16:40:30 +00:00
|
|
|
basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
|
|
|
|
basic_regex& assign(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class string_traits, class A>
|
|
|
|
basic_regex& assign(const basic_string<charT, string_traits, A>& s,
|
2019-09-25 16:40:30 +00:00
|
|
|
flag_type f = regex_constants::ECMAScript);
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class InputIterator>
|
|
|
|
basic_regex& assign(InputIterator first, InputIterator last,
|
2019-09-25 16:40:30 +00:00
|
|
|
flag_type f = regex_constants::ECMAScript);
|
|
|
|
basic_regex& assign(initializer_list<charT>, flag_type f = regex_constants::ECMAScript);
|
2010-06-17 00:34:59 +00:00
|
|
|
|
|
|
|
// const operations:
|
|
|
|
unsigned mark_count() const;
|
|
|
|
flag_type flags() const;
|
|
|
|
|
|
|
|
// locale:
|
|
|
|
locale_type imbue(locale_type loc);
|
|
|
|
locale_type getloc() const;
|
|
|
|
|
|
|
|
// swap:
|
|
|
|
void swap(basic_regex&);
|
|
|
|
};
|
|
|
|
|
2018-05-23 01:57:02 +00:00
|
|
|
template<class ForwardIterator>
|
|
|
|
basic_regex(ForwardIterator, ForwardIterator,
|
|
|
|
regex_constants::syntax_option_type = regex_constants::ECMAScript)
|
|
|
|
-> basic_regex<typename iterator_traits<ForwardIterator>::value_type>; // C++17
|
|
|
|
|
2010-06-17 00:34:59 +00:00
|
|
|
typedef basic_regex<char> regex;
|
|
|
|
typedef basic_regex<wchar_t> wregex;
|
|
|
|
|
|
|
|
template <class charT, class traits>
|
|
|
|
void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
|
|
|
|
|
|
|
|
template <class BidirectionalIterator>
|
|
|
|
class sub_match
|
|
|
|
: public pair<BidirectionalIterator, BidirectionalIterator>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
|
|
|
|
typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
|
|
|
|
typedef BidirectionalIterator iterator;
|
|
|
|
typedef basic_string<value_type> string_type;
|
|
|
|
|
|
|
|
bool matched;
|
|
|
|
|
2010-12-08 21:07:55 +00:00
|
|
|
constexpr sub_match();
|
|
|
|
|
2010-06-17 00:34:59 +00:00
|
|
|
difference_type length() const;
|
|
|
|
operator string_type() const;
|
|
|
|
string_type str() const;
|
|
|
|
|
|
|
|
int compare(const sub_match& s) const;
|
|
|
|
int compare(const string_type& s) const;
|
|
|
|
int compare(const value_type* s) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef sub_match<const char*> csub_match;
|
|
|
|
typedef sub_match<const wchar_t*> wcsub_match;
|
|
|
|
typedef sub_match<string::const_iterator> ssub_match;
|
|
|
|
typedef sub_match<wstring::const_iterator> wssub_match;
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool
|
|
|
|
operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool
|
|
|
|
operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool
|
|
|
|
operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool
|
|
|
|
operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool
|
|
|
|
operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool
|
|
|
|
operator==(const sub_match<BiIter>& lhs,
|
|
|
|
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool
|
|
|
|
operator!=(const sub_match<BiIter>& lhs,
|
|
|
|
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool
|
|
|
|
operator<(const sub_match<BiIter>& lhs,
|
|
|
|
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool operator>(const sub_match<BiIter>& lhs,
|
|
|
|
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool
|
|
|
|
operator>=(const sub_match<BiIter>& lhs,
|
|
|
|
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter, class ST, class SA>
|
|
|
|
bool
|
|
|
|
operator<=(const sub_match<BiIter>& lhs,
|
|
|
|
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator==(typename iterator_traits<BiIter>::value_type const* lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator<(typename iterator_traits<BiIter>::value_type const* lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator>(typename iterator_traits<BiIter>::value_type const* lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator==(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const* rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator!=(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const* rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator<(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const* rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator>(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const* rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator>=(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const* rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator<=(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const* rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator==(typename iterator_traits<BiIter>::value_type const& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator<(typename iterator_traits<BiIter>::value_type const& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator>(typename iterator_traits<BiIter>::value_type const& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
|
|
|
|
const sub_match<BiIter>& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator==(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator!=(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator<(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator>(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator>=(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const& rhs);
|
|
|
|
|
|
|
|
template <class BiIter>
|
|
|
|
bool
|
|
|
|
operator<=(const sub_match<BiIter>& lhs,
|
|
|
|
typename iterator_traits<BiIter>::value_type const& rhs);
|
|
|
|
|
|
|
|
template <class charT, class ST, class BiIter>
|
|
|
|
basic_ostream<charT, ST>&
|
|
|
|
operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
|
|
|
|
|
|
|
|
template <class BidirectionalIterator,
|
|
|
|
class Allocator = allocator<sub_match<BidirectionalIterator>>>
|
|
|
|
class match_results
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef sub_match<BidirectionalIterator> value_type;
|
|
|
|
typedef const value_type& const_reference;
|
2014-02-26 01:56:31 +00:00
|
|
|
typedef value_type& reference;
|
2010-06-17 00:34:59 +00:00
|
|
|
typedef /implementation-defined/ const_iterator;
|
|
|
|
typedef const_iterator iterator;
|
|
|
|
typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
|
|
|
|
typedef typename allocator_traits<Allocator>::size_type size_type;
|
|
|
|
typedef Allocator allocator_type;
|
|
|
|
typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
|
|
|
|
typedef basic_string<char_type> string_type;
|
|
|
|
|
|
|
|
// construct/copy/destroy:
|
2021-01-19 08:21:09 +01:00
|
|
|
explicit match_results(const Allocator& a = Allocator()); // before C++20
|
|
|
|
match_results() : match_results(Allocator()) {} // C++20
|
|
|
|
explicit match_results(const Allocator& a); // C++20
|
2010-06-17 00:34:59 +00:00
|
|
|
match_results(const match_results& m);
|
2012-07-21 01:31:58 +00:00
|
|
|
match_results(match_results&& m) noexcept;
|
2010-06-17 00:34:59 +00:00
|
|
|
match_results& operator=(const match_results& m);
|
|
|
|
match_results& operator=(match_results&& m);
|
|
|
|
~match_results();
|
|
|
|
|
2010-12-08 21:07:55 +00:00
|
|
|
bool ready() const;
|
|
|
|
|
2010-06-17 00:34:59 +00:00
|
|
|
// size:
|
|
|
|
size_type size() const;
|
|
|
|
size_type max_size() const;
|
|
|
|
bool empty() const;
|
|
|
|
|
|
|
|
// element access:
|
|
|
|
difference_type length(size_type sub = 0) const;
|
|
|
|
difference_type position(size_type sub = 0) const;
|
|
|
|
string_type str(size_type sub = 0) const;
|
|
|
|
const_reference operator[](size_type n) const;
|
|
|
|
|
|
|
|
const_reference prefix() const;
|
|
|
|
const_reference suffix() const;
|
|
|
|
|
|
|
|
const_iterator begin() const;
|
|
|
|
const_iterator end() const;
|
|
|
|
const_iterator cbegin() const;
|
|
|
|
const_iterator cend() const;
|
|
|
|
|
|
|
|
// format:
|
|
|
|
template <class OutputIter>
|
|
|
|
OutputIter
|
|
|
|
format(OutputIter out, const char_type* fmt_first,
|
|
|
|
const char_type* fmt_last,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::format_default) const;
|
|
|
|
template <class OutputIter, class ST, class SA>
|
|
|
|
OutputIter
|
|
|
|
format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::format_default) const;
|
|
|
|
template <class ST, class SA>
|
|
|
|
basic_string<char_type, ST, SA>
|
|
|
|
format(const basic_string<char_type, ST, SA>& fmt,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::format_default) const;
|
|
|
|
string_type
|
|
|
|
format(const char_type* fmt,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::format_default) const;
|
|
|
|
|
|
|
|
// allocator:
|
|
|
|
allocator_type get_allocator() const;
|
|
|
|
|
|
|
|
// swap:
|
|
|
|
void swap(match_results& that);
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef match_results<const char*> cmatch;
|
|
|
|
typedef match_results<const wchar_t*> wcmatch;
|
|
|
|
typedef match_results<string::const_iterator> smatch;
|
|
|
|
typedef match_results<wstring::const_iterator> wsmatch;
|
|
|
|
|
|
|
|
template <class BidirectionalIterator, class Allocator>
|
|
|
|
bool
|
|
|
|
operator==(const match_results<BidirectionalIterator, Allocator>& m1,
|
|
|
|
const match_results<BidirectionalIterator, Allocator>& m2);
|
|
|
|
|
|
|
|
template <class BidirectionalIterator, class Allocator>
|
|
|
|
bool
|
|
|
|
operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
|
|
|
|
const match_results<BidirectionalIterator, Allocator>& m2);
|
|
|
|
|
|
|
|
template <class BidirectionalIterator, class Allocator>
|
|
|
|
void
|
|
|
|
swap(match_results<BidirectionalIterator, Allocator>& m1,
|
|
|
|
match_results<BidirectionalIterator, Allocator>& m2);
|
|
|
|
|
|
|
|
template <class BidirectionalIterator, class Allocator, class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_match(BidirectionalIterator first, BidirectionalIterator last,
|
|
|
|
match_results<BidirectionalIterator, Allocator>& m,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class BidirectionalIterator, class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_match(BidirectionalIterator first, BidirectionalIterator last,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class charT, class Allocator, class traits>
|
|
|
|
bool
|
|
|
|
regex_match(const charT* str, match_results<const charT*, Allocator>& m,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class ST, class SA, class Allocator, class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_match(const basic_string<charT, ST, SA>& s,
|
|
|
|
match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
2014-02-19 21:21:11 +00:00
|
|
|
template <class ST, class SA, class Allocator, class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_match(const basic_string<charT, ST, SA>&& s,
|
|
|
|
match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
|
|
|
|
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_match(const charT* str, const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class ST, class SA, class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_match(const basic_string<charT, ST, SA>& s,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class BidirectionalIterator, class Allocator, class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_search(BidirectionalIterator first, BidirectionalIterator last,
|
|
|
|
match_results<BidirectionalIterator, Allocator>& m,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class BidirectionalIterator, class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_search(BidirectionalIterator first, BidirectionalIterator last,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class charT, class Allocator, class traits>
|
|
|
|
bool
|
|
|
|
regex_search(const charT* str, match_results<const charT*, Allocator>& m,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_search(const charT* str, const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class ST, class SA, class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_search(const basic_string<charT, ST, SA>& s,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class ST, class SA, class Allocator, class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_search(const basic_string<charT, ST, SA>& s,
|
|
|
|
match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
2014-02-19 21:21:11 +00:00
|
|
|
template <class ST, class SA, class Allocator, class charT, class traits>
|
|
|
|
bool
|
|
|
|
regex_search(const basic_string<charT, ST, SA>&& s,
|
|
|
|
match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
|
|
|
|
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class OutputIterator, class BidirectionalIterator,
|
|
|
|
class traits, class charT, class ST, class SA>
|
|
|
|
OutputIterator
|
|
|
|
regex_replace(OutputIterator out,
|
|
|
|
BidirectionalIterator first, BidirectionalIterator last,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
const basic_string<charT, ST, SA>& fmt,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class OutputIterator, class BidirectionalIterator,
|
|
|
|
class traits, class charT>
|
|
|
|
OutputIterator
|
|
|
|
regex_replace(OutputIterator out,
|
|
|
|
BidirectionalIterator first, BidirectionalIterator last,
|
|
|
|
const basic_regex<charT, traits>& e, const charT* fmt,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
2020-06-25 15:31:03 -04:00
|
|
|
template <class traits, class charT, class ST, class SA, class FST, class FSA>
|
2010-06-17 00:34:59 +00:00
|
|
|
basic_string<charT, ST, SA>
|
|
|
|
regex_replace(const basic_string<charT, ST, SA>& s,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
const basic_string<charT, FST, FSA>& fmt,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class traits, class charT, class ST, class SA>
|
|
|
|
basic_string<charT, ST, SA>
|
|
|
|
regex_replace(const basic_string<charT, ST, SA>& s,
|
|
|
|
const basic_regex<charT, traits>& e, const charT* fmt,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class traits, class charT, class ST, class SA>
|
|
|
|
basic_string<charT>
|
|
|
|
regex_replace(const charT* s,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
const basic_string<charT, ST, SA>& fmt,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class traits, class charT>
|
|
|
|
basic_string<charT>
|
|
|
|
regex_replace(const charT* s,
|
|
|
|
const basic_regex<charT, traits>& e,
|
|
|
|
const charT* fmt,
|
|
|
|
regex_constants::match_flag_type flags = regex_constants::match_default);
|
|
|
|
|
|
|
|
template <class BidirectionalIterator,
|
|
|
|
class charT = typename iterator_traits< BidirectionalIterator>::value_type,
|
|
|
|
class traits = regex_traits<charT>>
|
|
|
|
class regex_iterator
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef basic_regex<charT, traits> regex_type;
|
|
|
|
typedef match_results<BidirectionalIterator> value_type;
|
|
|
|
typedef ptrdiff_t difference_type;
|
|
|
|
typedef const value_type* pointer;
|
|
|
|
typedef const value_type& reference;
|
|
|
|
typedef forward_iterator_tag iterator_category;
|
|
|
|
|
|
|
|
regex_iterator();
|
|
|
|
regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
|
|
|
|
const regex_type& re,
|
|
|
|
regex_constants::match_flag_type m = regex_constants::match_default);
|
2020-06-25 15:31:03 -04:00
|
|
|
regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
|
|
|
|
const regex_type&& re,
|
|
|
|
regex_constants::match_flag_type m
|
2014-02-19 21:21:11 +00:00
|
|
|
= regex_constants::match_default) = delete; // C++14
|
2010-06-17 00:34:59 +00:00
|
|
|
regex_iterator(const regex_iterator&);
|
|
|
|
regex_iterator& operator=(const regex_iterator&);
|
|
|
|
|
|
|
|
bool operator==(const regex_iterator&) const;
|
|
|
|
bool operator!=(const regex_iterator&) const;
|
|
|
|
|
|
|
|
const value_type& operator*() const;
|
|
|
|
const value_type* operator->() const;
|
|
|
|
|
|
|
|
regex_iterator& operator++();
|
|
|
|
regex_iterator operator++(int);
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef regex_iterator<const char*> cregex_iterator;
|
|
|
|
typedef regex_iterator<const wchar_t*> wcregex_iterator;
|
|
|
|
typedef regex_iterator<string::const_iterator> sregex_iterator;
|
|
|
|
typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
|
|
|
|
|
|
|
|
template <class BidirectionalIterator,
|
2020-06-25 15:31:03 -04:00
|
|
|
class charT = typename iterator_traits<BidirectionalIterator>::value_type,
|
2010-06-17 00:34:59 +00:00
|
|
|
class traits = regex_traits<charT>>
|
|
|
|
class regex_token_iterator
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef basic_regex<charT, traits> regex_type;
|
|
|
|
typedef sub_match<BidirectionalIterator> value_type;
|
|
|
|
typedef ptrdiff_t difference_type;
|
|
|
|
typedef const value_type* pointer;
|
|
|
|
typedef const value_type& reference;
|
|
|
|
typedef forward_iterator_tag iterator_category;
|
|
|
|
|
|
|
|
regex_token_iterator();
|
|
|
|
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
|
|
|
|
const regex_type& re, int submatch = 0,
|
|
|
|
regex_constants::match_flag_type m = regex_constants::match_default);
|
2014-02-19 21:21:11 +00:00
|
|
|
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
|
|
|
|
const regex_type&& re, int submatch = 0,
|
|
|
|
regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
|
2010-06-17 00:34:59 +00:00
|
|
|
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
|
|
|
|
const regex_type& re, const vector<int>& submatches,
|
|
|
|
regex_constants::match_flag_type m = regex_constants::match_default);
|
2014-02-19 21:21:11 +00:00
|
|
|
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
|
|
|
|
const regex_type&& re, const vector<int>& submatches,
|
|
|
|
regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
|
2010-06-17 00:34:59 +00:00
|
|
|
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
|
|
|
|
const regex_type& re, initializer_list<int> submatches,
|
|
|
|
regex_constants::match_flag_type m = regex_constants::match_default);
|
2014-02-19 21:21:11 +00:00
|
|
|
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
|
|
|
|
const regex_type&& re, initializer_list<int> submatches,
|
|
|
|
regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
|
2010-06-17 00:34:59 +00:00
|
|
|
template <size_t N>
|
|
|
|
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
|
|
|
|
const regex_type& re, const int (&submatches)[N],
|
|
|
|
regex_constants::match_flag_type m = regex_constants::match_default);
|
2014-02-19 21:21:11 +00:00
|
|
|
template <size_t N>
|
|
|
|
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
|
2020-06-25 15:31:03 -04:00
|
|
|
const regex_type&& re, const int (&submatches)[N],
|
|
|
|
regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
|
2010-06-17 00:34:59 +00:00
|
|
|
regex_token_iterator(const regex_token_iterator&);
|
|
|
|
regex_token_iterator& operator=(const regex_token_iterator&);
|
|
|
|
|
|
|
|
bool operator==(const regex_token_iterator&) const;
|
|
|
|
bool operator!=(const regex_token_iterator&) const;
|
|
|
|
|
|
|
|
const value_type& operator*() const;
|
|
|
|
const value_type* operator->() const;
|
|
|
|
|
|
|
|
regex_token_iterator& operator++();
|
|
|
|
regex_token_iterator operator++(int);
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef regex_token_iterator<const char*> cregex_token_iterator;
|
|
|
|
typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
|
|
|
|
typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
|
|
|
|
typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
|
|
|
|
|
|
|
|
} // std
|
|
|
|
*/
|
|
|
|
|
2022-02-15 18:18:08 +01:00
|
|
|
#include <__algorithm/find.h>
|
2022-04-17 16:01:38 +02:00
|
|
|
#include <__algorithm/search.h>
|
2022-03-25 12:55:36 -04:00
|
|
|
#include <__assert> // all public C++ headers provide the assertion handler
|
2010-06-17 00:34:59 +00:00
|
|
|
#include <__config>
|
2022-06-10 19:53:10 +02:00
|
|
|
#include <__iterator/back_insert_iterator.h>
|
2021-06-11 09:55:11 -04:00
|
|
|
#include <__iterator/wrap_iter.h>
|
2010-06-17 00:34:59 +00:00
|
|
|
#include <__locale>
|
2022-03-05 19:17:07 +01:00
|
|
|
#include <__utility/move.h>
|
|
|
|
#include <__utility/swap.h>
|
2021-05-12 23:04:03 -04:00
|
|
|
#include <deque>
|
2010-06-30 00:21:42 +00:00
|
|
|
#include <memory>
|
2021-05-12 23:04:03 -04:00
|
|
|
#include <stdexcept>
|
|
|
|
#include <string>
|
2010-06-30 00:21:42 +00:00
|
|
|
#include <vector>
|
2018-09-12 19:41:40 +00:00
|
|
|
#include <version>
|
2010-06-17 00:34:59 +00:00
|
|
|
|
[libc++] Re-add transitive includes that had been removed since LLVM 14
This commit re-adds transitive includes that had been removed by
4cd04d1687f1, c36870c8e79c, a83f4b9cda57, 1458458b558d, 2e2f3158c604,
and 489637e66dd3. This should cover almost all the includes that had
been removed since LLVM 14 and that would contribute to breaking user
code when releasing LLVM 15.
It is possible to disable the inclusion of these headers by defining
_LIBCPP_REMOVE_TRANSITIVE_INCLUDES. The intent is that vendors will
enable that macro and start fixing downstream issues immediately. We
can then remove the macro (and the transitive includes) by default in
a future release. That way, we will break users only once by removing
transitive includes in bulk instead of doing it bit by bit a every
release, which is more disruptive for users.
Note 1: The set of headers to re-add was found by re-generating the
transitive include test on a checkout of release/14.x, which
provided the list of all transitive includes we used to provide.
Note 2: Several includes of <vector>, <optional>, <array> and <unordered_map>
have been added in this commit. These transitive inclusions were
added when we implemented boyer_moore_searcher in <functional>.
Note 3: This is a best effort patch to try and resolve downstream breakage
caused since branching LLVM 14. I wasn't able to perfectly mirror
transitive includes in LLVM 14 for a few headers, so I added a
release note explaining it. To summarize, adding boyer_moore_searcher
created a bunch of circular dependencies, so we have to break
backwards compatibility in a few cases.
Differential Revision: https://reviews.llvm.org/D128661
2022-06-27 15:53:41 -04:00
|
|
|
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
|
|
|
# include <iterator>
|
|
|
|
# include <utility>
|
|
|
|
#endif
|
|
|
|
|
2022-06-16 22:43:46 +02:00
|
|
|
// standard-mandated includes
|
|
|
|
|
|
|
|
// [iterator.range]
|
|
|
|
#include <__iterator/access.h>
|
|
|
|
#include <__iterator/data.h>
|
|
|
|
#include <__iterator/empty.h>
|
|
|
|
#include <__iterator/reverse_access.h>
|
|
|
|
#include <__iterator/size.h>
|
|
|
|
|
|
|
|
// [re.syn]
|
|
|
|
#include <compare>
|
|
|
|
#include <initializer_list>
|
|
|
|
|
2011-10-17 20:05:10 +00:00
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
2022-02-01 20:16:40 -05:00
|
|
|
# pragma GCC system_header
|
2011-10-17 20:05:10 +00:00
|
|
|
#endif
|
2010-06-17 00:34:59 +00:00
|
|
|
|
2017-05-31 22:07:49 +00:00
|
|
|
_LIBCPP_PUSH_MACROS
|
|
|
|
#include <__undef_macros>
|
|
|
|
|
|
|
|
|
2017-09-12 17:56:59 +00:00
|
|
|
#define _LIBCPP_REGEX_COMPLEXITY_FACTOR 4096
|
|
|
|
|
2010-06-17 00:34:59 +00:00
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
|
|
|
|
namespace regex_constants
|
|
|
|
{
|
|
|
|
|
|
|
|
// syntax_option_type
|
|
|
|
|
|
|
|
enum syntax_option_type
|
|
|
|
{
|
|
|
|
icase = 1 << 0,
|
|
|
|
nosubs = 1 << 1,
|
|
|
|
optimize = 1 << 2,
|
|
|
|
collate = 1 << 3,
|
2019-03-28 17:30:23 +00:00
|
|
|
#ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
|
|
|
|
ECMAScript = 1 << 9,
|
|
|
|
#else
|
2010-07-27 17:24:17 +00:00
|
|
|
ECMAScript = 0,
|
2019-03-28 17:30:23 +00:00
|
|
|
#endif
|
2010-07-27 17:24:17 +00:00
|
|
|
basic = 1 << 4,
|
|
|
|
extended = 1 << 5,
|
|
|
|
awk = 1 << 6,
|
|
|
|
grep = 1 << 7,
|
2020-11-18 18:09:13 +01:00
|
|
|
egrep = 1 << 8,
|
|
|
|
// 1 << 9 may be used by ECMAScript
|
|
|
|
multiline = 1 << 10
|
2010-06-17 00:34:59 +00:00
|
|
|
};
|
|
|
|
|
2022-08-13 13:23:16 +02:00
|
|
|
_LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR
|
2019-03-28 17:30:23 +00:00
|
|
|
syntax_option_type __get_grammar(syntax_option_type __g)
|
|
|
|
{
|
|
|
|
#ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
|
|
|
|
return static_cast<syntax_option_type>(__g & 0x3F0);
|
|
|
|
#else
|
|
|
|
return static_cast<syntax_option_type>(__g & 0x1F0);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2012-07-21 01:31:58 +00:00
|
|
|
_LIBCPP_CONSTEXPR
|
2010-06-17 00:34:59 +00:00
|
|
|
syntax_option_type
|
|
|
|
operator~(syntax_option_type __x)
|
|
|
|
{
|
2013-03-22 02:13:55 +00:00
|
|
|
return syntax_option_type(~int(__x) & 0x1FF);
|
2010-06-17 00:34:59 +00:00
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2012-07-21 01:31:58 +00:00
|
|
|
_LIBCPP_CONSTEXPR
|
2010-06-17 00:34:59 +00:00
|
|
|
syntax_option_type
|
|
|
|
operator&(syntax_option_type __x, syntax_option_type __y)
|
|
|
|
{
|
|
|
|
return syntax_option_type(int(__x) & int(__y));
|
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2012-07-21 01:31:58 +00:00
|
|
|
_LIBCPP_CONSTEXPR
|
2010-06-17 00:34:59 +00:00
|
|
|
syntax_option_type
|
|
|
|
operator|(syntax_option_type __x, syntax_option_type __y)
|
|
|
|
{
|
|
|
|
return syntax_option_type(int(__x) | int(__y));
|
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2012-07-21 01:31:58 +00:00
|
|
|
_LIBCPP_CONSTEXPR
|
2010-06-17 00:34:59 +00:00
|
|
|
syntax_option_type
|
|
|
|
operator^(syntax_option_type __x, syntax_option_type __y)
|
|
|
|
{
|
|
|
|
return syntax_option_type(int(__x) ^ int(__y));
|
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
syntax_option_type&
|
|
|
|
operator&=(syntax_option_type& __x, syntax_option_type __y)
|
|
|
|
{
|
|
|
|
__x = __x & __y;
|
|
|
|
return __x;
|
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
syntax_option_type&
|
|
|
|
operator|=(syntax_option_type& __x, syntax_option_type __y)
|
|
|
|
{
|
|
|
|
__x = __x | __y;
|
|
|
|
return __x;
|
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
syntax_option_type&
|
|
|
|
operator^=(syntax_option_type& __x, syntax_option_type __y)
|
|
|
|
{
|
|
|
|
__x = __x ^ __y;
|
|
|
|
return __x;
|
|
|
|
}
|
|
|
|
|
|
|
|
// match_flag_type
|
|
|
|
|
|
|
|
enum match_flag_type
|
|
|
|
{
|
|
|
|
match_default = 0,
|
|
|
|
match_not_bol = 1 << 0,
|
|
|
|
match_not_eol = 1 << 1,
|
|
|
|
match_not_bow = 1 << 2,
|
|
|
|
match_not_eow = 1 << 3,
|
|
|
|
match_any = 1 << 4,
|
|
|
|
match_not_null = 1 << 5,
|
|
|
|
match_continuous = 1 << 6,
|
|
|
|
match_prev_avail = 1 << 7,
|
|
|
|
format_default = 0,
|
|
|
|
format_sed = 1 << 8,
|
|
|
|
format_no_copy = 1 << 9,
|
2010-08-16 20:21:16 +00:00
|
|
|
format_first_only = 1 << 10,
|
2016-10-27 21:40:34 +00:00
|
|
|
__no_update_pos = 1 << 11,
|
|
|
|
__full_match = 1 << 12
|
2010-06-17 00:34:59 +00:00
|
|
|
};
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2012-07-21 01:31:58 +00:00
|
|
|
_LIBCPP_CONSTEXPR
|
2010-06-17 00:34:59 +00:00
|
|
|
match_flag_type
|
|
|
|
operator~(match_flag_type __x)
|
|
|
|
{
|
2013-03-22 02:13:55 +00:00
|
|
|
return match_flag_type(~int(__x) & 0x0FFF);
|
2010-06-17 00:34:59 +00:00
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2012-07-21 01:31:58 +00:00
|
|
|
_LIBCPP_CONSTEXPR
|
2010-06-17 00:34:59 +00:00
|
|
|
match_flag_type
|
|
|
|
operator&(match_flag_type __x, match_flag_type __y)
|
|
|
|
{
|
|
|
|
return match_flag_type(int(__x) & int(__y));
|
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2012-07-21 01:31:58 +00:00
|
|
|
_LIBCPP_CONSTEXPR
|
2010-06-17 00:34:59 +00:00
|
|
|
match_flag_type
|
|
|
|
operator|(match_flag_type __x, match_flag_type __y)
|
|
|
|
{
|
|
|
|
return match_flag_type(int(__x) | int(__y));
|
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2012-07-21 01:31:58 +00:00
|
|
|
_LIBCPP_CONSTEXPR
|
2010-06-17 00:34:59 +00:00
|
|
|
match_flag_type
|
|
|
|
operator^(match_flag_type __x, match_flag_type __y)
|
|
|
|
{
|
|
|
|
return match_flag_type(int(__x) ^ int(__y));
|
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
match_flag_type&
|
|
|
|
operator&=(match_flag_type& __x, match_flag_type __y)
|
|
|
|
{
|
|
|
|
__x = __x & __y;
|
|
|
|
return __x;
|
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
match_flag_type&
|
|
|
|
operator|=(match_flag_type& __x, match_flag_type __y)
|
|
|
|
{
|
|
|
|
__x = __x | __y;
|
|
|
|
return __x;
|
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
match_flag_type&
|
|
|
|
operator^=(match_flag_type& __x, match_flag_type __y)
|
|
|
|
{
|
|
|
|
__x = __x ^ __y;
|
|
|
|
return __x;
|
|
|
|
}
|
|
|
|
|
|
|
|
enum error_type
|
|
|
|
{
|
|
|
|
error_collate = 1,
|
|
|
|
error_ctype,
|
|
|
|
error_escape,
|
|
|
|
error_backref,
|
|
|
|
error_brack,
|
|
|
|
error_paren,
|
|
|
|
error_brace,
|
|
|
|
error_badbrace,
|
|
|
|
error_range,
|
|
|
|
error_space,
|
|
|
|
error_badrepeat,
|
|
|
|
error_complexity,
|
2010-06-24 21:28:00 +00:00
|
|
|
error_stack,
|
2010-07-27 17:24:17 +00:00
|
|
|
__re_err_grammar,
|
|
|
|
__re_err_empty,
|
2019-11-09 17:01:37 +01:00
|
|
|
__re_err_unknown,
|
|
|
|
__re_err_parse
|
2010-06-17 00:34:59 +00:00
|
|
|
};
|
|
|
|
|
2021-12-02 14:12:51 +01:00
|
|
|
} // namespace regex_constants
|
2010-06-17 00:34:59 +00:00
|
|
|
|
|
|
|
class _LIBCPP_EXCEPTION_ABI regex_error
|
|
|
|
: public runtime_error
|
|
|
|
{
|
|
|
|
regex_constants::error_type __code_;
|
|
|
|
public:
|
|
|
|
explicit regex_error(regex_constants::error_type __ecode);
|
2020-03-13 19:36:26 +01:00
|
|
|
regex_error(const regex_error&) _NOEXCEPT = default;
|
|
|
|
virtual ~regex_error() _NOEXCEPT;
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
regex_constants::error_type code() const {return __code_;}
|
|
|
|
};
|
|
|
|
|
2015-07-28 13:30:47 +00:00
|
|
|
template <regex_constants::error_type _Ev>
|
2018-07-11 23:14:33 +00:00
|
|
|
_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
|
2015-07-28 13:30:47 +00:00
|
|
|
void __throw_regex_error()
|
|
|
|
{
|
|
|
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
2015-08-17 21:14:16 +00:00
|
|
|
throw regex_error(_Ev);
|
|
|
|
#else
|
2016-08-25 15:09:01 +00:00
|
|
|
_VSTD::abort();
|
2015-07-28 13:30:47 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class _CharT>
|
2017-01-04 23:56:00 +00:00
|
|
|
struct _LIBCPP_TEMPLATE_VIS regex_traits
|
2010-06-17 00:34:59 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef _CharT char_type;
|
|
|
|
typedef basic_string<char_type> string_type;
|
|
|
|
typedef locale locale_type;
|
2020-04-06 13:34:27 -07:00
|
|
|
#ifdef __BIONIC__
|
|
|
|
// Originally bionic's ctype_base used its own ctype masks because the
|
|
|
|
// builtin ctype implementation wasn't in libc++ yet. Bionic's ctype mask
|
|
|
|
// was only 8 bits wide and already saturated, so it used a wider type here
|
|
|
|
// to make room for __regex_word (then a part of this class rather than
|
|
|
|
// ctype_base). Bionic has since moved to the builtin ctype_base
|
|
|
|
// implementation, but this was not updated to match. Since then Android has
|
|
|
|
// needed to maintain a stable libc++ ABI, and this can't be changed without
|
|
|
|
// an ABI break.
|
|
|
|
typedef uint16_t char_class_type;
|
|
|
|
#else
|
2010-06-21 21:01:43 +00:00
|
|
|
typedef ctype_base::mask char_class_type;
|
2020-04-06 13:34:27 -07:00
|
|
|
#endif
|
2010-06-17 00:34:59 +00:00
|
|
|
|
[libc++] Keep __regex_word in sync with ctype_base
Summary:
The class ctype_base in the header <__locale> contains masks for
character classification functions, which are kept in sync with
platform's C library, hence it contains many special cases.
The value of the bit mask __regex_word in the header <regex> must not
clash with those bit masks.
Currently the default case (i.e. unknown platform/C library) is
handled incorrectly: the __regex_word clashes with ctype_base::punct.
To avoid replicating the whole list of platforms in <regex> this patch
defines __regex_word in <__locale>, so that it is always kept in sync
with other masks.
Reviewers: ldionne, mclow.lists, EricWF
Reviewed By: ldionne
Subscribers: krytarowski, christof, dexonsmith, pbarrio, simon_tatham, libcxx-commits
Tags: #libc
Differential Revision: https://reviews.llvm.org/D63284
llvm-svn: 363363
2019-06-14 09:04:16 +00:00
|
|
|
static const char_class_type __regex_word = ctype_base::__regex_word;
|
2010-06-17 00:34:59 +00:00
|
|
|
private:
|
|
|
|
locale __loc_;
|
|
|
|
const ctype<char_type>* __ct_;
|
|
|
|
const collate<char_type>* __col_;
|
|
|
|
|
|
|
|
public:
|
|
|
|
regex_traits();
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
static size_t length(const char_type* __p)
|
|
|
|
{return char_traits<char_type>::length(__p);}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
char_type translate(char_type __c) const {return __c;}
|
|
|
|
char_type translate_nocase(char_type __c) const;
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
string_type
|
|
|
|
transform(_ForwardIterator __f, _ForwardIterator __l) const;
|
|
|
|
template <class _ForwardIterator>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
string_type
|
|
|
|
transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
|
|
|
|
{return __transform_primary(__f, __l, char_type());}
|
|
|
|
template <class _ForwardIterator>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
string_type
|
|
|
|
lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
|
|
|
|
{return __lookup_collatename(__f, __l, char_type());}
|
|
|
|
template <class _ForwardIterator>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
char_class_type
|
|
|
|
lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
|
2010-06-21 21:01:43 +00:00
|
|
|
bool __icase = false) const
|
|
|
|
{return __lookup_classname(__f, __l, __icase, char_type());}
|
|
|
|
bool isctype(char_type __c, char_class_type __m) const;
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-21 21:01:43 +00:00
|
|
|
int value(char_type __ch, int __radix) const
|
2013-10-21 15:43:25 +00:00
|
|
|
{return __regex_traits_value(__ch, __radix);}
|
2010-06-17 00:34:59 +00:00
|
|
|
locale_type imbue(locale_type __l);
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-17 00:34:59 +00:00
|
|
|
locale_type getloc()const {return __loc_;}
|
|
|
|
|
|
|
|
private:
|
|
|
|
void __init();
|
|
|
|
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
string_type
|
|
|
|
__transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
string_type
|
|
|
|
__transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
string_type
|
|
|
|
__lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
string_type
|
|
|
|
__lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2010-06-21 21:01:43 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
char_class_type
|
|
|
|
__lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
|
|
|
|
bool __icase, char) const;
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2010-06-21 21:01:43 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
char_class_type
|
|
|
|
__lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
|
|
|
|
bool __icase, wchar_t) const;
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2010-06-21 21:01:43 +00:00
|
|
|
|
2013-10-21 15:43:25 +00:00
|
|
|
static int __regex_traits_value(unsigned char __ch, int __radix);
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2013-10-21 15:43:25 +00:00
|
|
|
int __regex_traits_value(char __ch, int __radix) const
|
|
|
|
{return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2015-11-07 01:22:13 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2013-10-21 15:43:25 +00:00
|
|
|
int __regex_traits_value(wchar_t __ch, int __radix) const;
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2010-06-17 00:34:59 +00:00
|
|
|
};
|
|
|
|
|
2013-03-07 19:38:08 +00:00
|
|
|
template <class _CharT>
|
|
|
|
const typename regex_traits<_CharT>::char_class_type
|
|
|
|
regex_traits<_CharT>::__regex_word;
|
|
|
|
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class _CharT>
|
|
|
|
regex_traits<_CharT>::regex_traits()
|
|
|
|
{
|
|
|
|
__init();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
typename regex_traits<_CharT>::char_type
|
|
|
|
regex_traits<_CharT>::translate_nocase(char_type __c) const
|
|
|
|
{
|
|
|
|
return __ct_->tolower(__c);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
typename regex_traits<_CharT>::string_type
|
|
|
|
regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
|
|
|
|
{
|
|
|
|
string_type __s(__f, __l);
|
|
|
|
return __col_->transform(__s.data(), __s.data() + __s.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
void
|
|
|
|
regex_traits<_CharT>::__init()
|
|
|
|
{
|
|
|
|
__ct_ = &use_facet<ctype<char_type> >(__loc_);
|
|
|
|
__col_ = &use_facet<collate<char_type> >(__loc_);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
typename regex_traits<_CharT>::locale_type
|
|
|
|
regex_traits<_CharT>::imbue(locale_type __l)
|
|
|
|
{
|
|
|
|
locale __r = __loc_;
|
|
|
|
__loc_ = __l;
|
|
|
|
__init();
|
|
|
|
return __r;
|
|
|
|
}
|
|
|
|
|
|
|
|
// transform_primary is very FreeBSD-specific
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
typename regex_traits<_CharT>::string_type
|
|
|
|
regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
|
|
|
|
_ForwardIterator __l, char) const
|
|
|
|
{
|
|
|
|
const string_type __s(__f, __l);
|
|
|
|
string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
|
|
|
|
switch (__d.size())
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
break;
|
|
|
|
case 12:
|
|
|
|
__d[11] = __d[3];
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
__d.clear();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return __d;
|
|
|
|
}
|
|
|
|
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class _CharT>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
typename regex_traits<_CharT>::string_type
|
|
|
|
regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
|
|
|
|
_ForwardIterator __l, wchar_t) const
|
|
|
|
{
|
|
|
|
const string_type __s(__f, __l);
|
|
|
|
string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
|
|
|
|
switch (__d.size())
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
__d[2] = __d[0];
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
__d.clear();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return __d;
|
|
|
|
}
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2010-06-17 00:34:59 +00:00
|
|
|
|
|
|
|
// lookup_collatename is very FreeBSD-specific
|
|
|
|
|
2013-08-12 18:38:34 +00:00
|
|
|
_LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
|
2010-06-17 00:34:59 +00:00
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
typename regex_traits<_CharT>::string_type
|
|
|
|
regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
|
|
|
|
_ForwardIterator __l, char) const
|
|
|
|
{
|
|
|
|
string_type __s(__f, __l);
|
|
|
|
string_type __r;
|
|
|
|
if (!__s.empty())
|
|
|
|
{
|
|
|
|
__r = __get_collation_name(__s.c_str());
|
|
|
|
if (__r.empty() && __s.size() <= 2)
|
|
|
|
{
|
|
|
|
__r = __col_->transform(__s.data(), __s.data() + __s.size());
|
|
|
|
if (__r.size() == 1 || __r.size() == 12)
|
|
|
|
__r = __s;
|
|
|
|
else
|
|
|
|
__r.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __r;
|
|
|
|
}
|
|
|
|
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2010-06-17 00:34:59 +00:00
|
|
|
template <class _CharT>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
typename regex_traits<_CharT>::string_type
|
|
|
|
regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
|
|
|
|
_ForwardIterator __l, wchar_t) const
|
|
|
|
{
|
|
|
|
string_type __s(__f, __l);
|
|
|
|
string __n;
|
|
|
|
__n.reserve(__s.size());
|
|
|
|
for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
|
|
|
|
__i != __e; ++__i)
|
|
|
|
{
|
|
|
|
if (static_cast<unsigned>(*__i) >= 127)
|
|
|
|
return string_type();
|
|
|
|
__n.push_back(char(*__i));
|
|
|
|
}
|
|
|
|
string_type __r;
|
|
|
|
if (!__s.empty())
|
|
|
|
{
|
|
|
|
__n = __get_collation_name(__n.c_str());
|
|
|
|
if (!__n.empty())
|
|
|
|
__r.assign(__n.begin(), __n.end());
|
|
|
|
else if (__s.size() <= 2)
|
|
|
|
{
|
|
|
|
__r = __col_->transform(__s.data(), __s.data() + __s.size());
|
|
|
|
if (__r.size() == 1 || __r.size() == 3)
|
|
|
|
__r = __s;
|
|
|
|
else
|
|
|
|
__r.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __r;
|
|
|
|
}
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2010-06-17 00:34:59 +00:00
|
|
|
|
2010-06-21 21:01:43 +00:00
|
|
|
// lookup_classname
|
|
|
|
|
2014-07-29 19:23:39 +00:00
|
|
|
regex_traits<char>::char_class_type _LIBCPP_FUNC_VIS
|
|
|
|
__get_classname(const char* __s, bool __icase);
|
2010-06-21 21:01:43 +00:00
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
typename regex_traits<_CharT>::char_class_type
|
|
|
|
regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
|
|
|
|
_ForwardIterator __l,
|
|
|
|
bool __icase, char) const
|
|
|
|
{
|
|
|
|
string_type __s(__f, __l);
|
|
|
|
__ct_->tolower(&__s[0], &__s[0] + __s.size());
|
|
|
|
return __get_classname(__s.c_str(), __icase);
|
|
|
|
}
|
|
|
|
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2010-06-21 21:01:43 +00:00
|
|
|
template <class _CharT>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
typename regex_traits<_CharT>::char_class_type
|
|
|
|
regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
|
|
|
|
_ForwardIterator __l,
|
|
|
|
bool __icase, wchar_t) const
|
|
|
|
{
|
|
|
|
string_type __s(__f, __l);
|
|
|
|
__ct_->tolower(&__s[0], &__s[0] + __s.size());
|
|
|
|
string __n;
|
|
|
|
__n.reserve(__s.size());
|
|
|
|
for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
|
|
|
|
__i != __e; ++__i)
|
|
|
|
{
|
|
|
|
if (static_cast<unsigned>(*__i) >= 127)
|
|
|
|
return char_class_type();
|
|
|
|
__n.push_back(char(*__i));
|
|
|
|
}
|
|
|
|
return __get_classname(__n.c_str(), __icase);
|
|
|
|
}
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2010-06-21 21:01:43 +00:00
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
bool
|
|
|
|
regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
|
|
|
|
{
|
|
|
|
if (__ct_->is(__m, __c))
|
|
|
|
return true;
|
|
|
|
return (__c == '_' && (__m & __regex_word));
|
|
|
|
}
|
|
|
|
|
2022-01-14 11:35:53 -05:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2022-07-08 18:17:26 +02:00
|
|
|
bool __is_07(unsigned char __c)
|
2022-01-14 11:35:53 -05:00
|
|
|
{
|
2022-07-08 18:17:26 +02:00
|
|
|
return (__c & 0xF8u) ==
|
2022-01-14 11:35:53 -05:00
|
|
|
#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
|
|
|
|
0xF0;
|
|
|
|
#else
|
|
|
|
0x30;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2022-07-08 18:17:26 +02:00
|
|
|
bool __is_89(unsigned char __c)
|
2022-01-14 11:35:53 -05:00
|
|
|
{
|
2022-07-08 18:17:26 +02:00
|
|
|
return (__c & 0xFEu) ==
|
2022-01-14 11:35:53 -05:00
|
|
|
#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
|
|
|
|
0xF8;
|
|
|
|
#else
|
|
|
|
0x38;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2022-07-08 18:17:26 +02:00
|
|
|
unsigned char __to_lower(unsigned char __c)
|
2022-01-14 11:35:53 -05:00
|
|
|
{
|
|
|
|
#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
|
|
|
|
return c & 0xBF;
|
|
|
|
#else
|
2022-07-08 18:17:26 +02:00
|
|
|
return __c | 0x20;
|
2022-01-14 11:35:53 -05:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2010-06-21 21:01:43 +00:00
|
|
|
template <class _CharT>
|
|
|
|
int
|
2013-10-21 15:43:25 +00:00
|
|
|
regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
|
2010-06-21 21:01:43 +00:00
|
|
|
{
|
2022-01-14 11:35:53 -05:00
|
|
|
if (__is_07(__ch)) // '0' <= __ch && __ch <= '7'
|
2010-06-21 21:01:43 +00:00
|
|
|
return __ch - '0';
|
|
|
|
if (__radix != 8)
|
|
|
|
{
|
2022-01-14 11:35:53 -05:00
|
|
|
if (__is_89(__ch)) // '8' <= __ch && __ch <= '9'
|
2010-06-21 21:01:43 +00:00
|
|
|
return __ch - '0';
|
|
|
|
if (__radix == 16)
|
|
|
|
{
|
2022-01-14 11:35:53 -05:00
|
|
|
__ch = __to_lower(__ch); // tolower
|
2010-06-21 21:01:43 +00:00
|
|
|
if ('a' <= __ch && __ch <= 'f')
|
2010-06-24 21:28:00 +00:00
|
|
|
return __ch - ('a' - 10);
|
2010-06-21 21:01:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2010-06-21 21:01:43 +00:00
|
|
|
template <class _CharT>
|
2015-11-07 01:22:13 +00:00
|
|
|
inline
|
2010-06-21 21:01:43 +00:00
|
|
|
int
|
2013-10-21 15:43:25 +00:00
|
|
|
regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
|
2010-06-21 21:01:43 +00:00
|
|
|
{
|
2013-10-21 15:43:25 +00:00
|
|
|
return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
|
2010-06-21 21:01:43 +00:00
|
|
|
}
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2010-06-21 21:01:43 +00:00
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
template <class _CharT> class __node;
|
|
|
|
|
2017-01-04 23:56:00 +00:00
|
|
|
template <class _BidirectionalIterator> class _LIBCPP_TEMPLATE_VIS sub_match;
|
2010-06-29 18:37:43 +00:00
|
|
|
|
2010-07-27 01:25:38 +00:00
|
|
|
template <class _BidirectionalIterator,
|
|
|
|
class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
|
2017-01-04 23:56:00 +00:00
|
|
|
class _LIBCPP_TEMPLATE_VIS match_results;
|
2010-07-27 01:25:38 +00:00
|
|
|
|
2010-06-29 18:37:43 +00:00
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
struct __state
|
2010-06-29 18:37:43 +00:00
|
|
|
{
|
|
|
|
enum
|
|
|
|
{
|
2010-07-07 19:14:52 +00:00
|
|
|
__end_state = -1000,
|
|
|
|
__consume_input, // -999
|
|
|
|
__begin_marked_expr, // -998
|
|
|
|
__end_marked_expr, // -997
|
2010-07-08 17:43:58 +00:00
|
|
|
__pop_state, // -996
|
2010-07-07 19:14:52 +00:00
|
|
|
__accept_and_consume, // -995
|
|
|
|
__accept_but_not_consume, // -994
|
|
|
|
__reject, // -993
|
2010-07-12 15:51:17 +00:00
|
|
|
__split,
|
|
|
|
__repeat
|
2010-06-29 18:37:43 +00:00
|
|
|
};
|
|
|
|
|
2010-07-07 19:14:52 +00:00
|
|
|
int __do_;
|
2010-07-12 15:51:17 +00:00
|
|
|
const _CharT* __first_;
|
|
|
|
const _CharT* __current_;
|
|
|
|
const _CharT* __last_;
|
|
|
|
vector<sub_match<const _CharT*> > __sub_matches_;
|
|
|
|
vector<pair<size_t, const _CharT*> > __loop_data_;
|
|
|
|
const __node<_CharT>* __node_;
|
|
|
|
regex_constants::match_flag_type __flags_;
|
2011-03-26 20:02:27 +00:00
|
|
|
bool __at_first_;
|
2010-07-12 15:51:17 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
__state()
|
|
|
|
: __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
|
|
|
|
__node_(nullptr), __flags_() {}
|
2010-07-07 19:14:52 +00:00
|
|
|
};
|
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
// __node
|
2010-07-07 19:14:52 +00:00
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
class __node
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
__node(const __node&);
|
|
|
|
__node& operator=(const __node&);
|
2010-06-29 18:37:43 +00:00
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
__node() {}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
virtual ~__node() {}
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2018-10-01 01:59:37 +00:00
|
|
|
virtual void __exec(__state&) const {}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2018-10-01 01:59:37 +00:00
|
|
|
virtual void __exec_split(bool, __state&) const {}
|
2010-07-07 19:14:52 +00:00
|
|
|
};
|
2010-06-29 18:37:43 +00:00
|
|
|
|
2010-07-07 19:14:52 +00:00
|
|
|
// __end_state
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
class __end_state
|
2010-07-12 15:51:17 +00:00
|
|
|
: public __node<_CharT>
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-06-29 18:37:43 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-07 19:14:52 +00:00
|
|
|
__end_state() {}
|
2010-06-30 17:22:19 +00:00
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
virtual void __exec(__state&) const;
|
2010-06-29 18:37:43 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
void
|
|
|
|
__end_state<_CharT>::__exec(__state& __s) const
|
2010-06-29 18:37:43 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
__s.__do_ = __state::__end_state;
|
2010-06-29 18:37:43 +00:00
|
|
|
}
|
|
|
|
|
2010-07-07 19:14:52 +00:00
|
|
|
// __has_one_state
|
|
|
|
|
2010-06-29 18:37:43 +00:00
|
|
|
template <class _CharT>
|
2010-07-07 19:14:52 +00:00
|
|
|
class __has_one_state
|
2010-07-12 15:51:17 +00:00
|
|
|
: public __node<_CharT>
|
2010-06-29 18:37:43 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
__node<_CharT>* __first_;
|
2010-07-07 19:14:52 +00:00
|
|
|
|
|
|
|
public:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
explicit __has_one_state(__node<_CharT>* __s)
|
2010-07-07 19:14:52 +00:00
|
|
|
: __first_(__s) {}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
__node<_CharT>* first() const {return __first_;}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
__node<_CharT>*& first() {return __first_;}
|
2010-07-07 19:14:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// __owns_one_state
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
class __owns_one_state
|
|
|
|
: public __has_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __has_one_state<_CharT> base;
|
|
|
|
|
|
|
|
public:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
explicit __owns_one_state(__node<_CharT>* __s)
|
2010-07-07 19:14:52 +00:00
|
|
|
: base(__s) {}
|
|
|
|
|
|
|
|
virtual ~__owns_one_state();
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
__owns_one_state<_CharT>::~__owns_one_state()
|
|
|
|
{
|
|
|
|
delete this->first();
|
2010-06-29 18:37:43 +00:00
|
|
|
}
|
|
|
|
|
2010-07-07 19:14:52 +00:00
|
|
|
// __empty_state
|
|
|
|
|
2010-06-30 17:22:19 +00:00
|
|
|
template <class _CharT>
|
2010-07-07 19:14:52 +00:00
|
|
|
class __empty_state
|
|
|
|
: public __owns_one_state<_CharT>
|
2010-06-30 17:22:19 +00:00
|
|
|
{
|
2010-07-07 19:14:52 +00:00
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
explicit __empty_state(__node<_CharT>* __s)
|
2010-07-07 19:14:52 +00:00
|
|
|
: base(__s) {}
|
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
virtual void __exec(__state&) const;
|
2010-07-07 19:14:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
void
|
|
|
|
__empty_state<_CharT>::__exec(__state& __s) const
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->first();
|
2010-06-30 17:22:19 +00:00
|
|
|
}
|
|
|
|
|
2010-07-07 19:14:52 +00:00
|
|
|
// __empty_non_own_state
|
|
|
|
|
2010-06-29 18:37:43 +00:00
|
|
|
template <class _CharT>
|
2010-07-07 19:14:52 +00:00
|
|
|
class __empty_non_own_state
|
|
|
|
: public __has_one_state<_CharT>
|
2010-06-29 18:37:43 +00:00
|
|
|
{
|
2010-07-07 19:14:52 +00:00
|
|
|
typedef __has_one_state<_CharT> base;
|
2010-06-29 18:37:43 +00:00
|
|
|
|
2010-07-07 19:14:52 +00:00
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
explicit __empty_non_own_state(__node<_CharT>* __s)
|
2010-07-07 19:14:52 +00:00
|
|
|
: base(__s) {}
|
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
virtual void __exec(__state&) const;
|
2010-07-07 19:14:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
void
|
|
|
|
__empty_non_own_state<_CharT>::__exec(__state& __s) const
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
|
|
|
|
|
|
|
// __repeat_one_loop
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
class __repeat_one_loop
|
|
|
|
: public __has_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __has_one_state<_CharT> base;
|
|
|
|
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-12 15:51:17 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
explicit __repeat_one_loop(__node<_CharT>* __s)
|
|
|
|
: base(__s) {}
|
|
|
|
|
|
|
|
virtual void __exec(__state&) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
void
|
|
|
|
__repeat_one_loop<_CharT>::__exec(__state& __s) const
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
__s.__do_ = __state::__repeat;
|
|
|
|
__s.__node_ = this->first();
|
2010-07-07 19:14:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// __owns_two_states
|
2010-06-29 18:37:43 +00:00
|
|
|
|
2010-07-07 19:14:52 +00:00
|
|
|
template <class _CharT>
|
|
|
|
class __owns_two_states
|
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
base* __second_;
|
2010-06-29 18:37:43 +00:00
|
|
|
|
|
|
|
public:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
|
2010-07-07 19:14:52 +00:00
|
|
|
: base(__s1), __second_(__s2) {}
|
2010-06-29 18:37:43 +00:00
|
|
|
|
2010-07-07 19:14:52 +00:00
|
|
|
virtual ~__owns_two_states();
|
2010-06-30 17:22:19 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-07 19:14:52 +00:00
|
|
|
base* second() const {return __second_;}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-07 19:14:52 +00:00
|
|
|
base*& second() {return __second_;}
|
2010-06-29 18:37:43 +00:00
|
|
|
};
|
|
|
|
|
2010-06-30 20:30:19 +00:00
|
|
|
template <class _CharT>
|
2010-07-07 19:14:52 +00:00
|
|
|
__owns_two_states<_CharT>::~__owns_two_states()
|
2010-06-30 20:30:19 +00:00
|
|
|
{
|
2010-07-07 19:14:52 +00:00
|
|
|
delete __second_;
|
2010-06-30 20:30:19 +00:00
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
|
|
|
|
// __loop
|
|
|
|
|
2010-06-30 17:22:19 +00:00
|
|
|
template <class _CharT>
|
2010-07-07 19:14:52 +00:00
|
|
|
class __loop
|
|
|
|
: public __owns_two_states<_CharT>
|
2010-06-30 17:22:19 +00:00
|
|
|
{
|
2010-07-07 19:14:52 +00:00
|
|
|
typedef __owns_two_states<_CharT> base;
|
|
|
|
|
|
|
|
size_t __min_;
|
|
|
|
size_t __max_;
|
|
|
|
unsigned __loop_id_;
|
2010-07-12 15:51:17 +00:00
|
|
|
unsigned __mexp_begin_;
|
|
|
|
unsigned __mexp_end_;
|
2010-07-07 19:14:52 +00:00
|
|
|
bool __greedy_;
|
|
|
|
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-07 19:14:52 +00:00
|
|
|
explicit __loop(unsigned __loop_id,
|
2010-07-12 15:51:17 +00:00
|
|
|
__node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
|
|
|
|
unsigned __mexp_begin, unsigned __mexp_end,
|
2010-07-07 19:14:52 +00:00
|
|
|
bool __greedy = true,
|
|
|
|
size_t __min = 0,
|
|
|
|
size_t __max = numeric_limits<size_t>::max())
|
|
|
|
: base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
|
2010-07-12 15:51:17 +00:00
|
|
|
__mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
|
2010-07-07 19:14:52 +00:00
|
|
|
__greedy_(__greedy) {}
|
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
virtual void __exec(__state& __s) const;
|
|
|
|
virtual void __exec_split(bool __second, __state& __s) const;
|
2010-07-08 17:43:58 +00:00
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
private:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
void __init_repeat(__state& __s) const
|
2010-07-08 17:43:58 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
__s.__loop_data_[__loop_id_].second = __s.__current_;
|
|
|
|
for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
|
|
|
|
{
|
|
|
|
__s.__sub_matches_[__i].first = __s.__last_;
|
|
|
|
__s.__sub_matches_[__i].second = __s.__last_;
|
|
|
|
__s.__sub_matches_[__i].matched = false;
|
|
|
|
}
|
2010-07-08 17:43:58 +00:00
|
|
|
}
|
2010-06-30 20:30:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
void
|
|
|
|
__loop<_CharT>::__exec(__state& __s) const
|
2010-06-30 20:30:19 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
if (__s.__do_ == __state::__repeat)
|
|
|
|
{
|
|
|
|
bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
|
|
|
|
bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
|
|
|
|
if (__do_repeat && __do_alt &&
|
|
|
|
__s.__loop_data_[__loop_id_].second == __s.__current_)
|
|
|
|
__do_repeat = false;
|
|
|
|
if (__do_repeat && __do_alt)
|
|
|
|
__s.__do_ = __state::__split;
|
|
|
|
else if (__do_repeat)
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
__init_repeat(__s);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->second();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-07-27 17:24:17 +00:00
|
|
|
__s.__loop_data_[__loop_id_].first = 0;
|
|
|
|
bool __do_repeat = 0 < __max_;
|
|
|
|
bool __do_alt = 0 >= __min_;
|
|
|
|
if (__do_repeat && __do_alt)
|
2010-07-12 15:51:17 +00:00
|
|
|
__s.__do_ = __state::__split;
|
2010-07-27 17:24:17 +00:00
|
|
|
else if (__do_repeat)
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
__init_repeat(__s);
|
|
|
|
}
|
2010-07-12 15:51:17 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->second();
|
|
|
|
}
|
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
void
|
|
|
|
__loop<_CharT>::__exec_split(bool __second, __state& __s) const
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
if (__greedy_ != __second)
|
2010-07-08 17:43:58 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
__s.__node_ = this->first();
|
|
|
|
__init_repeat(__s);
|
2010-07-08 17:43:58 +00:00
|
|
|
}
|
2010-07-12 15:51:17 +00:00
|
|
|
else
|
|
|
|
__s.__node_ = this->second();
|
2010-07-07 19:14:52 +00:00
|
|
|
}
|
|
|
|
|
2010-07-16 19:08:36 +00:00
|
|
|
// __alternate
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
class __alternate
|
|
|
|
: public __owns_two_states<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_two_states<_CharT> base;
|
|
|
|
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-16 19:08:36 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-16 19:08:36 +00:00
|
|
|
explicit __alternate(__owns_one_state<_CharT>* __s1,
|
|
|
|
__owns_one_state<_CharT>* __s2)
|
|
|
|
: base(__s1, __s2) {}
|
|
|
|
|
|
|
|
virtual void __exec(__state& __s) const;
|
|
|
|
virtual void __exec_split(bool __second, __state& __s) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
void
|
|
|
|
__alternate<_CharT>::__exec(__state& __s) const
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__split;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
void
|
|
|
|
__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
2010-07-22 14:12:20 +00:00
|
|
|
if (__second)
|
2010-07-16 19:08:36 +00:00
|
|
|
__s.__node_ = this->second();
|
2010-07-22 14:12:20 +00:00
|
|
|
else
|
|
|
|
__s.__node_ = this->first();
|
2010-07-16 19:08:36 +00:00
|
|
|
}
|
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
// __begin_marked_subexpression
|
2010-07-07 19:14:52 +00:00
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
class __begin_marked_subexpression
|
2010-07-07 19:14:52 +00:00
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
unsigned __mexp_;
|
2010-07-07 19:14:52 +00:00
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
|
|
|
|
: base(__s), __mexp_(__mexp) {}
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
virtual void __exec(__state&) const;
|
2010-07-07 19:14:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
void
|
|
|
|
__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__sub_matches_[__mexp_-1].first = __s.__current_;
|
|
|
|
__s.__node_ = this->first();
|
2010-06-30 20:30:19 +00:00
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
// __end_marked_subexpression
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-06-30 20:30:19 +00:00
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
class __end_marked_subexpression
|
2010-07-07 19:14:52 +00:00
|
|
|
: public __owns_one_state<_CharT>
|
2010-06-30 20:30:19 +00:00
|
|
|
{
|
2010-07-07 19:14:52 +00:00
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
2010-07-08 17:43:58 +00:00
|
|
|
unsigned __mexp_;
|
2010-06-30 20:30:19 +00:00
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-06-30 20:30:19 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
|
2010-07-08 17:43:58 +00:00
|
|
|
: base(__s), __mexp_(__mexp) {}
|
2010-06-30 20:30:19 +00:00
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
virtual void __exec(__state&) const;
|
2010-06-30 20:30:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
void
|
|
|
|
__end_marked_subexpression<_CharT>::__exec(__state& __s) const
|
2010-06-30 20:30:19 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__sub_matches_[__mexp_-1].second = __s.__current_;
|
|
|
|
__s.__sub_matches_[__mexp_-1].matched = true;
|
|
|
|
__s.__node_ = this->first();
|
2010-06-30 20:30:19 +00:00
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-07-12 18:16:05 +00:00
|
|
|
// __back_ref
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
class __back_ref
|
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
unsigned __mexp_;
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-12 18:16:05 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 18:16:05 +00:00
|
|
|
explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
|
|
|
|
: base(__s), __mexp_(__mexp) {}
|
|
|
|
|
|
|
|
virtual void __exec(__state&) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
void
|
|
|
|
__back_ref<_CharT>::__exec(__state& __s) const
|
|
|
|
{
|
2015-08-24 15:57:09 +00:00
|
|
|
if (__mexp_ > __s.__sub_matches_.size())
|
|
|
|
__throw_regex_error<regex_constants::error_backref>();
|
2010-07-12 18:16:05 +00:00
|
|
|
sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
|
|
|
|
if (__sm.matched)
|
|
|
|
{
|
|
|
|
ptrdiff_t __len = __sm.second - __sm.first;
|
|
|
|
if (__s.__last_ - __s.__current_ >= __len &&
|
2011-06-30 21:18:19 +00:00
|
|
|
_VSTD::equal(__sm.first, __sm.second, __s.__current_))
|
2010-07-12 18:16:05 +00:00
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__current_ += __len;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-07-12 19:11:27 +00:00
|
|
|
// __back_ref_icase
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
class __back_ref_icase
|
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
_Traits __traits_;
|
|
|
|
unsigned __mexp_;
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-12 19:11:27 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 19:11:27 +00:00
|
|
|
explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
|
|
|
|
__node<_CharT>* __s)
|
|
|
|
: base(__s), __traits_(__traits), __mexp_(__mexp) {}
|
|
|
|
|
|
|
|
virtual void __exec(__state&) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
|
|
|
|
{
|
|
|
|
sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
|
|
|
|
if (__sm.matched)
|
|
|
|
{
|
|
|
|
ptrdiff_t __len = __sm.second - __sm.first;
|
|
|
|
if (__s.__last_ - __s.__current_ >= __len)
|
|
|
|
{
|
|
|
|
for (ptrdiff_t __i = 0; __i < __len; ++__i)
|
|
|
|
{
|
|
|
|
if (__traits_.translate_nocase(__sm.first[__i]) !=
|
|
|
|
__traits_.translate_nocase(__s.__current_[__i]))
|
|
|
|
goto __not_equal;
|
|
|
|
}
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__current_ += __len;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__not_equal:
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// __back_ref_collate
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
class __back_ref_collate
|
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
_Traits __traits_;
|
|
|
|
unsigned __mexp_;
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-12 19:11:27 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 19:11:27 +00:00
|
|
|
explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
|
|
|
|
__node<_CharT>* __s)
|
|
|
|
: base(__s), __traits_(__traits), __mexp_(__mexp) {}
|
|
|
|
|
|
|
|
virtual void __exec(__state&) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
|
|
|
|
{
|
|
|
|
sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
|
|
|
|
if (__sm.matched)
|
|
|
|
{
|
|
|
|
ptrdiff_t __len = __sm.second - __sm.first;
|
|
|
|
if (__s.__last_ - __s.__current_ >= __len)
|
|
|
|
{
|
|
|
|
for (ptrdiff_t __i = 0; __i < __len; ++__i)
|
|
|
|
{
|
|
|
|
if (__traits_.translate(__sm.first[__i]) !=
|
|
|
|
__traits_.translate(__s.__current_[__i]))
|
|
|
|
goto __not_equal;
|
|
|
|
}
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__current_ += __len;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__not_equal:
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-07-27 01:25:38 +00:00
|
|
|
// __word_boundary
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
class __word_boundary
|
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
_Traits __traits_;
|
|
|
|
bool __invert_;
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-27 01:25:38 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-27 01:25:38 +00:00
|
|
|
explicit __word_boundary(const _Traits& __traits, bool __invert,
|
|
|
|
__node<_CharT>* __s)
|
|
|
|
: base(__s), __traits_(__traits), __invert_(__invert) {}
|
|
|
|
|
|
|
|
virtual void __exec(__state&) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
|
|
|
|
{
|
|
|
|
bool __is_word_b = false;
|
|
|
|
if (__s.__first_ != __s.__last_)
|
|
|
|
{
|
|
|
|
if (__s.__current_ == __s.__last_)
|
|
|
|
{
|
|
|
|
if (!(__s.__flags_ & regex_constants::match_not_eow))
|
|
|
|
{
|
|
|
|
_CharT __c = __s.__current_[-1];
|
|
|
|
__is_word_b = __c == '_' ||
|
|
|
|
__traits_.isctype(__c, ctype_base::alnum);
|
|
|
|
}
|
|
|
|
}
|
2010-07-29 15:17:28 +00:00
|
|
|
else if (__s.__current_ == __s.__first_ &&
|
|
|
|
!(__s.__flags_ & regex_constants::match_prev_avail))
|
2010-07-27 01:25:38 +00:00
|
|
|
{
|
|
|
|
if (!(__s.__flags_ & regex_constants::match_not_bow))
|
|
|
|
{
|
|
|
|
_CharT __c = *__s.__current_;
|
|
|
|
__is_word_b = __c == '_' ||
|
|
|
|
__traits_.isctype(__c, ctype_base::alnum);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_CharT __c1 = __s.__current_[-1];
|
|
|
|
_CharT __c2 = *__s.__current_;
|
|
|
|
bool __is_c1_b = __c1 == '_' ||
|
|
|
|
__traits_.isctype(__c1, ctype_base::alnum);
|
|
|
|
bool __is_c2_b = __c2 == '_' ||
|
|
|
|
__traits_.isctype(__c2, ctype_base::alnum);
|
|
|
|
__is_word_b = __is_c1_b != __is_c2_b;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (__is_word_b != __invert_)
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-03-26 20:02:27 +00:00
|
|
|
// __l_anchor
|
|
|
|
|
|
|
|
template <class _CharT>
|
2020-11-18 18:09:13 +01:00
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
2022-07-08 18:17:26 +02:00
|
|
|
bool __is_eol(_CharT __c)
|
2020-11-18 18:09:13 +01:00
|
|
|
{
|
2022-07-08 18:17:26 +02:00
|
|
|
return __c == '\r' || __c == '\n';
|
2020-11-18 18:09:13 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
class __l_anchor_multiline
|
2011-03-26 20:02:27 +00:00
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
2021-07-27 17:30:47 -04:00
|
|
|
bool __multiline_;
|
2020-11-18 18:09:13 +01:00
|
|
|
|
2011-03-26 20:02:27 +00:00
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2011-03-26 20:02:27 +00:00
|
|
|
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2020-11-18 18:09:13 +01:00
|
|
|
__l_anchor_multiline(bool __multiline, __node<_CharT>* __s)
|
2021-07-27 17:30:47 -04:00
|
|
|
: base(__s), __multiline_(__multiline) {}
|
2011-03-26 20:02:27 +00:00
|
|
|
|
|
|
|
virtual void __exec(__state&) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
void
|
2020-11-18 18:09:13 +01:00
|
|
|
__l_anchor_multiline<_CharT>::__exec(__state& __s) const
|
2011-03-26 20:02:27 +00:00
|
|
|
{
|
2015-03-19 17:05:59 +00:00
|
|
|
if (__s.__at_first_ && __s.__current_ == __s.__first_ &&
|
|
|
|
!(__s.__flags_ & regex_constants::match_not_bol))
|
2011-03-26 20:02:27 +00:00
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
2021-07-27 17:30:47 -04:00
|
|
|
else if (__multiline_ &&
|
2020-11-18 18:09:13 +01:00
|
|
|
!__s.__at_first_ &&
|
|
|
|
__is_eol(*_VSTD::prev(__s.__current_)))
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
2011-03-26 20:02:27 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
// __r_anchor
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-06-30 20:30:19 +00:00
|
|
|
template <class _CharT>
|
2020-11-18 18:09:13 +01:00
|
|
|
class __r_anchor_multiline
|
2010-07-07 19:14:52 +00:00
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
2022-03-03 13:39:12 -05:00
|
|
|
bool __multiline_;
|
2020-11-18 18:09:13 +01:00
|
|
|
|
2010-07-07 19:14:52 +00:00
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2020-11-18 18:09:13 +01:00
|
|
|
__r_anchor_multiline(bool __multiline, __node<_CharT>* __s)
|
2022-03-03 13:39:12 -05:00
|
|
|
: base(__s), __multiline_(__multiline) {}
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
virtual void __exec(__state&) const;
|
2010-07-07 19:14:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
void
|
2020-11-18 18:09:13 +01:00
|
|
|
__r_anchor_multiline<_CharT>::__exec(__state& __s) const
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
2015-03-19 17:05:59 +00:00
|
|
|
if (__s.__current_ == __s.__last_ &&
|
|
|
|
!(__s.__flags_ & regex_constants::match_not_eol))
|
2010-07-12 15:51:17 +00:00
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
2022-03-03 13:39:12 -05:00
|
|
|
else if (__multiline_ && __is_eol(*__s.__current_))
|
2020-11-18 18:09:13 +01:00
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
2010-07-12 15:51:17 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
}
|
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
// __match_any
|
2010-07-07 19:14:52 +00:00
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
class __match_any
|
2010-07-07 19:14:52 +00:00
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
__match_any(__node<_CharT>* __s)
|
2010-07-09 00:15:26 +00:00
|
|
|
: base(__s) {}
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
virtual void __exec(__state&) const;
|
2010-07-07 19:14:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
void
|
|
|
|
__match_any<_CharT>::__exec(__state& __s) const
|
2010-06-30 20:30:19 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_and_consume;
|
|
|
|
++__s.__current_;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
}
|
|
|
|
|
2010-07-27 01:25:38 +00:00
|
|
|
// __match_any_but_newline
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
class __match_any_but_newline
|
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-27 01:25:38 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-27 01:25:38 +00:00
|
|
|
__match_any_but_newline(__node<_CharT>* __s)
|
|
|
|
: base(__s) {}
|
|
|
|
|
|
|
|
virtual void __exec(__state&) const;
|
|
|
|
};
|
|
|
|
|
2013-08-12 18:38:34 +00:00
|
|
|
template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2013-08-12 18:38:34 +00:00
|
|
|
template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2013-08-12 18:38:34 +00:00
|
|
|
|
2010-07-07 19:14:52 +00:00
|
|
|
// __match_char
|
|
|
|
|
|
|
|
template <class _CharT>
|
|
|
|
class __match_char
|
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
_CharT __c_;
|
|
|
|
|
|
|
|
__match_char(const __match_char&);
|
|
|
|
__match_char& operator=(const __match_char&);
|
2010-06-30 20:30:19 +00:00
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-06-30 20:30:19 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 15:51:17 +00:00
|
|
|
__match_char(_CharT __c, __node<_CharT>* __s)
|
2010-07-07 19:14:52 +00:00
|
|
|
: base(__s), __c_(__c) {}
|
2010-06-30 20:30:19 +00:00
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
virtual void __exec(__state&) const;
|
2010-06-29 18:37:43 +00:00
|
|
|
};
|
|
|
|
|
2010-06-30 20:30:19 +00:00
|
|
|
template <class _CharT>
|
2010-07-12 15:51:17 +00:00
|
|
|
void
|
|
|
|
__match_char<_CharT>::__exec(__state& __s) const
|
2010-06-30 20:30:19 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_and_consume;
|
|
|
|
++__s.__current_;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
2010-06-30 20:30:19 +00:00
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2010-07-12 19:11:27 +00:00
|
|
|
// __match_char_icase
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
class __match_char_icase
|
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
_Traits __traits_;
|
|
|
|
_CharT __c_;
|
|
|
|
|
|
|
|
__match_char_icase(const __match_char_icase&);
|
|
|
|
__match_char_icase& operator=(const __match_char_icase&);
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-12 19:11:27 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 19:11:27 +00:00
|
|
|
__match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
|
|
|
|
: base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
|
|
|
|
|
|
|
|
virtual void __exec(__state&) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
|
|
|
|
{
|
|
|
|
if (__s.__current_ != __s.__last_ &&
|
|
|
|
__traits_.translate_nocase(*__s.__current_) == __c_)
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_and_consume;
|
|
|
|
++__s.__current_;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// __match_char_collate
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
class __match_char_collate
|
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
_Traits __traits_;
|
|
|
|
_CharT __c_;
|
|
|
|
|
|
|
|
__match_char_collate(const __match_char_collate&);
|
|
|
|
__match_char_collate& operator=(const __match_char_collate&);
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-12 19:11:27 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-12 19:11:27 +00:00
|
|
|
__match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
|
|
|
|
: base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
|
|
|
|
|
|
|
|
virtual void __exec(__state&) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
|
|
|
|
{
|
|
|
|
if (__s.__current_ != __s.__last_ &&
|
|
|
|
__traits_.translate(*__s.__current_) == __c_)
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_and_consume;
|
|
|
|
++__s.__current_;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-07-13 21:48:06 +00:00
|
|
|
// __bracket_expression
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
class __bracket_expression
|
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
typedef typename _Traits::string_type string_type;
|
|
|
|
|
|
|
|
_Traits __traits_;
|
|
|
|
vector<_CharT> __chars_;
|
2010-07-28 17:35:27 +00:00
|
|
|
vector<_CharT> __neg_chars_;
|
2010-07-13 21:48:06 +00:00
|
|
|
vector<pair<string_type, string_type> > __ranges_;
|
|
|
|
vector<pair<_CharT, _CharT> > __digraphs_;
|
|
|
|
vector<string_type> __equivalences_;
|
2014-07-29 19:23:39 +00:00
|
|
|
typename regex_traits<_CharT>::char_class_type __mask_;
|
|
|
|
typename regex_traits<_CharT>::char_class_type __neg_mask_;
|
2010-07-13 21:48:06 +00:00
|
|
|
bool __negate_;
|
|
|
|
bool __icase_;
|
|
|
|
bool __collate_;
|
2010-07-14 15:45:11 +00:00
|
|
|
bool __might_have_digraph_;
|
2010-07-13 21:48:06 +00:00
|
|
|
|
|
|
|
__bracket_expression(const __bracket_expression&);
|
|
|
|
__bracket_expression& operator=(const __bracket_expression&);
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-13 21:48:06 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-13 21:48:06 +00:00
|
|
|
__bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
|
|
|
|
bool __negate, bool __icase, bool __collate)
|
2010-07-28 17:35:27 +00:00
|
|
|
: base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
|
|
|
|
__negate_(__negate), __icase_(__icase), __collate_(__collate),
|
2010-07-14 15:45:11 +00:00
|
|
|
__might_have_digraph_(__traits_.getloc().name() != "C") {}
|
2010-07-13 21:48:06 +00:00
|
|
|
|
|
|
|
virtual void __exec(__state&) const;
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-28 17:35:27 +00:00
|
|
|
bool __negated() const {return __negate_;}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-13 21:48:06 +00:00
|
|
|
void __add_char(_CharT __c)
|
|
|
|
{
|
|
|
|
if (__icase_)
|
|
|
|
__chars_.push_back(__traits_.translate_nocase(__c));
|
|
|
|
else if (__collate_)
|
|
|
|
__chars_.push_back(__traits_.translate(__c));
|
|
|
|
else
|
|
|
|
__chars_.push_back(__c);
|
|
|
|
}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-28 17:35:27 +00:00
|
|
|
void __add_neg_char(_CharT __c)
|
|
|
|
{
|
|
|
|
if (__icase_)
|
|
|
|
__neg_chars_.push_back(__traits_.translate_nocase(__c));
|
|
|
|
else if (__collate_)
|
|
|
|
__neg_chars_.push_back(__traits_.translate(__c));
|
|
|
|
else
|
|
|
|
__neg_chars_.push_back(__c);
|
|
|
|
}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-13 21:48:06 +00:00
|
|
|
void __add_range(string_type __b, string_type __e)
|
|
|
|
{
|
|
|
|
if (__collate_)
|
|
|
|
{
|
|
|
|
if (__icase_)
|
|
|
|
{
|
|
|
|
for (size_t __i = 0; __i < __b.size(); ++__i)
|
|
|
|
__b[__i] = __traits_.translate_nocase(__b[__i]);
|
|
|
|
for (size_t __i = 0; __i < __e.size(); ++__i)
|
|
|
|
__e[__i] = __traits_.translate_nocase(__e[__i]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (size_t __i = 0; __i < __b.size(); ++__i)
|
|
|
|
__b[__i] = __traits_.translate(__b[__i]);
|
|
|
|
for (size_t __i = 0; __i < __e.size(); ++__i)
|
|
|
|
__e[__i] = __traits_.translate(__e[__i]);
|
|
|
|
}
|
|
|
|
__ranges_.push_back(make_pair(
|
|
|
|
__traits_.transform(__b.begin(), __b.end()),
|
|
|
|
__traits_.transform(__e.begin(), __e.end())));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (__b.size() != 1 || __e.size() != 1)
|
2019-05-28 22:42:32 +00:00
|
|
|
__throw_regex_error<regex_constants::error_range>();
|
2010-07-13 21:48:06 +00:00
|
|
|
if (__icase_)
|
|
|
|
{
|
|
|
|
__b[0] = __traits_.translate_nocase(__b[0]);
|
|
|
|
__e[0] = __traits_.translate_nocase(__e[0]);
|
|
|
|
}
|
2011-06-30 21:18:19 +00:00
|
|
|
__ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
|
2010-07-13 21:48:06 +00:00
|
|
|
}
|
|
|
|
}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-13 21:48:06 +00:00
|
|
|
void __add_digraph(_CharT __c1, _CharT __c2)
|
|
|
|
{
|
|
|
|
if (__icase_)
|
|
|
|
__digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
|
|
|
|
__traits_.translate_nocase(__c2)));
|
|
|
|
else if (__collate_)
|
|
|
|
__digraphs_.push_back(make_pair(__traits_.translate(__c1),
|
|
|
|
__traits_.translate(__c2)));
|
|
|
|
else
|
|
|
|
__digraphs_.push_back(make_pair(__c1, __c2));
|
|
|
|
}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-13 21:48:06 +00:00
|
|
|
void __add_equivalence(const string_type& __s)
|
|
|
|
{__equivalences_.push_back(__s);}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2014-07-29 19:23:39 +00:00
|
|
|
void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
|
2010-07-13 21:48:06 +00:00
|
|
|
{__mask_ |= __mask;}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2014-07-29 19:23:39 +00:00
|
|
|
void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
|
2010-07-28 17:35:27 +00:00
|
|
|
{__neg_mask_ |= __mask;}
|
2010-07-13 21:48:06 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
|
|
|
|
{
|
|
|
|
bool __found = false;
|
|
|
|
unsigned __consumed = 0;
|
|
|
|
if (__s.__current_ != __s.__last_)
|
|
|
|
{
|
|
|
|
++__consumed;
|
2010-07-14 15:45:11 +00:00
|
|
|
if (__might_have_digraph_)
|
2010-07-13 21:48:06 +00:00
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
const _CharT* __next = _VSTD::next(__s.__current_);
|
2010-07-14 15:45:11 +00:00
|
|
|
if (__next != __s.__last_)
|
2010-07-13 21:48:06 +00:00
|
|
|
{
|
2010-07-14 15:45:11 +00:00
|
|
|
pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
|
|
|
|
if (__icase_)
|
2010-07-13 21:48:06 +00:00
|
|
|
{
|
2010-07-14 15:45:11 +00:00
|
|
|
__ch2.first = __traits_.translate_nocase(__ch2.first);
|
|
|
|
__ch2.second = __traits_.translate_nocase(__ch2.second);
|
|
|
|
}
|
|
|
|
else if (__collate_)
|
|
|
|
{
|
|
|
|
__ch2.first = __traits_.translate(__ch2.first);
|
|
|
|
__ch2.second = __traits_.translate(__ch2.second);
|
2010-07-13 21:48:06 +00:00
|
|
|
}
|
2010-07-14 15:45:11 +00:00
|
|
|
if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
|
2010-07-13 21:48:06 +00:00
|
|
|
{
|
2010-07-14 15:45:11 +00:00
|
|
|
// __ch2 is a digraph in this locale
|
|
|
|
++__consumed;
|
|
|
|
for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
|
2010-07-13 21:48:06 +00:00
|
|
|
{
|
2010-07-14 15:45:11 +00:00
|
|
|
if (__ch2 == __digraphs_[__i])
|
2010-07-13 21:48:06 +00:00
|
|
|
{
|
|
|
|
__found = true;
|
|
|
|
goto __exit;
|
|
|
|
}
|
|
|
|
}
|
2010-07-14 15:45:11 +00:00
|
|
|
if (__collate_ && !__ranges_.empty())
|
2010-07-13 21:48:06 +00:00
|
|
|
{
|
2010-07-14 15:45:11 +00:00
|
|
|
string_type __s2 = __traits_.transform(&__ch2.first,
|
|
|
|
&__ch2.first + 2);
|
|
|
|
for (size_t __i = 0; __i < __ranges_.size(); ++__i)
|
2010-07-13 21:48:06 +00:00
|
|
|
{
|
2010-07-14 15:45:11 +00:00
|
|
|
if (__ranges_[__i].first <= __s2 &&
|
|
|
|
__s2 <= __ranges_[__i].second)
|
|
|
|
{
|
|
|
|
__found = true;
|
|
|
|
goto __exit;
|
|
|
|
}
|
2010-07-13 21:48:06 +00:00
|
|
|
}
|
|
|
|
}
|
2010-07-14 15:45:11 +00:00
|
|
|
if (!__equivalences_.empty())
|
|
|
|
{
|
|
|
|
string_type __s2 = __traits_.transform_primary(&__ch2.first,
|
|
|
|
&__ch2.first + 2);
|
|
|
|
for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
|
|
|
|
{
|
|
|
|
if (__s2 == __equivalences_[__i])
|
|
|
|
{
|
|
|
|
__found = true;
|
|
|
|
goto __exit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (__traits_.isctype(__ch2.first, __mask_) &&
|
|
|
|
__traits_.isctype(__ch2.second, __mask_))
|
|
|
|
{
|
|
|
|
__found = true;
|
|
|
|
goto __exit;
|
|
|
|
}
|
2010-07-28 17:35:27 +00:00
|
|
|
if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
|
|
|
|
!__traits_.isctype(__ch2.second, __neg_mask_))
|
|
|
|
{
|
|
|
|
__found = true;
|
|
|
|
goto __exit;
|
|
|
|
}
|
2010-07-13 21:48:06 +00:00
|
|
|
goto __exit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// test *__s.__current_ as not a digraph
|
|
|
|
_CharT __ch = *__s.__current_;
|
|
|
|
if (__icase_)
|
|
|
|
__ch = __traits_.translate_nocase(__ch);
|
|
|
|
else if (__collate_)
|
|
|
|
__ch = __traits_.translate(__ch);
|
|
|
|
for (size_t __i = 0; __i < __chars_.size(); ++__i)
|
|
|
|
{
|
|
|
|
if (__ch == __chars_[__i])
|
|
|
|
{
|
|
|
|
__found = true;
|
|
|
|
goto __exit;
|
|
|
|
}
|
|
|
|
}
|
2018-08-24 14:10:28 +00:00
|
|
|
// When there's at least one of __neg_chars_ and __neg_mask_, the set
|
|
|
|
// of "__found" chars is
|
2017-10-18 16:49:22 +00:00
|
|
|
// union(complement(union(__neg_chars_, __neg_mask_)),
|
|
|
|
// other cases...)
|
|
|
|
//
|
2018-08-24 14:10:28 +00:00
|
|
|
// It doesn't make sense to check this when there are no __neg_chars_
|
|
|
|
// and no __neg_mask_.
|
|
|
|
if (!(__neg_mask_ == 0 && __neg_chars_.empty()))
|
2010-07-28 17:35:27 +00:00
|
|
|
{
|
2018-08-24 14:10:28 +00:00
|
|
|
const bool __in_neg_mask = __traits_.isctype(__ch, __neg_mask_);
|
2017-10-18 16:49:22 +00:00
|
|
|
const bool __in_neg_chars =
|
[libc++] Consistently replace `std::` qualification with `_VSTD::` or nothing. NFCI.
I used a lot of `git grep` to find places where `std::` was being used
outside of comments and assert-messages. There were three outcomes:
- Qualified function calls, e.g. `std::move` becomes `_VSTD::move`.
This is the most common case.
- Typenames that don't need qualification, e.g. `std::allocator` becomes `allocator`.
Leaving these as `_VSTD::allocator` would also be fine, but I decided
that removing the qualification is more consistent with existing practice.
- Names that specifically need un-versioned `std::` qualification,
or that I wasn't sure about. For example, I didn't touch any code in
<atomic>, <math.h>, <new>, or any ext/ or experimental/ headers;
and I didn't touch any instances of `std::type_info`.
In some deduction guides, we were accidentally using `class Alloc = typename std::allocator<T>`,
despite `std::allocator<T>`'s type-ness not being template-dependent.
Because `std::allocator` is a qualified name, this did parse as we intended;
but what we meant was simply `class Alloc = allocator<T>`.
Differential Revision: https://reviews.llvm.org/D92250
2020-11-27 11:02:06 -05:00
|
|
|
_VSTD::find(__neg_chars_.begin(), __neg_chars_.end(), __ch) !=
|
2017-10-18 16:49:22 +00:00
|
|
|
__neg_chars_.end();
|
|
|
|
if (!(__in_neg_mask || __in_neg_chars))
|
|
|
|
{
|
2010-07-28 17:35:27 +00:00
|
|
|
__found = true;
|
|
|
|
goto __exit;
|
2017-10-18 16:49:22 +00:00
|
|
|
}
|
2010-07-28 17:35:27 +00:00
|
|
|
}
|
2010-07-13 21:48:06 +00:00
|
|
|
if (!__ranges_.empty())
|
|
|
|
{
|
|
|
|
string_type __s2 = __collate_ ?
|
|
|
|
__traits_.transform(&__ch, &__ch + 1) :
|
|
|
|
string_type(1, __ch);
|
|
|
|
for (size_t __i = 0; __i < __ranges_.size(); ++__i)
|
|
|
|
{
|
|
|
|
if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
|
|
|
|
{
|
|
|
|
__found = true;
|
|
|
|
goto __exit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!__equivalences_.empty())
|
|
|
|
{
|
|
|
|
string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
|
|
|
|
for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
|
|
|
|
{
|
|
|
|
if (__s2 == __equivalences_[__i])
|
|
|
|
{
|
|
|
|
__found = true;
|
|
|
|
goto __exit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (__traits_.isctype(__ch, __mask_))
|
2010-07-28 17:35:27 +00:00
|
|
|
{
|
|
|
|
__found = true;
|
|
|
|
goto __exit;
|
|
|
|
}
|
2010-07-13 21:48:06 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
__found = __negate_; // force reject
|
|
|
|
__exit:
|
|
|
|
if (__found != __negate_)
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_and_consume;
|
|
|
|
__s.__current_ += __consumed;
|
|
|
|
__s.__node_ = this->first();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-06-14 19:58:17 +00:00
|
|
|
template <class _CharT, class _Traits> class __lookahead;
|
2010-06-30 17:22:19 +00:00
|
|
|
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _CharT, class _Traits = regex_traits<_CharT> >
|
2020-11-11 17:12:18 -08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS basic_regex;
|
|
|
|
|
|
|
|
typedef basic_regex<char> regex;
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
2020-11-11 17:12:18 -08:00
|
|
|
typedef basic_regex<wchar_t> wregex;
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2020-11-11 17:12:18 -08:00
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
class
|
|
|
|
_LIBCPP_TEMPLATE_VIS
|
|
|
|
_LIBCPP_PREFERRED_NAME(regex)
|
2021-08-23 15:32:36 -04:00
|
|
|
_LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wregex))
|
2020-11-11 17:12:18 -08:00
|
|
|
basic_regex
|
2010-06-24 21:28:00 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
// types:
|
|
|
|
typedef _CharT value_type;
|
2016-08-02 21:34:48 +00:00
|
|
|
typedef _Traits traits_type;
|
|
|
|
typedef typename _Traits::string_type string_type;
|
2010-06-24 21:28:00 +00:00
|
|
|
typedef regex_constants::syntax_option_type flag_type;
|
|
|
|
typedef typename _Traits::locale_type locale_type;
|
|
|
|
|
|
|
|
private:
|
|
|
|
_Traits __traits_;
|
|
|
|
flag_type __flags_;
|
|
|
|
unsigned __marked_count_;
|
2010-07-07 19:14:52 +00:00
|
|
|
unsigned __loop_count_;
|
2010-06-29 18:37:43 +00:00
|
|
|
int __open_count_;
|
2010-07-07 19:14:52 +00:00
|
|
|
shared_ptr<__empty_state<_CharT> > __start_;
|
|
|
|
__owns_one_state<_CharT>* __end_;
|
|
|
|
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
|
|
|
typedef _VSTD::__node<_CharT> __node;
|
2010-06-24 21:28:00 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
// constants:
|
2012-07-21 01:31:58 +00:00
|
|
|
static const regex_constants::syntax_option_type icase = regex_constants::icase;
|
|
|
|
static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
|
|
|
|
static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
|
|
|
|
static const regex_constants::syntax_option_type collate = regex_constants::collate;
|
|
|
|
static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
|
|
|
|
static const regex_constants::syntax_option_type basic = regex_constants::basic;
|
|
|
|
static const regex_constants::syntax_option_type extended = regex_constants::extended;
|
|
|
|
static const regex_constants::syntax_option_type awk = regex_constants::awk;
|
|
|
|
static const regex_constants::syntax_option_type grep = regex_constants::grep;
|
|
|
|
static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
|
2020-11-18 18:09:13 +01:00
|
|
|
static const regex_constants::syntax_option_type multiline = regex_constants::multiline;
|
2010-06-24 21:28:00 +00:00
|
|
|
|
|
|
|
// construct/copy/destroy:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-07 19:14:52 +00:00
|
|
|
basic_regex()
|
2019-03-28 17:30:23 +00:00
|
|
|
: __flags_(regex_constants::ECMAScript), __marked_count_(0), __loop_count_(0), __open_count_(0),
|
2020-11-24 12:53:53 -05:00
|
|
|
__end_(nullptr)
|
2010-07-07 19:14:52 +00:00
|
|
|
{}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-24 21:28:00 +00:00
|
|
|
explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
|
2010-07-09 00:15:26 +00:00
|
|
|
: __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
|
2020-11-24 12:53:53 -05:00
|
|
|
__end_(nullptr)
|
2019-03-28 17:30:23 +00:00
|
|
|
{
|
2019-11-09 17:01:37 +01:00
|
|
|
__init(__p, __p + __traits_.length(__p));
|
2019-03-28 17:30:23 +00:00
|
|
|
}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2016-08-07 22:26:04 +00:00
|
|
|
basic_regex(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
|
2010-07-09 00:15:26 +00:00
|
|
|
: __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
|
2020-11-24 12:53:53 -05:00
|
|
|
__end_(nullptr)
|
2019-03-28 17:30:23 +00:00
|
|
|
{
|
2019-11-09 17:01:37 +01:00
|
|
|
__init(__p, __p + __len);
|
2019-03-28 17:30:23 +00:00
|
|
|
}
|
|
|
|
|
2010-07-27 22:20:32 +00:00
|
|
|
// basic_regex(const basic_regex&) = default;
|
|
|
|
// basic_regex(basic_regex&&) = default;
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _ST, class _SA>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-24 21:28:00 +00:00
|
|
|
explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
|
|
|
|
flag_type __f = regex_constants::ECMAScript)
|
2010-07-09 00:15:26 +00:00
|
|
|
: __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
|
2020-11-24 12:53:53 -05:00
|
|
|
__end_(nullptr)
|
2019-03-28 17:30:23 +00:00
|
|
|
{
|
2019-11-09 17:01:37 +01:00
|
|
|
__init(__p.begin(), __p.end());
|
2019-03-28 17:30:23 +00:00
|
|
|
}
|
|
|
|
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _ForwardIterator>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-24 21:28:00 +00:00
|
|
|
basic_regex(_ForwardIterator __first, _ForwardIterator __last,
|
|
|
|
flag_type __f = regex_constants::ECMAScript)
|
2010-07-09 00:15:26 +00:00
|
|
|
: __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
|
2020-11-24 12:53:53 -05:00
|
|
|
__end_(nullptr)
|
2019-03-28 17:30:23 +00:00
|
|
|
{
|
2019-11-09 17:01:37 +01:00
|
|
|
__init(__first, __last);
|
2019-03-28 17:30:23 +00:00
|
|
|
}
|
2017-04-18 23:42:15 +00:00
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-24 21:28:00 +00:00
|
|
|
basic_regex(initializer_list<value_type> __il,
|
|
|
|
flag_type __f = regex_constants::ECMAScript)
|
2010-07-09 00:15:26 +00:00
|
|
|
: __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
|
2020-11-24 12:53:53 -05:00
|
|
|
__end_(nullptr)
|
2019-03-28 17:30:23 +00:00
|
|
|
{
|
2019-11-09 17:01:37 +01:00
|
|
|
__init(__il.begin(), __il.end());
|
2019-03-28 17:30:23 +00:00
|
|
|
}
|
2021-04-20 12:03:32 -04:00
|
|
|
#endif // _LIBCPP_CXX03_LANG
|
2010-06-24 21:28:00 +00:00
|
|
|
|
2010-08-13 18:11:23 +00:00
|
|
|
// ~basic_regex() = default;
|
2010-06-24 21:28:00 +00:00
|
|
|
|
2010-07-27 22:20:32 +00:00
|
|
|
// basic_regex& operator=(const basic_regex&) = default;
|
|
|
|
// basic_regex& operator=(basic_regex&&) = default;
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-13 18:11:23 +00:00
|
|
|
basic_regex& operator=(const value_type* __p)
|
|
|
|
{return assign(__p);}
|
2017-04-18 23:42:15 +00:00
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-13 18:11:23 +00:00
|
|
|
basic_regex& operator=(initializer_list<value_type> __il)
|
|
|
|
{return assign(__il);}
|
2021-04-20 12:03:32 -04:00
|
|
|
#endif // _LIBCPP_CXX03_LANG
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _ST, class _SA>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-13 18:11:23 +00:00
|
|
|
basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
|
|
|
|
{return assign(__p);}
|
2010-06-24 21:28:00 +00:00
|
|
|
|
|
|
|
// assign:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-13 18:11:23 +00:00
|
|
|
basic_regex& assign(const basic_regex& __that)
|
|
|
|
{return *this = __that;}
|
2017-04-18 23:42:15 +00:00
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
2012-07-21 01:31:58 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
basic_regex& assign(basic_regex&& __that) _NOEXCEPT
|
|
|
|
{return *this = _VSTD::move(__that);}
|
|
|
|
#endif
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-13 18:11:23 +00:00
|
|
|
basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
|
|
|
|
{return assign(__p, __p + __traits_.length(__p), __f);}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2019-09-25 16:40:30 +00:00
|
|
|
basic_regex& assign(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
|
2010-08-13 18:11:23 +00:00
|
|
|
{return assign(__p, __p + __len, __f);}
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _ST, class _SA>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-24 21:28:00 +00:00
|
|
|
basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
|
2010-08-13 18:11:23 +00:00
|
|
|
flag_type __f = regex_constants::ECMAScript)
|
|
|
|
{return assign(__s.begin(), __s.end(), __f);}
|
|
|
|
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _InputIterator>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2022-07-04 22:45:49 +02:00
|
|
|
typename enable_if<__is_exactly_cpp17_input_iterator<_InputIterator>::value, basic_regex&>::type
|
2010-08-13 18:11:23 +00:00
|
|
|
assign(_InputIterator __first, _InputIterator __last,
|
|
|
|
flag_type __f = regex_constants::ECMAScript)
|
|
|
|
{
|
|
|
|
basic_string<_CharT> __t(__first, __last);
|
|
|
|
return assign(__t.begin(), __t.end(), __f);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-13 18:11:23 +00:00
|
|
|
void __member_init(flag_type __f)
|
|
|
|
{
|
|
|
|
__flags_ = __f;
|
|
|
|
__marked_count_ = 0;
|
|
|
|
__loop_count_ = 0;
|
|
|
|
__open_count_ = 0;
|
|
|
|
__end_ = nullptr;
|
|
|
|
}
|
|
|
|
public:
|
|
|
|
|
|
|
|
template <class _ForwardIterator>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-13 18:11:23 +00:00
|
|
|
typename enable_if
|
|
|
|
<
|
2019-11-18 01:46:58 -05:00
|
|
|
__is_cpp17_forward_iterator<_ForwardIterator>::value,
|
2010-08-13 18:11:23 +00:00
|
|
|
basic_regex&
|
|
|
|
>::type
|
|
|
|
assign(_ForwardIterator __first, _ForwardIterator __last,
|
|
|
|
flag_type __f = regex_constants::ECMAScript)
|
|
|
|
{
|
2015-01-13 16:49:52 +00:00
|
|
|
return assign(basic_regex(__first, __last, __f));
|
2010-08-13 18:11:23 +00:00
|
|
|
}
|
|
|
|
|
2017-04-18 23:42:15 +00:00
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
2011-08-12 21:56:02 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-24 21:28:00 +00:00
|
|
|
basic_regex& assign(initializer_list<value_type> __il,
|
2010-08-13 18:11:23 +00:00
|
|
|
flag_type __f = regex_constants::ECMAScript)
|
|
|
|
{return assign(__il.begin(), __il.end(), __f);}
|
2010-06-24 21:28:00 +00:00
|
|
|
|
2021-04-20 12:03:32 -04:00
|
|
|
#endif // _LIBCPP_CXX03_LANG
|
2011-08-12 21:56:02 +00:00
|
|
|
|
2010-06-24 21:28:00 +00:00
|
|
|
// const operations:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-24 21:28:00 +00:00
|
|
|
unsigned mark_count() const {return __marked_count_;}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-24 21:28:00 +00:00
|
|
|
flag_type flags() const {return __flags_;}
|
|
|
|
|
|
|
|
// locale:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-13 18:11:23 +00:00
|
|
|
locale_type imbue(locale_type __loc)
|
|
|
|
{
|
|
|
|
__member_init(ECMAScript);
|
|
|
|
__start_.reset();
|
|
|
|
return __traits_.imbue(__loc);
|
|
|
|
}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-24 21:28:00 +00:00
|
|
|
locale_type getloc() const {return __traits_.getloc();}
|
|
|
|
|
|
|
|
// swap:
|
2010-08-13 18:11:23 +00:00
|
|
|
void swap(basic_regex& __r);
|
2010-06-24 21:28:00 +00:00
|
|
|
|
|
|
|
private:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-07 19:14:52 +00:00
|
|
|
unsigned __loop_count() const {return __loop_count_;}
|
|
|
|
|
2020-11-18 18:09:13 +01:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool __use_multiline() const
|
|
|
|
{
|
|
|
|
return __get_grammar(__flags_) == ECMAScript && (__flags_ & multiline);
|
|
|
|
}
|
|
|
|
|
2019-11-09 17:01:37 +01:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
void
|
|
|
|
__init(_ForwardIterator __first, _ForwardIterator __last);
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _ForwardIterator>
|
2010-07-27 22:20:32 +00:00
|
|
|
_ForwardIterator
|
|
|
|
__parse(_ForwardIterator __first, _ForwardIterator __last);
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
2010-07-07 19:14:52 +00:00
|
|
|
__parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
|
2010-07-08 17:43:58 +00:00
|
|
|
__owns_one_state<_CharT>* __s,
|
|
|
|
unsigned __mexp_begin, unsigned __mexp_end);
|
2010-06-29 18:37:43 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
2010-07-16 19:08:36 +00:00
|
|
|
__parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
|
|
|
|
__owns_one_state<_CharT>* __s,
|
|
|
|
unsigned __mexp_begin, unsigned __mexp_end);
|
2010-06-25 20:56:08 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
2010-07-13 21:48:06 +00:00
|
|
|
__parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
|
|
|
|
__bracket_expression<_CharT, _Traits>* __ml);
|
2010-06-25 20:56:08 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
2010-07-13 21:48:06 +00:00
|
|
|
__parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
|
|
|
|
__bracket_expression<_CharT, _Traits>* __ml);
|
2010-06-25 20:56:08 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
2010-07-13 21:48:06 +00:00
|
|
|
__parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
|
|
|
|
__bracket_expression<_CharT, _Traits>* __ml);
|
2010-06-25 20:56:08 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
2010-07-13 21:48:06 +00:00
|
|
|
__parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
|
|
|
|
__bracket_expression<_CharT, _Traits>* __ml);
|
2010-06-25 20:56:08 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
2010-07-13 21:48:06 +00:00
|
|
|
__parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
|
|
|
|
basic_string<_CharT>& __col_sym);
|
2010-06-25 20:56:08 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
|
2010-06-29 18:37:43 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
|
2010-07-22 17:53:24 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_term(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_atom(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
2010-07-27 01:25:38 +00:00
|
|
|
__parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
2010-07-28 17:35:27 +00:00
|
|
|
__parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
|
|
|
|
basic_string<_CharT>* __str = nullptr);
|
2010-07-27 01:25:38 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
|
2010-07-27 19:53:10 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_grep(_ForwardIterator __first, _ForwardIterator __last);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
|
2010-07-28 17:35:27 +00:00
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
|
|
|
|
basic_string<_CharT>& __str,
|
|
|
|
__bracket_expression<_CharT, _Traits>* __ml);
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
__parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
|
|
|
|
basic_string<_CharT>* __str = nullptr);
|
2010-06-25 20:56:08 +00:00
|
|
|
|
2022-07-08 18:17:26 +02:00
|
|
|
bool __test_back_ref(_CharT);
|
2020-02-19 15:56:15 -05:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2011-03-26 20:02:27 +00:00
|
|
|
void __push_l_anchor();
|
2010-07-09 00:15:26 +00:00
|
|
|
void __push_r_anchor();
|
2010-07-12 15:51:17 +00:00
|
|
|
void __push_match_any();
|
2010-07-27 01:25:38 +00:00
|
|
|
void __push_match_any_but_newline();
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-08 17:43:58 +00:00
|
|
|
void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
|
|
|
|
unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
|
|
|
|
{__push_loop(__min, numeric_limits<size_t>::max(), __s,
|
|
|
|
__mexp_begin, __mexp_end);}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-27 01:25:38 +00:00
|
|
|
void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
|
|
|
|
unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
|
|
|
|
{__push_loop(__min, numeric_limits<size_t>::max(), __s,
|
|
|
|
__mexp_begin, __mexp_end, false);}
|
2010-07-07 19:14:52 +00:00
|
|
|
void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
|
|
|
|
size_t __mexp_begin = 0, size_t __mexp_end = 0,
|
|
|
|
bool __greedy = true);
|
2010-07-13 21:48:06 +00:00
|
|
|
__bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
|
2010-06-29 18:37:43 +00:00
|
|
|
void __push_char(value_type __c);
|
2010-07-12 18:16:05 +00:00
|
|
|
void __push_back_ref(int __i);
|
2010-07-16 19:08:36 +00:00
|
|
|
void __push_alternation(__owns_one_state<_CharT>* __sa,
|
|
|
|
__owns_one_state<_CharT>* __sb);
|
2010-06-30 20:30:19 +00:00
|
|
|
void __push_begin_marked_subexpression();
|
|
|
|
void __push_end_marked_subexpression(unsigned);
|
2010-07-22 17:53:24 +00:00
|
|
|
void __push_empty();
|
2010-07-27 01:25:38 +00:00
|
|
|
void __push_word_boundary(bool);
|
2013-07-23 16:18:04 +00:00
|
|
|
void __push_lookahead(const basic_regex&, bool, unsigned);
|
2010-06-30 17:22:19 +00:00
|
|
|
|
2010-07-14 21:14:52 +00:00
|
|
|
template <class _Allocator>
|
2010-06-30 17:22:19 +00:00
|
|
|
bool
|
2010-07-14 21:14:52 +00:00
|
|
|
__search(const _CharT* __first, const _CharT* __last,
|
|
|
|
match_results<const _CharT*, _Allocator>& __m,
|
2010-06-30 17:22:19 +00:00
|
|
|
regex_constants::match_flag_type __flags) const;
|
|
|
|
|
2010-07-14 21:14:52 +00:00
|
|
|
template <class _Allocator>
|
2010-07-07 19:14:52 +00:00
|
|
|
bool
|
2010-07-14 21:14:52 +00:00
|
|
|
__match_at_start(const _CharT* __first, const _CharT* __last,
|
|
|
|
match_results<const _CharT*, _Allocator>& __m,
|
2011-03-26 20:02:27 +00:00
|
|
|
regex_constants::match_flag_type __flags, bool) const;
|
2010-07-27 01:25:38 +00:00
|
|
|
template <class _Allocator>
|
2010-07-07 19:14:52 +00:00
|
|
|
bool
|
2010-07-27 01:25:38 +00:00
|
|
|
__match_at_start_ecma(const _CharT* __first, const _CharT* __last,
|
|
|
|
match_results<const _CharT*, _Allocator>& __m,
|
2011-03-26 20:02:27 +00:00
|
|
|
regex_constants::match_flag_type __flags, bool) const;
|
2010-07-14 21:14:52 +00:00
|
|
|
template <class _Allocator>
|
2010-07-07 19:14:52 +00:00
|
|
|
bool
|
|
|
|
__match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
|
2010-07-14 21:14:52 +00:00
|
|
|
match_results<const _CharT*, _Allocator>& __m,
|
2011-03-26 20:02:27 +00:00
|
|
|
regex_constants::match_flag_type __flags, bool) const;
|
2010-07-14 21:14:52 +00:00
|
|
|
template <class _Allocator>
|
2010-07-07 19:14:52 +00:00
|
|
|
bool
|
2010-07-14 21:14:52 +00:00
|
|
|
__match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
|
|
|
|
match_results<const _CharT*, _Allocator>& __m,
|
2011-03-26 20:02:27 +00:00
|
|
|
regex_constants::match_flag_type __flags, bool) const;
|
2010-07-07 19:14:52 +00:00
|
|
|
|
2011-11-29 18:15:50 +00:00
|
|
|
template <class _Bp, class _Ap, class _Cp, class _Tp>
|
2010-06-30 17:22:19 +00:00
|
|
|
friend
|
|
|
|
bool
|
2011-11-29 18:15:50 +00:00
|
|
|
regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
|
2010-06-30 17:22:19 +00:00
|
|
|
regex_constants::match_flag_type);
|
2010-06-24 21:28:00 +00:00
|
|
|
|
2011-11-29 18:15:50 +00:00
|
|
|
template <class _Ap, class _Cp, class _Tp>
|
2010-07-14 21:14:52 +00:00
|
|
|
friend
|
|
|
|
bool
|
2011-11-29 18:15:50 +00:00
|
|
|
regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
|
|
|
|
const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
|
2010-07-14 21:14:52 +00:00
|
|
|
|
2011-11-29 18:15:50 +00:00
|
|
|
template <class _Bp, class _Cp, class _Tp>
|
2010-07-14 21:14:52 +00:00
|
|
|
friend
|
|
|
|
bool
|
2011-11-29 18:15:50 +00:00
|
|
|
regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
|
2010-07-14 21:14:52 +00:00
|
|
|
regex_constants::match_flag_type);
|
|
|
|
|
2011-11-29 18:15:50 +00:00
|
|
|
template <class _Cp, class _Tp>
|
2010-07-14 21:14:52 +00:00
|
|
|
friend
|
|
|
|
bool
|
2011-11-29 18:15:50 +00:00
|
|
|
regex_search(const _Cp*, const _Cp*,
|
|
|
|
const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
|
2010-07-14 21:14:52 +00:00
|
|
|
|
2011-11-29 18:15:50 +00:00
|
|
|
template <class _Cp, class _Ap, class _Tp>
|
2010-07-14 21:14:52 +00:00
|
|
|
friend
|
|
|
|
bool
|
2011-11-29 18:15:50 +00:00
|
|
|
regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
|
2010-07-14 21:14:52 +00:00
|
|
|
regex_constants::match_flag_type);
|
|
|
|
|
2011-11-29 18:15:50 +00:00
|
|
|
template <class _ST, class _SA, class _Cp, class _Tp>
|
2010-07-14 21:14:52 +00:00
|
|
|
friend
|
|
|
|
bool
|
2011-11-29 18:15:50 +00:00
|
|
|
regex_search(const basic_string<_Cp, _ST, _SA>& __s,
|
|
|
|
const basic_regex<_Cp, _Tp>& __e,
|
2010-07-14 21:14:52 +00:00
|
|
|
regex_constants::match_flag_type __flags);
|
|
|
|
|
2011-11-29 18:15:50 +00:00
|
|
|
template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
|
2010-07-14 21:14:52 +00:00
|
|
|
friend
|
|
|
|
bool
|
2011-11-29 18:15:50 +00:00
|
|
|
regex_search(const basic_string<_Cp, _ST, _SA>& __s,
|
|
|
|
match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
|
|
|
|
const basic_regex<_Cp, _Tp>& __e,
|
2010-07-14 21:14:52 +00:00
|
|
|
regex_constants::match_flag_type __flags);
|
2010-07-27 22:20:32 +00:00
|
|
|
|
2013-06-29 23:45:43 +00:00
|
|
|
template <class _Iter, class _Ap, class _Cp, class _Tp>
|
|
|
|
friend
|
|
|
|
bool
|
|
|
|
regex_search(__wrap_iter<_Iter> __first,
|
|
|
|
__wrap_iter<_Iter> __last,
|
|
|
|
match_results<__wrap_iter<_Iter>, _Ap>& __m,
|
|
|
|
const basic_regex<_Cp, _Tp>& __e,
|
|
|
|
regex_constants::match_flag_type __flags);
|
|
|
|
|
2010-07-27 22:20:32 +00:00
|
|
|
template <class, class> friend class __lookahead;
|
2010-07-07 19:14:52 +00:00
|
|
|
};
|
2010-06-24 21:28:00 +00:00
|
|
|
|
2021-08-17 11:59:07 -04:00
|
|
|
#if _LIBCPP_STD_VER >= 17
|
2018-05-23 01:57:02 +00:00
|
|
|
template <class _ForwardIterator,
|
2019-11-18 01:46:58 -05:00
|
|
|
class = typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value, nullptr_t>::type
|
2018-05-23 01:57:02 +00:00
|
|
|
>
|
|
|
|
basic_regex(_ForwardIterator, _ForwardIterator,
|
|
|
|
regex_constants::syntax_option_type = regex_constants::ECMAScript)
|
|
|
|
-> basic_regex<typename iterator_traits<_ForwardIterator>::value_type>;
|
|
|
|
#endif
|
|
|
|
|
2012-12-12 21:14:28 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
|
|
|
|
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _CharT, class _Traits>
|
2010-08-13 18:11:23 +00:00
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
using _VSTD::swap;
|
2010-08-13 18:11:23 +00:00
|
|
|
swap(__traits_, __r.__traits_);
|
|
|
|
swap(__flags_, __r.__flags_);
|
|
|
|
swap(__marked_count_, __r.__marked_count_);
|
|
|
|
swap(__loop_count_, __r.__loop_count_);
|
|
|
|
swap(__open_count_, __r.__open_count_);
|
|
|
|
swap(__start_, __r.__start_);
|
|
|
|
swap(__end_, __r.__end_);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
void
|
|
|
|
swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
|
2010-06-24 21:28:00 +00:00
|
|
|
{
|
2010-08-13 18:11:23 +00:00
|
|
|
return __x.swap(__y);
|
2010-06-24 21:28:00 +00:00
|
|
|
}
|
|
|
|
|
2010-07-27 22:20:32 +00:00
|
|
|
// __lookahead
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
class __lookahead
|
|
|
|
: public __owns_one_state<_CharT>
|
|
|
|
{
|
|
|
|
typedef __owns_one_state<_CharT> base;
|
|
|
|
|
|
|
|
basic_regex<_CharT, _Traits> __exp_;
|
2013-07-23 16:18:04 +00:00
|
|
|
unsigned __mexp_;
|
2010-07-27 22:20:32 +00:00
|
|
|
bool __invert_;
|
|
|
|
|
|
|
|
__lookahead(const __lookahead&);
|
|
|
|
__lookahead& operator=(const __lookahead&);
|
|
|
|
public:
|
2011-06-30 21:18:19 +00:00
|
|
|
typedef _VSTD::__state<_CharT> __state;
|
2010-07-27 22:20:32 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2013-07-23 16:18:04 +00:00
|
|
|
__lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
|
2015-07-22 01:29:41 +00:00
|
|
|
: base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}
|
2010-07-27 22:20:32 +00:00
|
|
|
|
|
|
|
virtual void __exec(__state&) const;
|
|
|
|
};
|
|
|
|
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
2010-07-27 22:20:32 +00:00
|
|
|
__lookahead<_CharT, _Traits>::__exec(__state& __s) const
|
|
|
|
{
|
|
|
|
match_results<const _CharT*> __m;
|
|
|
|
__m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
|
2016-10-27 21:40:34 +00:00
|
|
|
bool __matched = __exp_.__match_at_start_ecma(
|
|
|
|
__s.__current_, __s.__last_,
|
|
|
|
__m,
|
|
|
|
(__s.__flags_ | regex_constants::match_continuous) &
|
|
|
|
~regex_constants::__full_match,
|
|
|
|
__s.__at_first_ && __s.__current_ == __s.__first_);
|
2010-07-27 22:20:32 +00:00
|
|
|
if (__matched != __invert_)
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__accept_but_not_consume;
|
|
|
|
__s.__node_ = this->first();
|
2013-07-23 16:18:04 +00:00
|
|
|
for (unsigned __i = 1; __i < __m.size(); ++__i) {
|
|
|
|
__s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
|
|
|
|
}
|
2010-07-27 22:20:32 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__s.__do_ = __state::__reject;
|
|
|
|
__s.__node_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-09 17:01:37 +01:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__init(_ForwardIterator __first, _ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__get_grammar(__flags_) == 0) __flags_ |= regex_constants::ECMAScript;
|
|
|
|
_ForwardIterator __temp = __parse(__first, __last);
|
|
|
|
if ( __temp != __last)
|
|
|
|
__throw_regex_error<regex_constants::__re_err_parse>();
|
|
|
|
}
|
|
|
|
|
2010-07-27 22:20:32 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
2010-06-24 21:28:00 +00:00
|
|
|
basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
unique_ptr<__node> __h(new __end_state<_CharT>);
|
2010-07-07 19:14:52 +00:00
|
|
|
__start_.reset(new __empty_state<_CharT>(__h.get()));
|
|
|
|
__h.release();
|
|
|
|
__end_ = __start_.get();
|
|
|
|
}
|
2019-03-28 17:30:23 +00:00
|
|
|
switch (__get_grammar(__flags_))
|
2010-06-24 21:28:00 +00:00
|
|
|
{
|
|
|
|
case ECMAScript:
|
2010-07-27 22:20:32 +00:00
|
|
|
__first = __parse_ecma_exp(__first, __last);
|
2010-06-24 21:28:00 +00:00
|
|
|
break;
|
|
|
|
case basic:
|
2010-07-27 22:20:32 +00:00
|
|
|
__first = __parse_basic_reg_exp(__first, __last);
|
2010-06-24 21:28:00 +00:00
|
|
|
break;
|
|
|
|
case extended:
|
|
|
|
case awk:
|
2010-07-28 17:35:27 +00:00
|
|
|
__first = __parse_extended_reg_exp(__first, __last);
|
2010-06-24 21:28:00 +00:00
|
|
|
break;
|
|
|
|
case grep:
|
2010-07-27 22:20:32 +00:00
|
|
|
__first = __parse_grep(__first, __last);
|
2010-06-24 21:28:00 +00:00
|
|
|
break;
|
|
|
|
case egrep:
|
2010-07-27 22:20:32 +00:00
|
|
|
__first = __parse_egrep(__first, __last);
|
2010-06-24 21:28:00 +00:00
|
|
|
break;
|
|
|
|
default:
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::__re_err_grammar>();
|
2010-06-24 21:28:00 +00:00
|
|
|
}
|
2010-07-27 22:20:32 +00:00
|
|
|
return __first;
|
2010-06-24 21:28:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
|
|
|
if (*__first == '^')
|
|
|
|
{
|
|
|
|
__push_l_anchor();
|
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
|
|
|
__first = __parse_RE_expression(__first, __last);
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-06-24 21:28:00 +00:00
|
|
|
if (__temp == __last && *__first == '$')
|
|
|
|
{
|
|
|
|
__push_r_anchor();
|
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (__first != __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::__re_err_empty>();
|
2010-06-24 21:28:00 +00:00
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2010-06-29 18:37:43 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
2010-07-16 19:08:36 +00:00
|
|
|
__owns_one_state<_CharT>* __sa = __end_;
|
|
|
|
_ForwardIterator __temp = __parse_ERE_branch(__first, __last);
|
|
|
|
if (__temp == __first)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::__re_err_empty>();
|
2010-07-16 19:08:36 +00:00
|
|
|
__first = __temp;
|
|
|
|
while (__first != __last && *__first == '|')
|
2010-06-29 18:37:43 +00:00
|
|
|
{
|
2010-07-16 19:08:36 +00:00
|
|
|
__owns_one_state<_CharT>* __sb = __end_;
|
|
|
|
__temp = __parse_ERE_branch(++__first, __last);
|
2010-06-29 18:37:43 +00:00
|
|
|
if (__temp == __first)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::__re_err_empty>();
|
2010-07-16 19:08:36 +00:00
|
|
|
__push_alternation(__sa, __sb);
|
2010-06-29 18:37:43 +00:00
|
|
|
__first = __temp;
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
_ForwardIterator __temp = __parse_ERE_expression(__first, __last);
|
|
|
|
if (__temp == __first)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::__re_err_empty>();
|
2010-06-29 18:37:43 +00:00
|
|
|
do
|
|
|
|
{
|
|
|
|
__first = __temp;
|
|
|
|
__temp = __parse_ERE_expression(__first, __last);
|
|
|
|
} while (__temp != __first);
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
2010-07-16 19:08:36 +00:00
|
|
|
__owns_one_state<_CharT>* __e = __end_;
|
|
|
|
unsigned __mexp_begin = __marked_count_;
|
2010-06-29 18:37:43 +00:00
|
|
|
_ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
|
|
|
|
if (__temp == __first && __temp != __last)
|
|
|
|
{
|
|
|
|
switch (*__temp)
|
|
|
|
{
|
|
|
|
case '^':
|
|
|
|
__push_l_anchor();
|
|
|
|
++__temp;
|
|
|
|
break;
|
|
|
|
case '$':
|
|
|
|
__push_r_anchor();
|
|
|
|
++__temp;
|
|
|
|
break;
|
|
|
|
case '(':
|
2010-06-30 20:30:19 +00:00
|
|
|
__push_begin_marked_subexpression();
|
|
|
|
unsigned __temp_count = __marked_count_;
|
2010-06-29 18:37:43 +00:00
|
|
|
++__open_count_;
|
|
|
|
__temp = __parse_extended_reg_exp(++__temp, __last);
|
|
|
|
if (__temp == __last || *__temp != ')')
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_paren>();
|
2010-06-30 20:30:19 +00:00
|
|
|
__push_end_marked_subexpression(__temp_count);
|
2010-06-29 18:37:43 +00:00
|
|
|
--__open_count_;
|
|
|
|
++__temp;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (__temp != __first)
|
2010-07-16 19:08:36 +00:00
|
|
|
__temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
|
|
|
|
__marked_count_+1);
|
2010-06-29 18:37:43 +00:00
|
|
|
__first = __temp;
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
_ForwardIterator __temp = __parse_simple_RE(__first, __last);
|
|
|
|
if (__temp == __first)
|
|
|
|
break;
|
|
|
|
__first = __temp;
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2010-07-07 19:14:52 +00:00
|
|
|
__owns_one_state<_CharT>* __e = __end_;
|
2010-07-08 17:43:58 +00:00
|
|
|
unsigned __mexp_begin = __marked_count_;
|
2010-06-24 21:28:00 +00:00
|
|
|
_ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
|
|
|
|
if (__temp != __first)
|
2010-07-08 17:43:58 +00:00
|
|
|
__first = __parse_RE_dupl_symbol(__temp, __last, __e,
|
|
|
|
__mexp_begin+1, __marked_count_+1);
|
2010-06-24 21:28:00 +00:00
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
_ForwardIterator __temp = __first;
|
|
|
|
__first = __parse_one_char_or_coll_elem_RE(__first, __last);
|
|
|
|
if (__temp == __first)
|
|
|
|
{
|
|
|
|
__temp = __parse_Back_open_paren(__first, __last);
|
|
|
|
if (__temp != __first)
|
|
|
|
{
|
2010-06-30 20:30:19 +00:00
|
|
|
__push_begin_marked_subexpression();
|
|
|
|
unsigned __temp_count = __marked_count_;
|
2010-06-24 21:28:00 +00:00
|
|
|
__first = __parse_RE_expression(__temp, __last);
|
|
|
|
__temp = __parse_Back_close_paren(__first, __last);
|
|
|
|
if (__temp == __first)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_paren>();
|
2010-06-30 20:30:19 +00:00
|
|
|
__push_end_marked_subexpression(__temp_count);
|
2010-06-24 21:28:00 +00:00
|
|
|
__first = __temp;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__first = __parse_BACKREF(__first, __last);
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
|
|
|
|
_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
2010-06-29 18:37:43 +00:00
|
|
|
_ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
|
2010-06-24 21:28:00 +00:00
|
|
|
if (__temp == __first)
|
|
|
|
{
|
2010-06-29 18:37:43 +00:00
|
|
|
__temp = __parse_QUOTED_CHAR(__first, __last);
|
2010-06-24 21:28:00 +00:00
|
|
|
if (__temp == __first)
|
|
|
|
{
|
2010-06-29 18:37:43 +00:00
|
|
|
if (__temp != __last && *__temp == '.')
|
2010-06-24 21:28:00 +00:00
|
|
|
{
|
|
|
|
__push_match_any();
|
2010-06-29 18:37:43 +00:00
|
|
|
++__temp;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__temp = __parse_bracket_expression(__first, __last);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
__first = __temp;
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
|
|
|
|
_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
_ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
|
|
|
|
if (__temp == __first)
|
|
|
|
{
|
|
|
|
__temp = __parse_QUOTED_CHAR_ERE(__first, __last);
|
|
|
|
if (__temp == __first)
|
|
|
|
{
|
|
|
|
if (__temp != __last && *__temp == '.')
|
|
|
|
{
|
|
|
|
__push_match_any();
|
|
|
|
++__temp;
|
2010-06-24 21:28:00 +00:00
|
|
|
}
|
|
|
|
else
|
2010-06-29 18:37:43 +00:00
|
|
|
__temp = __parse_bracket_expression(__first, __last);
|
2010-06-24 21:28:00 +00:00
|
|
|
}
|
|
|
|
}
|
2010-06-29 18:37:43 +00:00
|
|
|
__first = __temp;
|
2010-06-24 21:28:00 +00:00
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-06-24 21:28:00 +00:00
|
|
|
if (__temp != __last)
|
|
|
|
{
|
|
|
|
if (*__first == '\\' && *__temp == '(')
|
|
|
|
__first = ++__temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-06-24 21:28:00 +00:00
|
|
|
if (__temp != __last)
|
|
|
|
{
|
|
|
|
if (*__first == '\\' && *__temp == ')')
|
|
|
|
__first = ++__temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-06-24 21:28:00 +00:00
|
|
|
if (__temp != __last)
|
|
|
|
{
|
|
|
|
if (*__first == '\\' && *__temp == '{')
|
|
|
|
__first = ++__temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-06-24 21:28:00 +00:00
|
|
|
if (__temp != __last)
|
|
|
|
{
|
|
|
|
if (*__first == '\\' && *__temp == '}')
|
|
|
|
__first = ++__temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2020-02-19 15:56:15 -05:00
|
|
|
if (__temp != __last && *__first == '\\' && __test_back_ref(*__temp))
|
|
|
|
__first = ++__temp;
|
2010-06-24 21:28:00 +00:00
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-06-24 21:28:00 +00:00
|
|
|
if (__temp == __last && *__first == '$')
|
|
|
|
return __first;
|
|
|
|
// Not called inside a bracket
|
|
|
|
if (*__first == '.' || *__first == '\\' || *__first == '[')
|
|
|
|
return __first;
|
2010-06-25 20:56:08 +00:00
|
|
|
__push_char(*__first);
|
2010-06-24 21:28:00 +00:00
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2010-06-29 18:37:43 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
|
|
|
switch (*__first)
|
|
|
|
{
|
|
|
|
case '^':
|
|
|
|
case '.':
|
|
|
|
case '[':
|
|
|
|
case '$':
|
|
|
|
case '(':
|
|
|
|
case '|':
|
|
|
|
case '*':
|
|
|
|
case '+':
|
|
|
|
case '?':
|
|
|
|
case '{':
|
|
|
|
case '\\':
|
|
|
|
break;
|
|
|
|
case ')':
|
|
|
|
if (__open_count_ == 0)
|
|
|
|
{
|
|
|
|
__push_char(*__first);
|
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
__push_char(*__first);
|
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-06-24 21:28:00 +00:00
|
|
|
if (__temp != __last)
|
|
|
|
{
|
|
|
|
if (*__first == '\\')
|
|
|
|
{
|
|
|
|
switch (*__temp)
|
|
|
|
{
|
|
|
|
case '^':
|
|
|
|
case '.':
|
|
|
|
case '*':
|
|
|
|
case '[':
|
|
|
|
case '$':
|
|
|
|
case '\\':
|
2010-06-25 20:56:08 +00:00
|
|
|
__push_char(*__temp);
|
2010-06-24 21:28:00 +00:00
|
|
|
__first = ++__temp;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2010-06-29 18:37:43 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-06-29 18:37:43 +00:00
|
|
|
if (__temp != __last)
|
|
|
|
{
|
|
|
|
if (*__first == '\\')
|
|
|
|
{
|
|
|
|
switch (*__temp)
|
|
|
|
{
|
|
|
|
case '^':
|
|
|
|
case '.':
|
|
|
|
case '*':
|
|
|
|
case '[':
|
|
|
|
case '$':
|
|
|
|
case '\\':
|
|
|
|
case '(':
|
|
|
|
case ')':
|
|
|
|
case '|':
|
|
|
|
case '+':
|
|
|
|
case '?':
|
|
|
|
case '{':
|
2013-06-28 20:31:05 +00:00
|
|
|
case '}':
|
2010-06-29 18:37:43 +00:00
|
|
|
__push_char(*__temp);
|
|
|
|
__first = ++__temp;
|
|
|
|
break;
|
2010-07-28 17:35:27 +00:00
|
|
|
default:
|
2019-03-28 17:30:23 +00:00
|
|
|
if (__get_grammar(__flags_) == awk)
|
2010-07-28 17:35:27 +00:00
|
|
|
__first = __parse_awk_escape(++__first, __last);
|
2020-02-19 15:56:15 -05:00
|
|
|
else if(__test_back_ref(*__temp))
|
|
|
|
__first = ++__temp;
|
2010-07-28 17:35:27 +00:00
|
|
|
break;
|
2010-06-29 18:37:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2010-06-24 21:28:00 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
|
2010-07-07 19:14:52 +00:00
|
|
|
_ForwardIterator __last,
|
2010-07-08 17:43:58 +00:00
|
|
|
__owns_one_state<_CharT>* __s,
|
|
|
|
unsigned __mexp_begin,
|
|
|
|
unsigned __mexp_end)
|
2010-06-24 21:28:00 +00:00
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2010-06-25 20:56:08 +00:00
|
|
|
if (*__first == '*')
|
2010-06-24 21:28:00 +00:00
|
|
|
{
|
2010-07-08 17:43:58 +00:00
|
|
|
__push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
|
2010-06-24 21:28:00 +00:00
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
|
|
|
|
if (__temp != __first)
|
|
|
|
{
|
|
|
|
int __min = 0;
|
|
|
|
__first = __temp;
|
|
|
|
__temp = __parse_DUP_COUNT(__first, __last, __min);
|
|
|
|
if (__temp == __first)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_badbrace>();
|
2010-06-24 21:28:00 +00:00
|
|
|
__first = __temp;
|
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brace>();
|
2010-06-24 21:28:00 +00:00
|
|
|
if (*__first != ',')
|
|
|
|
{
|
|
|
|
__temp = __parse_Back_close_brace(__first, __last);
|
|
|
|
if (__temp == __first)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brace>();
|
2010-07-12 18:16:05 +00:00
|
|
|
__push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
|
|
|
|
true);
|
2010-06-24 21:28:00 +00:00
|
|
|
__first = __temp;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
++__first; // consume ','
|
|
|
|
int __max = -1;
|
|
|
|
__first = __parse_DUP_COUNT(__first, __last, __max);
|
|
|
|
__temp = __parse_Back_close_brace(__first, __last);
|
|
|
|
if (__temp == __first)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brace>();
|
2010-06-24 21:28:00 +00:00
|
|
|
if (__max == -1)
|
2010-07-16 19:08:36 +00:00
|
|
|
__push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
|
2010-06-24 21:28:00 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (__max < __min)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_badbrace>();
|
2010-07-12 18:16:05 +00:00
|
|
|
__push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
|
|
|
|
true);
|
2010-06-24 21:28:00 +00:00
|
|
|
}
|
|
|
|
__first = __temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2010-06-29 18:37:43 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
|
2010-07-16 19:08:36 +00:00
|
|
|
_ForwardIterator __last,
|
|
|
|
__owns_one_state<_CharT>* __s,
|
|
|
|
unsigned __mexp_begin,
|
|
|
|
unsigned __mexp_end)
|
2010-06-29 18:37:43 +00:00
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
2019-03-28 17:30:23 +00:00
|
|
|
unsigned __grammar = __get_grammar(__flags_);
|
2010-06-29 18:37:43 +00:00
|
|
|
switch (*__first)
|
|
|
|
{
|
|
|
|
case '*':
|
|
|
|
++__first;
|
2010-07-29 00:36:00 +00:00
|
|
|
if (__grammar == ECMAScript && __first != __last && *__first == '?')
|
2010-07-27 01:25:38 +00:00
|
|
|
{
|
|
|
|
++__first;
|
|
|
|
__push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
|
2010-06-29 18:37:43 +00:00
|
|
|
break;
|
|
|
|
case '+':
|
|
|
|
++__first;
|
2010-07-29 00:36:00 +00:00
|
|
|
if (__grammar == ECMAScript && __first != __last && *__first == '?')
|
2010-07-27 01:25:38 +00:00
|
|
|
{
|
|
|
|
++__first;
|
|
|
|
__push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
|
2010-06-29 18:37:43 +00:00
|
|
|
break;
|
|
|
|
case '?':
|
|
|
|
++__first;
|
2010-07-29 00:36:00 +00:00
|
|
|
if (__grammar == ECMAScript && __first != __last && *__first == '?')
|
2010-07-27 01:25:38 +00:00
|
|
|
{
|
|
|
|
++__first;
|
|
|
|
__push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__push_loop(0, 1, __s, __mexp_begin, __mexp_end);
|
2010-06-29 18:37:43 +00:00
|
|
|
break;
|
|
|
|
case '{':
|
|
|
|
{
|
|
|
|
int __min;
|
2010-07-16 19:08:36 +00:00
|
|
|
_ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
|
2010-06-29 18:37:43 +00:00
|
|
|
if (__temp == __first)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_badbrace>();
|
2010-06-29 18:37:43 +00:00
|
|
|
__first = __temp;
|
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brace>();
|
2010-06-29 18:37:43 +00:00
|
|
|
switch (*__first)
|
|
|
|
{
|
|
|
|
case '}':
|
|
|
|
++__first;
|
2010-07-29 00:36:00 +00:00
|
|
|
if (__grammar == ECMAScript && __first != __last && *__first == '?')
|
2010-07-27 01:25:38 +00:00
|
|
|
{
|
|
|
|
++__first;
|
|
|
|
__push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
|
2010-06-29 18:37:43 +00:00
|
|
|
break;
|
|
|
|
case ',':
|
2010-08-11 17:04:31 +00:00
|
|
|
++__first;
|
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_badbrace>();
|
2010-06-29 18:37:43 +00:00
|
|
|
if (*__first == '}')
|
|
|
|
{
|
|
|
|
++__first;
|
2010-07-29 00:36:00 +00:00
|
|
|
if (__grammar == ECMAScript && __first != __last && *__first == '?')
|
2010-07-27 01:25:38 +00:00
|
|
|
{
|
|
|
|
++__first;
|
|
|
|
__push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
|
2010-06-29 18:37:43 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-07-16 19:08:36 +00:00
|
|
|
int __max = -1;
|
2010-06-29 18:37:43 +00:00
|
|
|
__temp = __parse_DUP_COUNT(__first, __last, __max);
|
|
|
|
if (__temp == __first)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brace>();
|
2010-06-29 18:37:43 +00:00
|
|
|
__first = __temp;
|
|
|
|
if (__first == __last || *__first != '}')
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brace>();
|
2010-06-29 18:37:43 +00:00
|
|
|
++__first;
|
|
|
|
if (__max < __min)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_badbrace>();
|
2010-07-29 00:36:00 +00:00
|
|
|
if (__grammar == ECMAScript && __first != __last && *__first == '?')
|
2010-07-27 01:25:38 +00:00
|
|
|
{
|
|
|
|
++__first;
|
|
|
|
__push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
|
2010-06-29 18:37:43 +00:00
|
|
|
}
|
2010-07-16 19:08:36 +00:00
|
|
|
break;
|
2010-06-29 18:37:43 +00:00
|
|
|
default:
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_badbrace>();
|
2010-06-29 18:37:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2010-06-25 20:56:08 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last && *__first == '[')
|
|
|
|
{
|
2010-08-11 17:04:31 +00:00
|
|
|
++__first;
|
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brack>();
|
2010-07-13 21:48:06 +00:00
|
|
|
bool __negate = false;
|
2010-06-25 20:56:08 +00:00
|
|
|
if (*__first == '^')
|
|
|
|
{
|
|
|
|
++__first;
|
2010-07-13 21:48:06 +00:00
|
|
|
__negate = true;
|
2010-06-25 20:56:08 +00:00
|
|
|
}
|
2010-07-13 21:48:06 +00:00
|
|
|
__bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
|
|
|
|
// __ml owned by *this
|
2010-06-25 20:56:08 +00:00
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brack>();
|
2019-03-28 17:30:23 +00:00
|
|
|
if (__get_grammar(__flags_) != ECMAScript && *__first == ']')
|
2010-06-25 20:56:08 +00:00
|
|
|
{
|
2010-07-13 21:48:06 +00:00
|
|
|
__ml->__add_char(']');
|
2010-06-25 20:56:08 +00:00
|
|
|
++__first;
|
|
|
|
}
|
2010-07-13 21:48:06 +00:00
|
|
|
__first = __parse_follow_list(__first, __last, __ml);
|
2010-06-25 20:56:08 +00:00
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brack>();
|
2010-06-25 20:56:08 +00:00
|
|
|
if (*__first == '-')
|
|
|
|
{
|
2010-07-13 21:48:06 +00:00
|
|
|
__ml->__add_char('-');
|
2010-06-25 20:56:08 +00:00
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
if (__first == __last || *__first != ']')
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brack>();
|
2010-06-25 20:56:08 +00:00
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
|
2010-07-13 21:48:06 +00:00
|
|
|
_ForwardIterator __last,
|
|
|
|
__bracket_expression<_CharT, _Traits>* __ml)
|
2010-06-25 20:56:08 +00:00
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
|
|
|
while (true)
|
|
|
|
{
|
2010-07-13 21:48:06 +00:00
|
|
|
_ForwardIterator __temp = __parse_expression_term(__first, __last,
|
|
|
|
__ml);
|
2010-06-25 20:56:08 +00:00
|
|
|
if (__temp == __first)
|
|
|
|
break;
|
|
|
|
__first = __temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
|
2010-07-13 21:48:06 +00:00
|
|
|
_ForwardIterator __last,
|
|
|
|
__bracket_expression<_CharT, _Traits>* __ml)
|
2010-06-25 20:56:08 +00:00
|
|
|
{
|
|
|
|
if (__first != __last && *__first != ']')
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-07-13 21:48:06 +00:00
|
|
|
basic_string<_CharT> __start_range;
|
2010-06-25 20:56:08 +00:00
|
|
|
if (__temp != __last && *__first == '[')
|
|
|
|
{
|
|
|
|
if (*__temp == '=')
|
2010-07-13 21:48:06 +00:00
|
|
|
return __parse_equivalence_class(++__temp, __last, __ml);
|
2010-06-25 20:56:08 +00:00
|
|
|
else if (*__temp == ':')
|
2010-07-13 21:48:06 +00:00
|
|
|
return __parse_character_class(++__temp, __last, __ml);
|
2010-06-25 20:56:08 +00:00
|
|
|
else if (*__temp == '.')
|
2010-07-13 21:48:06 +00:00
|
|
|
__first = __parse_collating_symbol(++__temp, __last, __start_range);
|
2010-06-25 20:56:08 +00:00
|
|
|
}
|
2019-03-28 17:30:23 +00:00
|
|
|
unsigned __grammar = __get_grammar(__flags_);
|
2010-07-28 17:35:27 +00:00
|
|
|
if (__start_range.empty())
|
2010-06-25 20:56:08 +00:00
|
|
|
{
|
2010-07-28 17:35:27 +00:00
|
|
|
if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
|
|
|
|
{
|
|
|
|
if (__grammar == ECMAScript)
|
|
|
|
__first = __parse_class_escape(++__first, __last, __start_range, __ml);
|
|
|
|
else
|
|
|
|
__first = __parse_awk_escape(++__first, __last, &__start_range);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__start_range = *__first;
|
|
|
|
++__first;
|
|
|
|
}
|
2010-06-25 20:56:08 +00:00
|
|
|
}
|
|
|
|
if (__first != __last && *__first != ']')
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
__temp = _VSTD::next(__first);
|
2010-06-25 20:56:08 +00:00
|
|
|
if (__temp != __last && *__first == '-' && *__temp != ']')
|
|
|
|
{
|
|
|
|
// parse a range
|
2010-07-13 21:48:06 +00:00
|
|
|
basic_string<_CharT> __end_range;
|
2010-06-25 20:56:08 +00:00
|
|
|
__first = __temp;
|
|
|
|
++__temp;
|
|
|
|
if (__temp != __last && *__first == '[' && *__temp == '.')
|
2010-07-13 21:48:06 +00:00
|
|
|
__first = __parse_collating_symbol(++__temp, __last, __end_range);
|
2010-06-25 20:56:08 +00:00
|
|
|
else
|
|
|
|
{
|
2010-07-28 17:35:27 +00:00
|
|
|
if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
|
|
|
|
{
|
|
|
|
if (__grammar == ECMAScript)
|
|
|
|
__first = __parse_class_escape(++__first, __last,
|
|
|
|
__end_range, __ml);
|
|
|
|
else
|
|
|
|
__first = __parse_awk_escape(++__first, __last,
|
|
|
|
&__end_range);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__end_range = *__first;
|
|
|
|
++__first;
|
|
|
|
}
|
2010-06-25 20:56:08 +00:00
|
|
|
}
|
2011-06-30 21:18:19 +00:00
|
|
|
__ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
|
2010-07-13 21:48:06 +00:00
|
|
|
}
|
2013-08-23 17:37:05 +00:00
|
|
|
else if (!__start_range.empty())
|
2010-07-13 21:48:06 +00:00
|
|
|
{
|
|
|
|
if (__start_range.size() == 1)
|
|
|
|
__ml->__add_char(__start_range[0]);
|
|
|
|
else
|
|
|
|
__ml->__add_digraph(__start_range[0], __start_range[1]);
|
2010-06-25 20:56:08 +00:00
|
|
|
}
|
|
|
|
}
|
2013-08-23 17:37:05 +00:00
|
|
|
else if (!__start_range.empty())
|
2010-07-13 21:48:06 +00:00
|
|
|
{
|
|
|
|
if (__start_range.size() == 1)
|
|
|
|
__ml->__add_char(__start_range[0]);
|
|
|
|
else
|
|
|
|
__ml->__add_digraph(__start_range[0], __start_range[1]);
|
|
|
|
}
|
2010-06-25 20:56:08 +00:00
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2010-07-28 17:35:27 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last,
|
|
|
|
basic_string<_CharT>& __str,
|
|
|
|
__bracket_expression<_CharT, _Traits>* __ml)
|
|
|
|
{
|
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2010-07-28 17:35:27 +00:00
|
|
|
switch (*__first)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
__str = *__first;
|
|
|
|
return ++__first;
|
|
|
|
case 'b':
|
|
|
|
__str = _CharT(8);
|
|
|
|
return ++__first;
|
|
|
|
case 'd':
|
|
|
|
__ml->__add_class(ctype_base::digit);
|
|
|
|
return ++__first;
|
|
|
|
case 'D':
|
|
|
|
__ml->__add_neg_class(ctype_base::digit);
|
|
|
|
return ++__first;
|
|
|
|
case 's':
|
|
|
|
__ml->__add_class(ctype_base::space);
|
|
|
|
return ++__first;
|
|
|
|
case 'S':
|
|
|
|
__ml->__add_neg_class(ctype_base::space);
|
|
|
|
return ++__first;
|
|
|
|
case 'w':
|
|
|
|
__ml->__add_class(ctype_base::alnum);
|
|
|
|
__ml->__add_char('_');
|
|
|
|
return ++__first;
|
|
|
|
case 'W':
|
|
|
|
__ml->__add_neg_class(ctype_base::alnum);
|
|
|
|
__ml->__add_neg_char('_');
|
|
|
|
return ++__first;
|
|
|
|
}
|
|
|
|
__first = __parse_character_escape(__first, __last, &__str);
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last,
|
|
|
|
basic_string<_CharT>* __str)
|
|
|
|
{
|
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2010-07-28 17:35:27 +00:00
|
|
|
switch (*__first)
|
|
|
|
{
|
|
|
|
case '\\':
|
|
|
|
case '"':
|
|
|
|
case '/':
|
|
|
|
if (__str)
|
|
|
|
*__str = *__first;
|
|
|
|
else
|
|
|
|
__push_char(*__first);
|
|
|
|
return ++__first;
|
|
|
|
case 'a':
|
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(7);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(7));
|
|
|
|
return ++__first;
|
|
|
|
case 'b':
|
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(8);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(8));
|
|
|
|
return ++__first;
|
|
|
|
case 'f':
|
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(0xC);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(0xC));
|
|
|
|
return ++__first;
|
|
|
|
case 'n':
|
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(0xA);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(0xA));
|
|
|
|
return ++__first;
|
|
|
|
case 'r':
|
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(0xD);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(0xD));
|
|
|
|
return ++__first;
|
|
|
|
case 't':
|
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(0x9);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(0x9));
|
|
|
|
return ++__first;
|
|
|
|
case 'v':
|
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(0xB);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(0xB));
|
|
|
|
return ++__first;
|
|
|
|
}
|
|
|
|
if ('0' <= *__first && *__first <= '7')
|
|
|
|
{
|
|
|
|
unsigned __val = *__first - '0';
|
|
|
|
if (++__first != __last && ('0' <= *__first && *__first <= '7'))
|
|
|
|
{
|
|
|
|
__val = 8 * __val + *__first - '0';
|
|
|
|
if (++__first != __last && ('0' <= *__first && *__first <= '7'))
|
2013-07-02 17:43:31 +00:00
|
|
|
__val = 8 * __val + *__first++ - '0';
|
2010-07-28 17:35:27 +00:00
|
|
|
}
|
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(__val);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(__val));
|
|
|
|
}
|
|
|
|
else
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2010-07-28 17:35:27 +00:00
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2010-06-25 20:56:08 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
|
2010-07-13 21:48:06 +00:00
|
|
|
_ForwardIterator __last,
|
|
|
|
__bracket_expression<_CharT, _Traits>* __ml)
|
2010-06-25 20:56:08 +00:00
|
|
|
{
|
|
|
|
// Found [=
|
|
|
|
// This means =] must exist
|
|
|
|
value_type _Equal_close[2] = {'=', ']'};
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
|
2010-06-25 20:56:08 +00:00
|
|
|
_Equal_close+2);
|
|
|
|
if (__temp == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brack>();
|
2010-06-25 20:56:08 +00:00
|
|
|
// [__first, __temp) contains all text in [= ... =]
|
|
|
|
string_type __collate_name =
|
|
|
|
__traits_.lookup_collatename(__first, __temp);
|
|
|
|
if (__collate_name.empty())
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_collate>();
|
2010-06-25 20:56:08 +00:00
|
|
|
string_type __equiv_name =
|
|
|
|
__traits_.transform_primary(__collate_name.begin(),
|
|
|
|
__collate_name.end());
|
|
|
|
if (!__equiv_name.empty())
|
2010-07-13 21:48:06 +00:00
|
|
|
__ml->__add_equivalence(__equiv_name);
|
2010-06-25 20:56:08 +00:00
|
|
|
else
|
2010-07-13 21:48:06 +00:00
|
|
|
{
|
|
|
|
switch (__collate_name.size())
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
__ml->__add_char(__collate_name[0]);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
__ml->__add_digraph(__collate_name[0], __collate_name[1]);
|
|
|
|
break;
|
|
|
|
default:
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_collate>();
|
2010-07-13 21:48:06 +00:00
|
|
|
}
|
|
|
|
}
|
2011-06-30 21:18:19 +00:00
|
|
|
__first = _VSTD::next(__temp, 2);
|
2010-06-25 20:56:08 +00:00
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
|
2010-07-13 21:48:06 +00:00
|
|
|
_ForwardIterator __last,
|
|
|
|
__bracket_expression<_CharT, _Traits>* __ml)
|
2010-06-25 20:56:08 +00:00
|
|
|
{
|
|
|
|
// Found [:
|
|
|
|
// This means :] must exist
|
|
|
|
value_type _Colon_close[2] = {':', ']'};
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
|
2010-06-25 20:56:08 +00:00
|
|
|
_Colon_close+2);
|
|
|
|
if (__temp == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brack>();
|
2010-06-25 20:56:08 +00:00
|
|
|
// [__first, __temp) contains all text in [: ... :]
|
|
|
|
typedef typename _Traits::char_class_type char_class_type;
|
|
|
|
char_class_type __class_type =
|
|
|
|
__traits_.lookup_classname(__first, __temp, __flags_ & icase);
|
|
|
|
if (__class_type == 0)
|
2018-01-24 12:45:18 +00:00
|
|
|
__throw_regex_error<regex_constants::error_ctype>();
|
2010-07-13 21:48:06 +00:00
|
|
|
__ml->__add_class(__class_type);
|
2011-06-30 21:18:19 +00:00
|
|
|
__first = _VSTD::next(__temp, 2);
|
2010-06-25 20:56:08 +00:00
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
|
2010-07-13 21:48:06 +00:00
|
|
|
_ForwardIterator __last,
|
|
|
|
basic_string<_CharT>& __col_sym)
|
2010-06-25 20:56:08 +00:00
|
|
|
{
|
|
|
|
// Found [.
|
|
|
|
// This means .] must exist
|
|
|
|
value_type _Dot_close[2] = {'.', ']'};
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
|
2010-06-25 20:56:08 +00:00
|
|
|
_Dot_close+2);
|
|
|
|
if (__temp == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_brack>();
|
2010-06-25 20:56:08 +00:00
|
|
|
// [__first, __temp) contains all text in [. ... .]
|
2010-07-13 21:48:06 +00:00
|
|
|
__col_sym = __traits_.lookup_collatename(__first, __temp);
|
|
|
|
switch (__col_sym.size())
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
case 2:
|
|
|
|
break;
|
|
|
|
default:
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_collate>();
|
2010-07-13 21:48:06 +00:00
|
|
|
}
|
2011-06-30 21:18:19 +00:00
|
|
|
__first = _VSTD::next(__temp, 2);
|
2010-06-25 20:56:08 +00:00
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last,
|
|
|
|
int& __c)
|
|
|
|
{
|
2014-01-18 03:40:03 +00:00
|
|
|
if (__first != __last )
|
2010-06-25 20:56:08 +00:00
|
|
|
{
|
2014-01-18 03:40:03 +00:00
|
|
|
int __val = __traits_.value(*__first, 10);
|
|
|
|
if ( __val != -1 )
|
2010-06-25 20:56:08 +00:00
|
|
|
{
|
2014-01-18 03:40:03 +00:00
|
|
|
__c = __val;
|
2019-05-29 16:01:36 +00:00
|
|
|
for (++__first;
|
2014-01-18 03:40:03 +00:00
|
|
|
__first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
|
|
|
|
++__first)
|
|
|
|
{
|
[libc++] Consistently replace `std::` qualification with `_VSTD::` or nothing. NFCI.
I used a lot of `git grep` to find places where `std::` was being used
outside of comments and assert-messages. There were three outcomes:
- Qualified function calls, e.g. `std::move` becomes `_VSTD::move`.
This is the most common case.
- Typenames that don't need qualification, e.g. `std::allocator` becomes `allocator`.
Leaving these as `_VSTD::allocator` would also be fine, but I decided
that removing the qualification is more consistent with existing practice.
- Names that specifically need un-versioned `std::` qualification,
or that I wasn't sure about. For example, I didn't touch any code in
<atomic>, <math.h>, <new>, or any ext/ or experimental/ headers;
and I didn't touch any instances of `std::type_info`.
In some deduction guides, we were accidentally using `class Alloc = typename std::allocator<T>`,
despite `std::allocator<T>`'s type-ness not being template-dependent.
Because `std::allocator` is a qualified name, this did parse as we intended;
but what we meant was simply `class Alloc = allocator<T>`.
Differential Revision: https://reviews.llvm.org/D92250
2020-11-27 11:02:06 -05:00
|
|
|
if (__c >= numeric_limits<int>::max() / 10)
|
2017-10-19 17:39:16 +00:00
|
|
|
__throw_regex_error<regex_constants::error_badbrace>();
|
2014-01-18 03:40:03 +00:00
|
|
|
__c *= 10;
|
|
|
|
__c += __val;
|
|
|
|
}
|
2010-06-25 20:56:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2010-07-22 17:53:24 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
__owns_one_state<_CharT>* __sa = __end_;
|
|
|
|
_ForwardIterator __temp = __parse_alternative(__first, __last);
|
|
|
|
if (__temp == __first)
|
|
|
|
__push_empty();
|
|
|
|
__first = __temp;
|
|
|
|
while (__first != __last && *__first == '|')
|
|
|
|
{
|
|
|
|
__owns_one_state<_CharT>* __sb = __end_;
|
|
|
|
__temp = __parse_alternative(++__first, __last);
|
|
|
|
if (__temp == __first)
|
|
|
|
__push_empty();
|
|
|
|
__push_alternation(__sa, __sb);
|
|
|
|
__first = __temp;
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
_ForwardIterator __temp = __parse_term(__first, __last);
|
|
|
|
if (__temp == __first)
|
|
|
|
break;
|
|
|
|
__first = __temp;
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
_ForwardIterator __temp = __parse_assertion(__first, __last);
|
|
|
|
if (__temp == __first)
|
|
|
|
{
|
2010-07-27 01:25:38 +00:00
|
|
|
__owns_one_state<_CharT>* __e = __end_;
|
|
|
|
unsigned __mexp_begin = __marked_count_;
|
2010-07-22 17:53:24 +00:00
|
|
|
__temp = __parse_atom(__first, __last);
|
|
|
|
if (__temp != __first)
|
2010-07-27 01:25:38 +00:00
|
|
|
__first = __parse_ERE_dupl_symbol(__temp, __last, __e,
|
|
|
|
__mexp_begin+1, __marked_count_+1);
|
2010-07-22 17:53:24 +00:00
|
|
|
}
|
2010-07-27 01:25:38 +00:00
|
|
|
else
|
|
|
|
__first = __temp;
|
2010-07-22 17:53:24 +00:00
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
|
|
|
switch (*__first)
|
|
|
|
{
|
|
|
|
case '^':
|
|
|
|
__push_l_anchor();
|
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case '$':
|
|
|
|
__push_r_anchor();
|
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case '\\':
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-07-22 17:53:24 +00:00
|
|
|
if (__temp != __last)
|
|
|
|
{
|
|
|
|
if (*__temp == 'b')
|
|
|
|
{
|
2010-07-27 01:25:38 +00:00
|
|
|
__push_word_boundary(false);
|
2010-07-22 17:53:24 +00:00
|
|
|
__first = ++__temp;
|
|
|
|
}
|
|
|
|
else if (*__temp == 'B')
|
|
|
|
{
|
2010-07-27 01:25:38 +00:00
|
|
|
__push_word_boundary(true);
|
2010-07-22 17:53:24 +00:00
|
|
|
__first = ++__temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case '(':
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-07-22 17:53:24 +00:00
|
|
|
if (__temp != __last && *__temp == '?')
|
|
|
|
{
|
|
|
|
if (++__temp != __last)
|
|
|
|
{
|
|
|
|
switch (*__temp)
|
|
|
|
{
|
|
|
|
case '=':
|
2010-07-27 22:20:32 +00:00
|
|
|
{
|
|
|
|
basic_regex __exp;
|
|
|
|
__exp.__flags_ = __flags_;
|
|
|
|
__temp = __exp.__parse(++__temp, __last);
|
2013-07-23 16:18:04 +00:00
|
|
|
unsigned __mexp = __exp.__marked_count_;
|
|
|
|
__push_lookahead(_VSTD::move(__exp), false, __marked_count_);
|
|
|
|
__marked_count_ += __mexp;
|
2010-07-27 22:20:32 +00:00
|
|
|
if (__temp == __last || *__temp != ')')
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_paren>();
|
2010-07-27 22:20:32 +00:00
|
|
|
__first = ++__temp;
|
|
|
|
}
|
2010-07-22 17:53:24 +00:00
|
|
|
break;
|
|
|
|
case '!':
|
2010-07-27 22:20:32 +00:00
|
|
|
{
|
|
|
|
basic_regex __exp;
|
|
|
|
__exp.__flags_ = __flags_;
|
|
|
|
__temp = __exp.__parse(++__temp, __last);
|
2013-07-23 16:18:04 +00:00
|
|
|
unsigned __mexp = __exp.__marked_count_;
|
|
|
|
__push_lookahead(_VSTD::move(__exp), true, __marked_count_);
|
|
|
|
__marked_count_ += __mexp;
|
2010-07-27 22:20:32 +00:00
|
|
|
if (__temp == __last || *__temp != ')')
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_paren>();
|
2010-07-27 22:20:32 +00:00
|
|
|
__first = ++__temp;
|
|
|
|
}
|
2010-07-22 17:53:24 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
2010-07-27 01:25:38 +00:00
|
|
|
if (__first != __last)
|
|
|
|
{
|
|
|
|
switch (*__first)
|
|
|
|
{
|
|
|
|
case '.':
|
|
|
|
__push_match_any_but_newline();
|
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case '\\':
|
|
|
|
__first = __parse_atom_escape(__first, __last);
|
|
|
|
break;
|
|
|
|
case '[':
|
|
|
|
__first = __parse_bracket_expression(__first, __last);
|
|
|
|
break;
|
|
|
|
case '(':
|
|
|
|
{
|
2010-08-11 17:04:31 +00:00
|
|
|
++__first;
|
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_paren>();
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __temp = _VSTD::next(__first);
|
2010-07-27 01:25:38 +00:00
|
|
|
if (__temp != __last && *__first == '?' && *__temp == ':')
|
|
|
|
{
|
|
|
|
++__open_count_;
|
|
|
|
__first = __parse_ecma_exp(++__temp, __last);
|
|
|
|
if (__first == __last || *__first != ')')
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_paren>();
|
2010-07-27 01:25:38 +00:00
|
|
|
--__open_count_;
|
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__push_begin_marked_subexpression();
|
|
|
|
unsigned __temp_count = __marked_count_;
|
|
|
|
++__open_count_;
|
|
|
|
__first = __parse_ecma_exp(__first, __last);
|
|
|
|
if (__first == __last || *__first != ')')
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_paren>();
|
2010-07-27 01:25:38 +00:00
|
|
|
__push_end_marked_subexpression(__temp_count);
|
|
|
|
--__open_count_;
|
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2015-07-23 18:27:51 +00:00
|
|
|
case '*':
|
|
|
|
case '+':
|
|
|
|
case '?':
|
|
|
|
case '{':
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_badrepeat>();
|
2015-07-23 18:27:51 +00:00
|
|
|
break;
|
2010-07-27 01:25:38 +00:00
|
|
|
default:
|
|
|
|
__first = __parse_pattern_character(__first, __last);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last && *__first == '\\')
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __t1 = _VSTD::next(__first);
|
2016-01-19 00:50:37 +00:00
|
|
|
if (__t1 == __last)
|
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
|
|
|
|
2010-07-27 01:25:38 +00:00
|
|
|
_ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
|
|
|
|
if (__t2 != __t1)
|
|
|
|
__first = __t2;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__t2 = __parse_character_class_escape(__t1, __last);
|
|
|
|
if (__t2 != __t1)
|
|
|
|
__first = __t2;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
__t2 = __parse_character_escape(__t1, __last);
|
|
|
|
if (__t2 != __t1)
|
|
|
|
__first = __t2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
|
|
|
if (*__first == '0')
|
|
|
|
{
|
|
|
|
__push_char(_CharT());
|
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
else if ('1' <= *__first && *__first <= '9')
|
|
|
|
{
|
|
|
|
unsigned __v = *__first - '0';
|
2016-12-24 17:21:03 +00:00
|
|
|
for (++__first;
|
|
|
|
__first != __last && '0' <= *__first && *__first <= '9'; ++__first)
|
2017-10-19 22:10:41 +00:00
|
|
|
{
|
[libc++] Consistently replace `std::` qualification with `_VSTD::` or nothing. NFCI.
I used a lot of `git grep` to find places where `std::` was being used
outside of comments and assert-messages. There were three outcomes:
- Qualified function calls, e.g. `std::move` becomes `_VSTD::move`.
This is the most common case.
- Typenames that don't need qualification, e.g. `std::allocator` becomes `allocator`.
Leaving these as `_VSTD::allocator` would also be fine, but I decided
that removing the qualification is more consistent with existing practice.
- Names that specifically need un-versioned `std::` qualification,
or that I wasn't sure about. For example, I didn't touch any code in
<atomic>, <math.h>, <new>, or any ext/ or experimental/ headers;
and I didn't touch any instances of `std::type_info`.
In some deduction guides, we were accidentally using `class Alloc = typename std::allocator<T>`,
despite `std::allocator<T>`'s type-ness not being template-dependent.
Because `std::allocator` is a qualified name, this did parse as we intended;
but what we meant was simply `class Alloc = allocator<T>`.
Differential Revision: https://reviews.llvm.org/D92250
2020-11-27 11:02:06 -05:00
|
|
|
if (__v >= numeric_limits<unsigned>::max() / 10)
|
2017-10-19 22:10:41 +00:00
|
|
|
__throw_regex_error<regex_constants::error_backref>();
|
2010-07-27 01:25:38 +00:00
|
|
|
__v = 10 * __v + *__first - '0';
|
2017-10-19 22:10:41 +00:00
|
|
|
}
|
|
|
|
if (__v == 0 || __v > mark_count())
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_backref>();
|
2010-07-27 01:25:38 +00:00
|
|
|
__push_back_ref(__v);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
|
|
|
__bracket_expression<_CharT, _Traits>* __ml;
|
|
|
|
switch (*__first)
|
|
|
|
{
|
|
|
|
case 'd':
|
|
|
|
__ml = __start_matching_list(false);
|
|
|
|
__ml->__add_class(ctype_base::digit);
|
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case 'D':
|
|
|
|
__ml = __start_matching_list(true);
|
|
|
|
__ml->__add_class(ctype_base::digit);
|
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case 's':
|
|
|
|
__ml = __start_matching_list(false);
|
|
|
|
__ml->__add_class(ctype_base::space);
|
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case 'S':
|
|
|
|
__ml = __start_matching_list(true);
|
|
|
|
__ml->__add_class(ctype_base::space);
|
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case 'w':
|
|
|
|
__ml = __start_matching_list(false);
|
|
|
|
__ml->__add_class(ctype_base::alnum);
|
|
|
|
__ml->__add_char('_');
|
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case 'W':
|
|
|
|
__ml = __start_matching_list(true);
|
|
|
|
__ml->__add_class(ctype_base::alnum);
|
|
|
|
__ml->__add_char('_');
|
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
|
2010-07-28 17:35:27 +00:00
|
|
|
_ForwardIterator __last,
|
|
|
|
basic_string<_CharT>* __str)
|
2010-07-27 01:25:38 +00:00
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
|
|
|
_ForwardIterator __t;
|
|
|
|
unsigned __sum = 0;
|
|
|
|
int __hd;
|
|
|
|
switch (*__first)
|
|
|
|
{
|
|
|
|
case 'f':
|
2010-07-28 17:35:27 +00:00
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(0xC);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(0xC));
|
2010-07-27 01:25:38 +00:00
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case 'n':
|
2010-07-28 17:35:27 +00:00
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(0xA);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(0xA));
|
2010-07-27 01:25:38 +00:00
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case 'r':
|
2010-07-28 17:35:27 +00:00
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(0xD);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(0xD));
|
2010-07-27 01:25:38 +00:00
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case 't':
|
2010-07-28 17:35:27 +00:00
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(0x9);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(0x9));
|
2010-07-27 01:25:38 +00:00
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case 'v':
|
2010-07-28 17:35:27 +00:00
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(0xB);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(0xB));
|
2010-07-27 01:25:38 +00:00
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
case 'c':
|
2011-06-30 21:18:19 +00:00
|
|
|
if ((__t = _VSTD::next(__first)) != __last)
|
2010-07-27 01:25:38 +00:00
|
|
|
{
|
2019-05-29 16:01:36 +00:00
|
|
|
if (('A' <= *__t && *__t <= 'Z') ||
|
2013-07-15 18:21:11 +00:00
|
|
|
('a' <= *__t && *__t <= 'z'))
|
2010-07-27 01:25:38 +00:00
|
|
|
{
|
2010-07-28 17:35:27 +00:00
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(*__t % 32);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(*__t % 32));
|
2010-07-27 01:25:38 +00:00
|
|
|
__first = ++__t;
|
|
|
|
}
|
2019-05-29 16:01:36 +00:00
|
|
|
else
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2010-07-27 01:25:38 +00:00
|
|
|
}
|
2013-07-15 18:21:11 +00:00
|
|
|
else
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2010-07-27 01:25:38 +00:00
|
|
|
break;
|
|
|
|
case 'u':
|
2010-08-11 17:04:31 +00:00
|
|
|
++__first;
|
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2010-07-27 01:25:38 +00:00
|
|
|
__hd = __traits_.value(*__first, 16);
|
|
|
|
if (__hd == -1)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2011-12-01 20:21:04 +00:00
|
|
|
__sum = 16 * __sum + static_cast<unsigned>(__hd);
|
2010-08-11 17:04:31 +00:00
|
|
|
++__first;
|
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2010-07-27 01:25:38 +00:00
|
|
|
__hd = __traits_.value(*__first, 16);
|
|
|
|
if (__hd == -1)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2011-12-01 20:21:04 +00:00
|
|
|
__sum = 16 * __sum + static_cast<unsigned>(__hd);
|
2021-07-27 17:30:47 -04:00
|
|
|
// fallthrough
|
2010-07-27 01:25:38 +00:00
|
|
|
case 'x':
|
2010-08-11 17:04:31 +00:00
|
|
|
++__first;
|
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2010-07-27 01:25:38 +00:00
|
|
|
__hd = __traits_.value(*__first, 16);
|
|
|
|
if (__hd == -1)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2011-12-01 20:21:04 +00:00
|
|
|
__sum = 16 * __sum + static_cast<unsigned>(__hd);
|
2010-08-11 17:04:31 +00:00
|
|
|
++__first;
|
|
|
|
if (__first == __last)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2010-07-27 01:25:38 +00:00
|
|
|
__hd = __traits_.value(*__first, 16);
|
|
|
|
if (__hd == -1)
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2011-12-01 20:21:04 +00:00
|
|
|
__sum = 16 * __sum + static_cast<unsigned>(__hd);
|
2010-07-28 17:35:27 +00:00
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(__sum);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(__sum));
|
2010-07-27 01:25:38 +00:00
|
|
|
++__first;
|
|
|
|
break;
|
2014-05-21 16:29:50 +00:00
|
|
|
case '0':
|
|
|
|
if (__str)
|
|
|
|
*__str = _CharT(0);
|
|
|
|
else
|
|
|
|
__push_char(_CharT(0));
|
|
|
|
++__first;
|
|
|
|
break;
|
2010-07-27 01:25:38 +00:00
|
|
|
default:
|
|
|
|
if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
|
|
|
|
{
|
2010-07-28 17:35:27 +00:00
|
|
|
if (__str)
|
|
|
|
*__str = *__first;
|
|
|
|
else
|
|
|
|
__push_char(*__first);
|
2010-07-27 01:25:38 +00:00
|
|
|
++__first;
|
|
|
|
}
|
2013-06-28 18:57:30 +00:00
|
|
|
else
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
2010-07-27 01:25:38 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
if (__first != __last)
|
|
|
|
{
|
|
|
|
switch (*__first)
|
|
|
|
{
|
|
|
|
case '^':
|
|
|
|
case '$':
|
|
|
|
case '\\':
|
|
|
|
case '.':
|
|
|
|
case '*':
|
|
|
|
case '+':
|
|
|
|
case '?':
|
|
|
|
case '(':
|
|
|
|
case ')':
|
|
|
|
case '[':
|
|
|
|
case ']':
|
|
|
|
case '{':
|
|
|
|
case '}':
|
|
|
|
case '|':
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
__push_char(*__first);
|
|
|
|
++__first;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return __first;
|
2010-07-22 17:53:24 +00:00
|
|
|
}
|
|
|
|
|
2010-07-27 19:53:10 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
__owns_one_state<_CharT>* __sa = __end_;
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
|
2010-07-27 19:53:10 +00:00
|
|
|
if (__t1 != __first)
|
|
|
|
__parse_basic_reg_exp(__first, __t1);
|
|
|
|
else
|
|
|
|
__push_empty();
|
|
|
|
__first = __t1;
|
|
|
|
if (__first != __last)
|
|
|
|
++__first;
|
|
|
|
while (__first != __last)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
__t1 = _VSTD::find(__first, __last, _CharT('\n'));
|
2010-07-27 19:53:10 +00:00
|
|
|
__owns_one_state<_CharT>* __sb = __end_;
|
|
|
|
if (__t1 != __first)
|
|
|
|
__parse_basic_reg_exp(__first, __t1);
|
|
|
|
else
|
|
|
|
__push_empty();
|
|
|
|
__push_alternation(__sa, __sb);
|
|
|
|
__first = __t1;
|
|
|
|
if (__first != __last)
|
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
template <class _ForwardIterator>
|
|
|
|
_ForwardIterator
|
|
|
|
basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
|
|
|
|
_ForwardIterator __last)
|
|
|
|
{
|
|
|
|
__owns_one_state<_CharT>* __sa = __end_;
|
2011-06-30 21:18:19 +00:00
|
|
|
_ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
|
2010-07-27 19:53:10 +00:00
|
|
|
if (__t1 != __first)
|
|
|
|
__parse_extended_reg_exp(__first, __t1);
|
|
|
|
else
|
|
|
|
__push_empty();
|
|
|
|
__first = __t1;
|
|
|
|
if (__first != __last)
|
|
|
|
++__first;
|
|
|
|
while (__first != __last)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
__t1 = _VSTD::find(__first, __last, _CharT('\n'));
|
2010-07-27 19:53:10 +00:00
|
|
|
__owns_one_state<_CharT>* __sb = __end_;
|
|
|
|
if (__t1 != __first)
|
|
|
|
__parse_extended_reg_exp(__first, __t1);
|
|
|
|
else
|
|
|
|
__push_empty();
|
|
|
|
__push_alternation(__sa, __sb);
|
|
|
|
__first = __t1;
|
|
|
|
if (__first != __last)
|
|
|
|
++__first;
|
|
|
|
}
|
|
|
|
return __first;
|
|
|
|
}
|
|
|
|
|
2020-02-19 15:56:15 -05:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
bool
|
2022-07-08 18:17:26 +02:00
|
|
|
basic_regex<_CharT, _Traits>::__test_back_ref(_CharT __c)
|
2020-02-19 15:56:15 -05:00
|
|
|
{
|
2022-07-08 18:17:26 +02:00
|
|
|
unsigned __val = __traits_.value(__c, 10);
|
2020-02-19 15:56:15 -05:00
|
|
|
if (__val >= 1 && __val <= 9)
|
|
|
|
{
|
2020-02-20 18:13:38 -05:00
|
|
|
if (__val > mark_count())
|
|
|
|
__throw_regex_error<regex_constants::error_backref>();
|
2020-02-19 15:56:15 -05:00
|
|
|
__push_back_ref(__val);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2010-06-29 18:37:43 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
2010-07-07 19:14:52 +00:00
|
|
|
basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
|
|
|
|
__owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
|
|
|
|
bool __greedy)
|
|
|
|
{
|
|
|
|
unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
|
|
|
|
__end_->first() = nullptr;
|
2010-07-12 15:51:17 +00:00
|
|
|
unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
|
|
|
|
__s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
|
|
|
|
__min, __max));
|
|
|
|
__s->first() = nullptr;
|
|
|
|
__e1.release();
|
|
|
|
__end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
|
2010-07-07 19:14:52 +00:00
|
|
|
__end_ = __e2->second();
|
2010-07-12 15:51:17 +00:00
|
|
|
__s->first() = __e2.release();
|
2010-07-07 19:14:52 +00:00
|
|
|
++__loop_count_;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_char(value_type __c)
|
|
|
|
{
|
2010-07-13 21:48:06 +00:00
|
|
|
if (flags() & icase)
|
2010-07-12 19:11:27 +00:00
|
|
|
__end_->first() = new __match_char_icase<_CharT, _Traits>
|
|
|
|
(__traits_, __c, __end_->first());
|
2010-07-13 21:48:06 +00:00
|
|
|
else if (flags() & collate)
|
2010-07-12 19:11:27 +00:00
|
|
|
__end_->first() = new __match_char_collate<_CharT, _Traits>
|
|
|
|
(__traits_, __c, __end_->first());
|
|
|
|
else
|
|
|
|
__end_->first() = new __match_char<_CharT>(__c, __end_->first());
|
2010-07-08 17:43:58 +00:00
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
2010-06-29 18:37:43 +00:00
|
|
|
}
|
|
|
|
|
2010-06-30 20:30:19 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
|
|
|
|
{
|
2010-07-14 15:45:11 +00:00
|
|
|
if (!(__flags_ & nosubs))
|
|
|
|
{
|
|
|
|
__end_->first() =
|
|
|
|
new __begin_marked_subexpression<_CharT>(++__marked_count_,
|
|
|
|
__end_->first());
|
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
|
|
|
}
|
2010-06-30 20:30:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
|
|
|
|
{
|
2010-07-14 15:45:11 +00:00
|
|
|
if (!(__flags_ & nosubs))
|
|
|
|
{
|
|
|
|
__end_->first() =
|
|
|
|
new __end_marked_subexpression<_CharT>(__sub, __end_->first());
|
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
|
|
|
}
|
2010-06-30 20:30:19 +00:00
|
|
|
}
|
|
|
|
|
2011-03-26 20:02:27 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_l_anchor()
|
|
|
|
{
|
2020-11-18 18:09:13 +01:00
|
|
|
__end_->first() = new __l_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
|
2011-03-26 20:02:27 +00:00
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
|
|
|
}
|
|
|
|
|
2010-07-09 00:15:26 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_r_anchor()
|
|
|
|
{
|
2020-11-18 18:09:13 +01:00
|
|
|
__end_->first() = new __r_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
|
2010-07-09 00:15:26 +00:00
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
|
|
|
}
|
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_match_any()
|
|
|
|
{
|
|
|
|
__end_->first() = new __match_any<_CharT>(__end_->first());
|
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
|
|
|
}
|
2010-07-09 00:15:26 +00:00
|
|
|
|
2010-07-27 01:25:38 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
|
|
|
|
{
|
|
|
|
__end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
|
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
|
|
|
}
|
|
|
|
|
2010-07-22 17:53:24 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_empty()
|
|
|
|
{
|
|
|
|
__end_->first() = new __empty_state<_CharT>(__end_->first());
|
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
|
|
|
}
|
|
|
|
|
2010-07-27 01:25:38 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
|
|
|
|
{
|
|
|
|
__end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
|
|
|
|
__end_->first());
|
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
|
|
|
}
|
|
|
|
|
2010-07-12 18:16:05 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
|
|
|
|
{
|
2010-07-13 21:48:06 +00:00
|
|
|
if (flags() & icase)
|
2010-07-12 19:11:27 +00:00
|
|
|
__end_->first() = new __back_ref_icase<_CharT, _Traits>
|
|
|
|
(__traits_, __i, __end_->first());
|
2010-07-13 21:48:06 +00:00
|
|
|
else if (flags() & collate)
|
2010-07-12 19:11:27 +00:00
|
|
|
__end_->first() = new __back_ref_collate<_CharT, _Traits>
|
|
|
|
(__traits_, __i, __end_->first());
|
|
|
|
else
|
|
|
|
__end_->first() = new __back_ref<_CharT>(__i, __end_->first());
|
2010-07-12 18:16:05 +00:00
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
2010-07-16 19:08:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
|
|
|
|
__owns_one_state<_CharT>* __ea)
|
|
|
|
{
|
|
|
|
__sa->first() = new __alternate<_CharT>(
|
|
|
|
static_cast<__owns_one_state<_CharT>*>(__sa->first()),
|
|
|
|
static_cast<__owns_one_state<_CharT>*>(__ea->first()));
|
|
|
|
__ea->first() = nullptr;
|
|
|
|
__ea->first() = new __empty_state<_CharT>(__end_->first());
|
|
|
|
__end_->first() = nullptr;
|
|
|
|
__end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
|
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
|
2010-07-12 18:16:05 +00:00
|
|
|
}
|
|
|
|
|
2010-07-13 21:48:06 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
__bracket_expression<_CharT, _Traits>*
|
|
|
|
basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
|
|
|
|
{
|
|
|
|
__bracket_expression<_CharT, _Traits>* __r =
|
|
|
|
new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
|
|
|
|
__negate, __flags_ & icase,
|
|
|
|
__flags_ & collate);
|
|
|
|
__end_->first() = __r;
|
|
|
|
__end_ = __r;
|
|
|
|
return __r;
|
|
|
|
}
|
|
|
|
|
2010-07-27 22:20:32 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
|
2013-07-23 16:18:04 +00:00
|
|
|
bool __invert,
|
|
|
|
unsigned __mexp)
|
2010-07-27 22:20:32 +00:00
|
|
|
{
|
|
|
|
__end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
|
2013-07-23 16:18:04 +00:00
|
|
|
__end_->first(), __mexp);
|
2010-07-27 22:20:32 +00:00
|
|
|
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
|
|
|
}
|
|
|
|
|
2020-12-08 00:42:26 -08:00
|
|
|
// sub_match
|
2020-11-11 17:12:18 -08:00
|
|
|
|
2020-11-11 17:12:18 -08:00
|
|
|
typedef sub_match<const char*> csub_match;
|
|
|
|
typedef sub_match<string::const_iterator> ssub_match;
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
|
|
|
typedef sub_match<const wchar_t*> wcsub_match;
|
2020-11-11 17:12:18 -08:00
|
|
|
typedef sub_match<wstring::const_iterator> wssub_match;
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2020-11-11 17:12:18 -08:00
|
|
|
|
2010-06-29 18:37:43 +00:00
|
|
|
template <class _BidirectionalIterator>
|
2020-11-11 17:12:18 -08:00
|
|
|
class
|
|
|
|
_LIBCPP_TEMPLATE_VIS
|
|
|
|
_LIBCPP_PREFERRED_NAME(csub_match)
|
2021-08-23 15:32:36 -04:00
|
|
|
_LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcsub_match))
|
2020-11-11 17:12:18 -08:00
|
|
|
_LIBCPP_PREFERRED_NAME(ssub_match)
|
2021-08-23 15:32:36 -04:00
|
|
|
_LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wssub_match))
|
2020-11-11 17:12:18 -08:00
|
|
|
sub_match
|
2010-06-29 18:37:43 +00:00
|
|
|
: public pair<_BidirectionalIterator, _BidirectionalIterator>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef _BidirectionalIterator iterator;
|
|
|
|
typedef typename iterator_traits<iterator>::value_type value_type;
|
|
|
|
typedef typename iterator_traits<iterator>::difference_type difference_type;
|
|
|
|
typedef basic_string<value_type> string_type;
|
|
|
|
|
|
|
|
bool matched;
|
|
|
|
|
2010-12-08 21:07:55 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2012-07-21 01:31:58 +00:00
|
|
|
_LIBCPP_CONSTEXPR sub_match() : matched() {}
|
2010-12-08 21:07:55 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-29 18:37:43 +00:00
|
|
|
difference_type length() const
|
2011-06-30 21:18:19 +00:00
|
|
|
{return matched ? _VSTD::distance(this->first, this->second) : 0;}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-29 18:37:43 +00:00
|
|
|
string_type str() const
|
|
|
|
{return matched ? string_type(this->first, this->second) : string_type();}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-29 18:37:43 +00:00
|
|
|
operator string_type() const
|
|
|
|
{return str();}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-29 18:37:43 +00:00
|
|
|
int compare(const sub_match& __s) const
|
|
|
|
{return str().compare(__s.str());}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-29 18:37:43 +00:00
|
|
|
int compare(const string_type& __s) const
|
|
|
|
{return str().compare(__s);}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-29 18:37:43 +00:00
|
|
|
int compare(const value_type* __s) const
|
|
|
|
{return str().compare(__s);}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return __x.compare(__y) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__x == __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return __x.compare(__y) < 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__y < __x);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__x < __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return __y < __x;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
2014-12-15 23:57:56 +00:00
|
|
|
return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
|
2010-06-29 18:37:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__x == __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
2014-12-15 23:57:56 +00:00
|
|
|
return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
|
2010-06-29 18:37:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return __y < __x;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__x < __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__y < __x);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator==(const sub_match<_BiIter>& __x,
|
|
|
|
const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
|
|
|
|
{
|
2014-12-15 23:57:56 +00:00
|
|
|
return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
|
2010-06-29 18:37:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator!=(const sub_match<_BiIter>& __x,
|
|
|
|
const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
|
|
|
|
{
|
|
|
|
return !(__x == __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<(const sub_match<_BiIter>& __x,
|
|
|
|
const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
|
|
|
|
{
|
2014-12-15 23:57:56 +00:00
|
|
|
return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
|
2010-06-29 18:37:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool operator>(const sub_match<_BiIter>& __x,
|
|
|
|
const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
|
|
|
|
{
|
|
|
|
return __y < __x;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>=(const sub_match<_BiIter>& __x,
|
|
|
|
const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
|
|
|
|
{
|
|
|
|
return !(__x < __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<=(const sub_match<_BiIter>& __x,
|
|
|
|
const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
|
|
|
|
{
|
|
|
|
return !(__y < __x);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator==(typename iterator_traits<_BiIter>::value_type const* __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return __y.compare(__x) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__x == __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<(typename iterator_traits<_BiIter>::value_type const* __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return __y.compare(__x) > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>(typename iterator_traits<_BiIter>::value_type const* __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return __y < __x;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__x < __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__y < __x);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator==(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const* __y)
|
|
|
|
{
|
|
|
|
return __x.compare(__y) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator!=(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const* __y)
|
|
|
|
{
|
|
|
|
return !(__x == __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const* __y)
|
|
|
|
{
|
|
|
|
return __x.compare(__y) < 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const* __y)
|
|
|
|
{
|
|
|
|
return __y < __x;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>=(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const* __y)
|
|
|
|
{
|
|
|
|
return !(__x < __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<=(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const* __y)
|
|
|
|
{
|
|
|
|
return !(__y < __x);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator==(typename iterator_traits<_BiIter>::value_type const& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
|
|
|
|
return __y.compare(string_type(1, __x)) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__x == __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<(typename iterator_traits<_BiIter>::value_type const& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
|
|
|
|
return __y.compare(string_type(1, __x)) > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>(typename iterator_traits<_BiIter>::value_type const& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return __y < __x;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__x < __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
|
|
|
|
const sub_match<_BiIter>& __y)
|
|
|
|
{
|
|
|
|
return !(__y < __x);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator==(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const& __y)
|
|
|
|
{
|
|
|
|
typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
|
|
|
|
return __x.compare(string_type(1, __y)) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator!=(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const& __y)
|
|
|
|
{
|
|
|
|
return !(__x == __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const& __y)
|
|
|
|
{
|
|
|
|
typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
|
|
|
|
return __x.compare(string_type(1, __y)) < 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const& __y)
|
|
|
|
{
|
|
|
|
return __y < __x;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator>=(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const& __y)
|
|
|
|
{
|
|
|
|
return !(__x < __y);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator<=(const sub_match<_BiIter>& __x,
|
|
|
|
typename iterator_traits<_BiIter>::value_type const& __y)
|
|
|
|
{
|
|
|
|
return !(__y < __x);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _ST, class _BiIter>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
basic_ostream<_CharT, _ST>&
|
|
|
|
operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
|
|
|
|
{
|
|
|
|
return __os << __m.str();
|
|
|
|
}
|
|
|
|
|
2020-11-11 17:12:18 -08:00
|
|
|
typedef match_results<const char*> cmatch;
|
|
|
|
typedef match_results<string::const_iterator> smatch;
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
|
|
|
typedef match_results<const wchar_t*> wcmatch;
|
2020-11-11 17:12:18 -08:00
|
|
|
typedef match_results<wstring::const_iterator> wsmatch;
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2020-11-11 17:12:18 -08:00
|
|
|
|
2010-07-27 01:25:38 +00:00
|
|
|
template <class _BidirectionalIterator, class _Allocator>
|
2020-11-11 17:12:18 -08:00
|
|
|
class
|
|
|
|
_LIBCPP_TEMPLATE_VIS
|
|
|
|
_LIBCPP_PREFERRED_NAME(cmatch)
|
2021-08-23 15:32:36 -04:00
|
|
|
_LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcmatch))
|
2020-11-11 17:12:18 -08:00
|
|
|
_LIBCPP_PREFERRED_NAME(smatch)
|
2021-08-23 15:32:36 -04:00
|
|
|
_LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsmatch))
|
2020-11-11 17:12:18 -08:00
|
|
|
match_results
|
2010-06-30 00:21:42 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef _Allocator allocator_type;
|
|
|
|
typedef sub_match<_BidirectionalIterator> value_type;
|
|
|
|
private:
|
|
|
|
typedef vector<value_type, allocator_type> __container_type;
|
|
|
|
|
|
|
|
__container_type __matches_;
|
|
|
|
value_type __unmatched_;
|
|
|
|
value_type __prefix_;
|
|
|
|
value_type __suffix_;
|
2010-12-08 21:07:55 +00:00
|
|
|
bool __ready_;
|
2010-06-30 00:21:42 +00:00
|
|
|
public:
|
2010-08-16 20:21:16 +00:00
|
|
|
_BidirectionalIterator __position_start_;
|
2010-06-30 00:21:42 +00:00
|
|
|
typedef const value_type& const_reference;
|
2014-02-26 01:56:31 +00:00
|
|
|
typedef value_type& reference;
|
2010-06-30 00:21:42 +00:00
|
|
|
typedef typename __container_type::const_iterator const_iterator;
|
|
|
|
typedef const_iterator iterator;
|
|
|
|
typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
|
|
|
|
typedef typename allocator_traits<allocator_type>::size_type size_type;
|
|
|
|
typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
|
|
|
|
typedef basic_string<char_type> string_type;
|
|
|
|
|
|
|
|
// construct/copy/destroy:
|
2021-01-19 08:21:09 +01:00
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
|
|
match_results() : match_results(allocator_type()) {}
|
|
|
|
explicit match_results(const allocator_type& __a);
|
|
|
|
#else
|
2010-06-30 00:21:42 +00:00
|
|
|
explicit match_results(const allocator_type& __a = allocator_type());
|
2021-01-19 08:21:09 +01:00
|
|
|
#endif
|
|
|
|
|
2010-06-30 00:21:42 +00:00
|
|
|
// match_results(const match_results&) = default;
|
|
|
|
// match_results& operator=(const match_results&) = default;
|
|
|
|
// match_results(match_results&& __m) = default;
|
|
|
|
// match_results& operator=(match_results&& __m) = default;
|
|
|
|
// ~match_results() = default;
|
|
|
|
|
2010-12-08 21:07:55 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool ready() const {return __ready_;}
|
|
|
|
|
2010-06-30 00:21:42 +00:00
|
|
|
// size:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2017-11-16 04:48:34 +00:00
|
|
|
size_type size() const _NOEXCEPT {return __matches_.size();}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2017-11-16 04:48:34 +00:00
|
|
|
size_type max_size() const _NOEXCEPT {return __matches_.max_size();}
|
|
|
|
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool empty() const _NOEXCEPT {return size() == 0;}
|
2010-06-30 00:21:42 +00:00
|
|
|
|
|
|
|
// element access:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-30 00:21:42 +00:00
|
|
|
difference_type length(size_type __sub = 0) const
|
2019-04-26 17:10:03 +00:00
|
|
|
{
|
|
|
|
_LIBCPP_ASSERT(ready(), "match_results::length() called when not ready");
|
|
|
|
return (*this)[__sub].length();
|
|
|
|
}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-30 00:21:42 +00:00
|
|
|
difference_type position(size_type __sub = 0) const
|
2019-04-26 17:10:03 +00:00
|
|
|
{
|
|
|
|
_LIBCPP_ASSERT(ready(), "match_results::position() called when not ready");
|
|
|
|
return _VSTD::distance(__position_start_, (*this)[__sub].first);
|
|
|
|
}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-30 00:21:42 +00:00
|
|
|
string_type str(size_type __sub = 0) const
|
2019-04-26 17:10:03 +00:00
|
|
|
{
|
|
|
|
_LIBCPP_ASSERT(ready(), "match_results::str() called when not ready");
|
|
|
|
return (*this)[__sub].str();
|
|
|
|
}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-30 00:21:42 +00:00
|
|
|
const_reference operator[](size_type __n) const
|
2019-04-26 17:10:03 +00:00
|
|
|
{
|
|
|
|
_LIBCPP_ASSERT(ready(), "match_results::operator[]() called when not ready");
|
|
|
|
return __n < __matches_.size() ? __matches_[__n] : __unmatched_;
|
|
|
|
}
|
2010-06-30 00:21:42 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2019-04-26 17:10:03 +00:00
|
|
|
const_reference prefix() const
|
|
|
|
{
|
|
|
|
_LIBCPP_ASSERT(ready(), "match_results::prefix() called when not ready");
|
|
|
|
return __prefix_;
|
|
|
|
}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2019-04-26 17:10:03 +00:00
|
|
|
const_reference suffix() const
|
|
|
|
{
|
|
|
|
_LIBCPP_ASSERT(ready(), "match_results::suffix() called when not ready");
|
|
|
|
return __suffix_;
|
|
|
|
}
|
2010-06-30 00:21:42 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2011-10-08 14:36:16 +00:00
|
|
|
const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-30 00:21:42 +00:00
|
|
|
const_iterator end() const {return __matches_.end();}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2011-10-08 14:36:16 +00:00
|
|
|
const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-30 00:21:42 +00:00
|
|
|
const_iterator cend() const {return __matches_.end();}
|
|
|
|
|
|
|
|
// format:
|
|
|
|
template <class _OutputIter>
|
|
|
|
_OutputIter
|
2017-11-14 11:14:25 +00:00
|
|
|
format(_OutputIter __output_iter, const char_type* __fmt_first,
|
2010-06-30 00:21:42 +00:00
|
|
|
const char_type* __fmt_last,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::format_default) const;
|
|
|
|
template <class _OutputIter, class _ST, class _SA>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-30 00:21:42 +00:00
|
|
|
_OutputIter
|
2017-11-14 11:14:25 +00:00
|
|
|
format(_OutputIter __output_iter, const basic_string<char_type, _ST, _SA>& __fmt,
|
2010-08-14 18:14:02 +00:00
|
|
|
regex_constants::match_flag_type __flags = regex_constants::format_default) const
|
2017-11-14 11:14:25 +00:00
|
|
|
{return format(__output_iter, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
|
2010-06-30 00:21:42 +00:00
|
|
|
template <class _ST, class _SA>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-30 00:21:42 +00:00
|
|
|
basic_string<char_type, _ST, _SA>
|
|
|
|
format(const basic_string<char_type, _ST, _SA>& __fmt,
|
2010-08-14 18:14:02 +00:00
|
|
|
regex_constants::match_flag_type __flags = regex_constants::format_default) const
|
|
|
|
{
|
|
|
|
basic_string<char_type, _ST, _SA> __r;
|
|
|
|
format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
|
|
|
|
__flags);
|
|
|
|
return __r;
|
|
|
|
}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-30 00:21:42 +00:00
|
|
|
string_type
|
|
|
|
format(const char_type* __fmt,
|
2010-08-14 18:14:02 +00:00
|
|
|
regex_constants::match_flag_type __flags = regex_constants::format_default) const
|
|
|
|
{
|
|
|
|
string_type __r;
|
|
|
|
format(back_inserter(__r), __fmt,
|
|
|
|
__fmt + char_traits<char_type>::length(__fmt), __flags);
|
|
|
|
return __r;
|
|
|
|
}
|
2010-06-30 00:21:42 +00:00
|
|
|
|
|
|
|
// allocator:
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-06-30 00:21:42 +00:00
|
|
|
allocator_type get_allocator() const {return __matches_.get_allocator();}
|
|
|
|
|
|
|
|
// swap:
|
|
|
|
void swap(match_results& __m);
|
|
|
|
|
2011-11-29 18:15:50 +00:00
|
|
|
template <class _Bp, class _Ap>
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-07-14 21:14:52 +00:00
|
|
|
void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
|
2011-11-29 18:15:50 +00:00
|
|
|
const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
|
2010-07-14 21:14:52 +00:00
|
|
|
{
|
2011-11-29 18:15:50 +00:00
|
|
|
_Bp __mf = __m.prefix().first;
|
2010-07-14 21:14:52 +00:00
|
|
|
__matches_.resize(__m.size());
|
|
|
|
for (size_type __i = 0; __i < __matches_.size(); ++__i)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
__matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
|
|
|
|
__matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
|
2010-07-14 21:14:52 +00:00
|
|
|
__matches_[__i].matched = __m[__i].matched;
|
|
|
|
}
|
|
|
|
__unmatched_.first = __l;
|
|
|
|
__unmatched_.second = __l;
|
|
|
|
__unmatched_.matched = false;
|
2011-06-30 21:18:19 +00:00
|
|
|
__prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
|
|
|
|
__prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
|
2010-07-14 21:14:52 +00:00
|
|
|
__prefix_.matched = __m.prefix().matched;
|
2011-06-30 21:18:19 +00:00
|
|
|
__suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
|
|
|
|
__suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
|
2010-07-14 21:14:52 +00:00
|
|
|
__suffix_.matched = __m.suffix().matched;
|
2010-08-16 20:21:16 +00:00
|
|
|
if (!__no_update_pos)
|
|
|
|
__position_start_ = __prefix_.first;
|
2010-12-08 21:07:55 +00:00
|
|
|
__ready_ = __m.ready();
|
2010-07-14 21:14:52 +00:00
|
|
|
}
|
|
|
|
|
2010-06-30 17:22:19 +00:00
|
|
|
private:
|
|
|
|
void __init(unsigned __s,
|
2010-08-16 20:21:16 +00:00
|
|
|
_BidirectionalIterator __f, _BidirectionalIterator __l,
|
|
|
|
bool __no_update_pos = false);
|
2010-06-30 17:22:19 +00:00
|
|
|
|
|
|
|
template <class, class> friend class basic_regex;
|
|
|
|
|
2011-11-29 18:15:50 +00:00
|
|
|
template <class _Bp, class _Ap, class _Cp, class _Tp>
|
2010-06-30 00:21:42 +00:00
|
|
|
friend
|
|
|
|
bool
|
2011-11-29 18:15:50 +00:00
|
|
|
regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
|
2010-06-30 00:21:42 +00:00
|
|
|
regex_constants::match_flag_type);
|
2010-07-27 22:20:32 +00:00
|
|
|
|
2011-11-29 18:15:50 +00:00
|
|
|
template <class _Bp, class _Ap>
|
2010-08-14 18:14:02 +00:00
|
|
|
friend
|
|
|
|
bool
|
2011-11-29 18:15:50 +00:00
|
|
|
operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
|
2010-08-14 18:14:02 +00:00
|
|
|
|
2010-07-27 22:20:32 +00:00
|
|
|
template <class, class> friend class __lookahead;
|
2010-06-30 00:21:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _Allocator>
|
|
|
|
match_results<_BidirectionalIterator, _Allocator>::match_results(
|
|
|
|
const allocator_type& __a)
|
|
|
|
: __matches_(__a),
|
|
|
|
__unmatched_(),
|
|
|
|
__prefix_(),
|
2010-08-16 20:21:16 +00:00
|
|
|
__suffix_(),
|
2015-07-22 01:29:41 +00:00
|
|
|
__ready_(false),
|
|
|
|
__position_start_()
|
2010-06-30 00:21:42 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2010-06-30 17:22:19 +00:00
|
|
|
template <class _BidirectionalIterator, class _Allocator>
|
|
|
|
void
|
|
|
|
match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
|
2010-08-16 20:21:16 +00:00
|
|
|
_BidirectionalIterator __f, _BidirectionalIterator __l,
|
|
|
|
bool __no_update_pos)
|
2010-06-30 17:22:19 +00:00
|
|
|
{
|
|
|
|
__unmatched_.first = __l;
|
|
|
|
__unmatched_.second = __l;
|
|
|
|
__unmatched_.matched = false;
|
2010-07-07 19:14:52 +00:00
|
|
|
__matches_.assign(__s, __unmatched_);
|
2010-06-30 17:22:19 +00:00
|
|
|
__prefix_.first = __f;
|
|
|
|
__prefix_.second = __f;
|
|
|
|
__prefix_.matched = false;
|
2010-07-08 17:43:58 +00:00
|
|
|
__suffix_ = __unmatched_;
|
2010-08-16 20:21:16 +00:00
|
|
|
if (!__no_update_pos)
|
|
|
|
__position_start_ = __prefix_.first;
|
2010-12-08 21:07:55 +00:00
|
|
|
__ready_ = true;
|
2010-06-30 17:22:19 +00:00
|
|
|
}
|
|
|
|
|
2010-08-14 18:14:02 +00:00
|
|
|
template <class _BidirectionalIterator, class _Allocator>
|
|
|
|
template <class _OutputIter>
|
|
|
|
_OutputIter
|
2017-11-14 11:14:25 +00:00
|
|
|
match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __output_iter,
|
2010-08-14 18:14:02 +00:00
|
|
|
const char_type* __fmt_first, const char_type* __fmt_last,
|
|
|
|
regex_constants::match_flag_type __flags) const
|
|
|
|
{
|
2019-04-26 17:10:03 +00:00
|
|
|
_LIBCPP_ASSERT(ready(), "match_results::format() called when not ready");
|
2010-08-14 18:14:02 +00:00
|
|
|
if (__flags & regex_constants::format_sed)
|
|
|
|
{
|
|
|
|
for (; __fmt_first != __fmt_last; ++__fmt_first)
|
|
|
|
{
|
|
|
|
if (*__fmt_first == '&')
|
2017-11-14 11:14:25 +00:00
|
|
|
__output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
|
|
|
|
__output_iter);
|
2010-08-14 18:14:02 +00:00
|
|
|
else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
|
|
|
|
{
|
|
|
|
++__fmt_first;
|
|
|
|
if ('0' <= *__fmt_first && *__fmt_first <= '9')
|
|
|
|
{
|
|
|
|
size_t __i = *__fmt_first - '0';
|
2017-11-14 11:14:25 +00:00
|
|
|
__output_iter = _VSTD::copy((*this)[__i].first,
|
|
|
|
(*this)[__i].second, __output_iter);
|
2010-08-14 18:14:02 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-11-14 11:14:25 +00:00
|
|
|
*__output_iter = *__fmt_first;
|
|
|
|
++__output_iter;
|
2010-08-14 18:14:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-11-14 11:14:25 +00:00
|
|
|
*__output_iter = *__fmt_first;
|
|
|
|
++__output_iter;
|
2010-08-14 18:14:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (; __fmt_first != __fmt_last; ++__fmt_first)
|
|
|
|
{
|
|
|
|
if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
|
|
|
|
{
|
|
|
|
switch (__fmt_first[1])
|
|
|
|
{
|
|
|
|
case '$':
|
2017-11-14 11:14:25 +00:00
|
|
|
*__output_iter = *++__fmt_first;
|
|
|
|
++__output_iter;
|
2010-08-14 18:14:02 +00:00
|
|
|
break;
|
|
|
|
case '&':
|
|
|
|
++__fmt_first;
|
2017-11-14 11:14:25 +00:00
|
|
|
__output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
|
|
|
|
__output_iter);
|
2010-08-14 18:14:02 +00:00
|
|
|
break;
|
|
|
|
case '`':
|
|
|
|
++__fmt_first;
|
2017-11-14 11:14:25 +00:00
|
|
|
__output_iter = _VSTD::copy(__prefix_.first, __prefix_.second, __output_iter);
|
2010-08-14 18:14:02 +00:00
|
|
|
break;
|
|
|
|
case '\'':
|
|
|
|
++__fmt_first;
|
2017-11-14 11:14:25 +00:00
|
|
|
__output_iter = _VSTD::copy(__suffix_.first, __suffix_.second, __output_iter);
|
2010-08-14 18:14:02 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
|
|
|
|
{
|
|
|
|
++__fmt_first;
|
2017-10-19 22:10:41 +00:00
|
|
|
size_t __idx = *__fmt_first - '0';
|
2010-08-14 18:14:02 +00:00
|
|
|
if (__fmt_first + 1 != __fmt_last &&
|
|
|
|
'0' <= __fmt_first[1] && __fmt_first[1] <= '9')
|
|
|
|
{
|
|
|
|
++__fmt_first;
|
[libc++] Consistently replace `std::` qualification with `_VSTD::` or nothing. NFCI.
I used a lot of `git grep` to find places where `std::` was being used
outside of comments and assert-messages. There were three outcomes:
- Qualified function calls, e.g. `std::move` becomes `_VSTD::move`.
This is the most common case.
- Typenames that don't need qualification, e.g. `std::allocator` becomes `allocator`.
Leaving these as `_VSTD::allocator` would also be fine, but I decided
that removing the qualification is more consistent with existing practice.
- Names that specifically need un-versioned `std::` qualification,
or that I wasn't sure about. For example, I didn't touch any code in
<atomic>, <math.h>, <new>, or any ext/ or experimental/ headers;
and I didn't touch any instances of `std::type_info`.
In some deduction guides, we were accidentally using `class Alloc = typename std::allocator<T>`,
despite `std::allocator<T>`'s type-ness not being template-dependent.
Because `std::allocator` is a qualified name, this did parse as we intended;
but what we meant was simply `class Alloc = allocator<T>`.
Differential Revision: https://reviews.llvm.org/D92250
2020-11-27 11:02:06 -05:00
|
|
|
if (__idx >= numeric_limits<size_t>::max() / 10)
|
2017-10-19 22:10:41 +00:00
|
|
|
__throw_regex_error<regex_constants::error_escape>();
|
|
|
|
__idx = 10 * __idx + *__fmt_first - '0';
|
2010-08-14 18:14:02 +00:00
|
|
|
}
|
2017-11-14 11:14:25 +00:00
|
|
|
__output_iter = _VSTD::copy((*this)[__idx].first,
|
|
|
|
(*this)[__idx].second, __output_iter);
|
2010-08-14 18:14:02 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-11-14 11:14:25 +00:00
|
|
|
*__output_iter = *__fmt_first;
|
|
|
|
++__output_iter;
|
2010-08-14 18:14:02 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-11-14 11:14:25 +00:00
|
|
|
*__output_iter = *__fmt_first;
|
|
|
|
++__output_iter;
|
2010-08-14 18:14:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-11-14 11:14:25 +00:00
|
|
|
return __output_iter;
|
2010-08-14 18:14:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _Allocator>
|
|
|
|
void
|
|
|
|
match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
using _VSTD::swap;
|
2010-08-14 18:14:02 +00:00
|
|
|
swap(__matches_, __m.__matches_);
|
|
|
|
swap(__unmatched_, __m.__unmatched_);
|
|
|
|
swap(__prefix_, __m.__prefix_);
|
|
|
|
swap(__suffix_, __m.__suffix_);
|
2010-08-16 20:21:16 +00:00
|
|
|
swap(__position_start_, __m.__position_start_);
|
2010-12-08 21:07:55 +00:00
|
|
|
swap(__ready_, __m.__ready_);
|
2010-08-14 18:14:02 +00:00
|
|
|
}
|
|
|
|
|
2010-06-30 00:21:42 +00:00
|
|
|
template <class _BidirectionalIterator, class _Allocator>
|
2022-08-13 13:23:16 +02:00
|
|
|
_LIBCPP_HIDE_FROM_ABI bool
|
2010-08-14 18:14:02 +00:00
|
|
|
operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
|
|
|
|
const match_results<_BidirectionalIterator, _Allocator>& __y)
|
|
|
|
{
|
2010-12-08 21:07:55 +00:00
|
|
|
if (__x.__ready_ != __y.__ready_)
|
|
|
|
return false;
|
|
|
|
if (!__x.__ready_)
|
|
|
|
return true;
|
2010-08-14 18:14:02 +00:00
|
|
|
return __x.__matches_ == __y.__matches_ &&
|
|
|
|
__x.__prefix_ == __y.__prefix_ &&
|
2010-12-08 21:07:55 +00:00
|
|
|
__x.__suffix_ == __y.__suffix_;
|
2010-08-14 18:14:02 +00:00
|
|
|
}
|
2010-06-30 00:21:42 +00:00
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _Allocator>
|
2010-08-14 18:14:02 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
|
|
|
|
const match_results<_BidirectionalIterator, _Allocator>& __y)
|
|
|
|
{
|
|
|
|
return !(__x == __y);
|
|
|
|
}
|
2010-06-30 00:21:42 +00:00
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _Allocator>
|
2010-08-14 18:14:02 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
void
|
|
|
|
swap(match_results<_BidirectionalIterator, _Allocator>& __x,
|
|
|
|
match_results<_BidirectionalIterator, _Allocator>& __y)
|
|
|
|
{
|
|
|
|
__x.swap(__y);
|
|
|
|
}
|
2010-06-30 00:21:42 +00:00
|
|
|
|
|
|
|
// regex_search
|
|
|
|
|
2010-07-07 19:14:52 +00:00
|
|
|
template <class _CharT, class _Traits>
|
2010-07-27 01:25:38 +00:00
|
|
|
template <class _Allocator>
|
2010-07-07 19:14:52 +00:00
|
|
|
bool
|
|
|
|
basic_regex<_CharT, _Traits>::__match_at_start_ecma(
|
2010-07-27 01:25:38 +00:00
|
|
|
const _CharT* __first, const _CharT* __last,
|
|
|
|
match_results<const _CharT*, _Allocator>& __m,
|
2011-03-26 20:02:27 +00:00
|
|
|
regex_constants::match_flag_type __flags, bool __at_first) const
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
2010-07-27 01:25:38 +00:00
|
|
|
vector<__state> __states;
|
|
|
|
__node* __st = __start_.get();
|
|
|
|
if (__st)
|
|
|
|
{
|
2015-01-28 22:22:35 +00:00
|
|
|
sub_match<const _CharT*> __unmatched;
|
|
|
|
__unmatched.first = __last;
|
|
|
|
__unmatched.second = __last;
|
|
|
|
__unmatched.matched = false;
|
|
|
|
|
2010-07-27 01:25:38 +00:00
|
|
|
__states.push_back(__state());
|
|
|
|
__states.back().__do_ = 0;
|
|
|
|
__states.back().__first_ = __first;
|
|
|
|
__states.back().__current_ = __first;
|
|
|
|
__states.back().__last_ = __last;
|
2015-01-28 22:22:35 +00:00
|
|
|
__states.back().__sub_matches_.resize(mark_count(), __unmatched);
|
2010-07-27 01:25:38 +00:00
|
|
|
__states.back().__loop_data_.resize(__loop_count());
|
|
|
|
__states.back().__node_ = __st;
|
|
|
|
__states.back().__flags_ = __flags;
|
2011-03-26 20:02:27 +00:00
|
|
|
__states.back().__at_first_ = __at_first;
|
2017-09-12 17:56:59 +00:00
|
|
|
int __counter = 0;
|
|
|
|
int __length = __last - __first;
|
2010-07-27 01:25:38 +00:00
|
|
|
do
|
|
|
|
{
|
2017-09-12 17:56:59 +00:00
|
|
|
++__counter;
|
|
|
|
if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
|
|
|
|
__counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
|
|
|
|
__throw_regex_error<regex_constants::error_complexity>();
|
2010-07-27 01:25:38 +00:00
|
|
|
__state& __s = __states.back();
|
|
|
|
if (__s.__node_)
|
|
|
|
__s.__node_->__exec(__s);
|
|
|
|
switch (__s.__do_)
|
|
|
|
{
|
|
|
|
case __state::__end_state:
|
2016-10-27 21:40:34 +00:00
|
|
|
if ((__flags & regex_constants::match_not_null) &&
|
2016-10-21 20:41:47 +00:00
|
|
|
__s.__current_ == __first)
|
|
|
|
{
|
|
|
|
__states.pop_back();
|
|
|
|
break;
|
|
|
|
}
|
2016-10-27 21:40:34 +00:00
|
|
|
if ((__flags & regex_constants::__full_match) &&
|
|
|
|
__s.__current_ != __last)
|
|
|
|
{
|
|
|
|
__states.pop_back();
|
|
|
|
break;
|
|
|
|
}
|
2010-07-27 01:25:38 +00:00
|
|
|
__m.__matches_[0].first = __first;
|
2011-06-30 21:18:19 +00:00
|
|
|
__m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
|
2010-07-27 01:25:38 +00:00
|
|
|
__m.__matches_[0].matched = true;
|
|
|
|
for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
|
|
|
|
__m.__matches_[__i+1] = __s.__sub_matches_[__i];
|
|
|
|
return true;
|
|
|
|
case __state::__accept_and_consume:
|
|
|
|
case __state::__repeat:
|
|
|
|
case __state::__accept_but_not_consume:
|
|
|
|
break;
|
|
|
|
case __state::__split:
|
|
|
|
{
|
|
|
|
__state __snext = __s;
|
|
|
|
__s.__node_->__exec_split(true, __s);
|
|
|
|
__snext.__node_->__exec_split(false, __snext);
|
2011-06-30 21:18:19 +00:00
|
|
|
__states.push_back(_VSTD::move(__snext));
|
2010-07-27 01:25:38 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case __state::__reject:
|
|
|
|
__states.pop_back();
|
|
|
|
break;
|
|
|
|
default:
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::__re_err_unknown>();
|
2010-07-27 01:25:38 +00:00
|
|
|
break;
|
2010-08-11 17:04:31 +00:00
|
|
|
|
2010-07-27 01:25:38 +00:00
|
|
|
}
|
|
|
|
} while (!__states.empty());
|
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
2010-07-14 21:14:52 +00:00
|
|
|
template <class _Allocator>
|
2010-07-07 19:14:52 +00:00
|
|
|
bool
|
|
|
|
basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
|
|
|
|
const _CharT* __first, const _CharT* __last,
|
2010-07-14 21:14:52 +00:00
|
|
|
match_results<const _CharT*, _Allocator>& __m,
|
2011-03-26 20:02:27 +00:00
|
|
|
regex_constants::match_flag_type __flags, bool __at_first) const
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
deque<__state> __states;
|
2010-07-14 21:14:52 +00:00
|
|
|
ptrdiff_t __highest_j = 0;
|
2011-11-29 18:15:50 +00:00
|
|
|
ptrdiff_t _Np = _VSTD::distance(__first, __last);
|
2010-07-12 15:51:17 +00:00
|
|
|
__node* __st = __start_.get();
|
2010-07-07 19:14:52 +00:00
|
|
|
if (__st)
|
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
__states.push_back(__state());
|
|
|
|
__states.back().__do_ = 0;
|
|
|
|
__states.back().__first_ = __first;
|
|
|
|
__states.back().__current_ = __first;
|
|
|
|
__states.back().__last_ = __last;
|
|
|
|
__states.back().__loop_data_.resize(__loop_count());
|
|
|
|
__states.back().__node_ = __st;
|
|
|
|
__states.back().__flags_ = __flags;
|
2011-03-26 20:02:27 +00:00
|
|
|
__states.back().__at_first_ = __at_first;
|
2010-07-14 15:45:11 +00:00
|
|
|
bool __matched = false;
|
2017-09-12 17:56:59 +00:00
|
|
|
int __counter = 0;
|
|
|
|
int __length = __last - __first;
|
2010-07-07 19:14:52 +00:00
|
|
|
do
|
|
|
|
{
|
2017-09-12 17:56:59 +00:00
|
|
|
++__counter;
|
|
|
|
if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
|
|
|
|
__counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
|
|
|
|
__throw_regex_error<regex_constants::error_complexity>();
|
2010-07-12 15:51:17 +00:00
|
|
|
__state& __s = __states.back();
|
|
|
|
if (__s.__node_)
|
|
|
|
__s.__node_->__exec(__s);
|
|
|
|
switch (__s.__do_)
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
case __state::__end_state:
|
2016-10-27 21:40:34 +00:00
|
|
|
if ((__flags & regex_constants::match_not_null) &&
|
2016-10-21 20:41:47 +00:00
|
|
|
__s.__current_ == __first)
|
|
|
|
{
|
|
|
|
__states.pop_back();
|
|
|
|
break;
|
|
|
|
}
|
2016-10-27 21:40:34 +00:00
|
|
|
if ((__flags & regex_constants::__full_match) &&
|
|
|
|
__s.__current_ != __last)
|
|
|
|
{
|
|
|
|
__states.pop_back();
|
|
|
|
break;
|
|
|
|
}
|
2010-07-27 17:24:17 +00:00
|
|
|
if (!__matched || __highest_j < __s.__current_ - __s.__first_)
|
2010-07-14 15:45:11 +00:00
|
|
|
__highest_j = __s.__current_ - __s.__first_;
|
2010-07-27 17:24:17 +00:00
|
|
|
__matched = true;
|
2011-11-29 18:15:50 +00:00
|
|
|
if (__highest_j == _Np)
|
2010-07-12 15:51:17 +00:00
|
|
|
__states.clear();
|
|
|
|
else
|
|
|
|
__states.pop_back();
|
2010-07-07 19:14:52 +00:00
|
|
|
break;
|
2010-07-12 15:51:17 +00:00
|
|
|
case __state::__consume_input:
|
|
|
|
break;
|
|
|
|
case __state::__accept_and_consume:
|
2011-06-30 21:18:19 +00:00
|
|
|
__states.push_front(_VSTD::move(__s));
|
2010-07-12 15:51:17 +00:00
|
|
|
__states.pop_back();
|
2010-07-07 19:14:52 +00:00
|
|
|
break;
|
2010-07-12 15:51:17 +00:00
|
|
|
case __state::__repeat:
|
|
|
|
case __state::__accept_but_not_consume:
|
2010-07-07 19:14:52 +00:00
|
|
|
break;
|
2010-07-12 15:51:17 +00:00
|
|
|
case __state::__split:
|
|
|
|
{
|
|
|
|
__state __snext = __s;
|
|
|
|
__s.__node_->__exec_split(true, __s);
|
|
|
|
__snext.__node_->__exec_split(false, __snext);
|
2011-06-30 21:18:19 +00:00
|
|
|
__states.push_back(_VSTD::move(__snext));
|
2010-07-12 15:51:17 +00:00
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
break;
|
2010-07-12 15:51:17 +00:00
|
|
|
case __state::__reject:
|
|
|
|
__states.pop_back();
|
2010-07-07 19:14:52 +00:00
|
|
|
break;
|
|
|
|
default:
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::__re_err_unknown>();
|
2010-07-07 19:14:52 +00:00
|
|
|
break;
|
|
|
|
}
|
2010-07-12 15:51:17 +00:00
|
|
|
} while (!__states.empty());
|
2010-07-14 15:45:11 +00:00
|
|
|
if (__matched)
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
|
|
|
__m.__matches_[0].first = __first;
|
2011-06-30 21:18:19 +00:00
|
|
|
__m.__matches_[0].second = _VSTD::next(__first, __highest_j);
|
2010-07-07 19:14:52 +00:00
|
|
|
__m.__matches_[0].matched = true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
2010-07-14 21:14:52 +00:00
|
|
|
template <class _Allocator>
|
2010-07-07 19:14:52 +00:00
|
|
|
bool
|
|
|
|
basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
|
2010-07-14 21:14:52 +00:00
|
|
|
const _CharT* __first, const _CharT* __last,
|
|
|
|
match_results<const _CharT*, _Allocator>& __m,
|
2011-03-26 20:02:27 +00:00
|
|
|
regex_constants::match_flag_type __flags, bool __at_first) const
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
vector<__state> __states;
|
|
|
|
__state __best_state;
|
2010-07-14 21:14:52 +00:00
|
|
|
ptrdiff_t __highest_j = 0;
|
2011-11-29 18:15:50 +00:00
|
|
|
ptrdiff_t _Np = _VSTD::distance(__first, __last);
|
2010-07-12 15:51:17 +00:00
|
|
|
__node* __st = __start_.get();
|
2010-07-08 17:43:58 +00:00
|
|
|
if (__st)
|
|
|
|
{
|
2015-01-28 22:22:35 +00:00
|
|
|
sub_match<const _CharT*> __unmatched;
|
|
|
|
__unmatched.first = __last;
|
|
|
|
__unmatched.second = __last;
|
|
|
|
__unmatched.matched = false;
|
|
|
|
|
2010-07-12 15:51:17 +00:00
|
|
|
__states.push_back(__state());
|
|
|
|
__states.back().__do_ = 0;
|
|
|
|
__states.back().__first_ = __first;
|
|
|
|
__states.back().__current_ = __first;
|
|
|
|
__states.back().__last_ = __last;
|
2015-01-28 22:22:35 +00:00
|
|
|
__states.back().__sub_matches_.resize(mark_count(), __unmatched);
|
2010-07-12 15:51:17 +00:00
|
|
|
__states.back().__loop_data_.resize(__loop_count());
|
|
|
|
__states.back().__node_ = __st;
|
|
|
|
__states.back().__flags_ = __flags;
|
2011-03-26 20:02:27 +00:00
|
|
|
__states.back().__at_first_ = __at_first;
|
2010-07-12 15:51:17 +00:00
|
|
|
bool __matched = false;
|
2017-09-12 17:56:59 +00:00
|
|
|
int __counter = 0;
|
|
|
|
int __length = __last - __first;
|
2010-07-08 17:43:58 +00:00
|
|
|
do
|
|
|
|
{
|
2017-09-12 17:56:59 +00:00
|
|
|
++__counter;
|
|
|
|
if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
|
|
|
|
__counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
|
|
|
|
__throw_regex_error<regex_constants::error_complexity>();
|
2010-07-12 15:51:17 +00:00
|
|
|
__state& __s = __states.back();
|
|
|
|
if (__s.__node_)
|
|
|
|
__s.__node_->__exec(__s);
|
|
|
|
switch (__s.__do_)
|
2010-07-08 17:43:58 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
case __state::__end_state:
|
2016-10-27 21:40:34 +00:00
|
|
|
if ((__flags & regex_constants::match_not_null) &&
|
2016-10-21 20:41:47 +00:00
|
|
|
__s.__current_ == __first)
|
|
|
|
{
|
|
|
|
__states.pop_back();
|
|
|
|
break;
|
|
|
|
}
|
2016-10-27 21:40:34 +00:00
|
|
|
if ((__flags & regex_constants::__full_match) &&
|
|
|
|
__s.__current_ != __last)
|
|
|
|
{
|
|
|
|
__states.pop_back();
|
|
|
|
break;
|
|
|
|
}
|
2010-07-27 17:24:17 +00:00
|
|
|
if (!__matched || __highest_j < __s.__current_ - __s.__first_)
|
2010-07-08 17:43:58 +00:00
|
|
|
{
|
2010-07-27 17:24:17 +00:00
|
|
|
__highest_j = __s.__current_ - __s.__first_;
|
2010-07-12 15:51:17 +00:00
|
|
|
__best_state = __s;
|
2010-07-08 17:43:58 +00:00
|
|
|
}
|
2010-07-27 17:24:17 +00:00
|
|
|
__matched = true;
|
2011-11-29 18:15:50 +00:00
|
|
|
if (__highest_j == _Np)
|
2010-07-27 17:24:17 +00:00
|
|
|
__states.clear();
|
|
|
|
else
|
|
|
|
__states.pop_back();
|
2010-07-08 17:43:58 +00:00
|
|
|
break;
|
2010-07-12 15:51:17 +00:00
|
|
|
case __state::__accept_and_consume:
|
|
|
|
case __state::__repeat:
|
|
|
|
case __state::__accept_but_not_consume:
|
|
|
|
break;
|
|
|
|
case __state::__split:
|
2010-07-08 17:43:58 +00:00
|
|
|
{
|
2010-07-12 15:51:17 +00:00
|
|
|
__state __snext = __s;
|
|
|
|
__s.__node_->__exec_split(true, __s);
|
|
|
|
__snext.__node_->__exec_split(false, __snext);
|
2011-06-30 21:18:19 +00:00
|
|
|
__states.push_back(_VSTD::move(__snext));
|
2010-07-08 17:43:58 +00:00
|
|
|
}
|
|
|
|
break;
|
2010-07-12 15:51:17 +00:00
|
|
|
case __state::__reject:
|
|
|
|
__states.pop_back();
|
2010-07-08 17:43:58 +00:00
|
|
|
break;
|
|
|
|
default:
|
2015-07-28 13:30:47 +00:00
|
|
|
__throw_regex_error<regex_constants::__re_err_unknown>();
|
2010-07-08 17:43:58 +00:00
|
|
|
break;
|
|
|
|
}
|
2010-07-12 15:51:17 +00:00
|
|
|
} while (!__states.empty());
|
|
|
|
if (__matched)
|
2010-07-08 17:43:58 +00:00
|
|
|
{
|
|
|
|
__m.__matches_[0].first = __first;
|
2011-06-30 21:18:19 +00:00
|
|
|
__m.__matches_[0].second = _VSTD::next(__first, __highest_j);
|
2010-07-08 17:43:58 +00:00
|
|
|
__m.__matches_[0].matched = true;
|
2010-07-12 15:51:17 +00:00
|
|
|
for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
|
|
|
|
__m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
|
2010-07-08 17:43:58 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
2010-07-14 21:14:52 +00:00
|
|
|
template <class _Allocator>
|
2010-07-07 19:14:52 +00:00
|
|
|
bool
|
|
|
|
basic_regex<_CharT, _Traits>::__match_at_start(
|
2010-07-14 21:14:52 +00:00
|
|
|
const _CharT* __first, const _CharT* __last,
|
|
|
|
match_results<const _CharT*, _Allocator>& __m,
|
2011-03-26 20:02:27 +00:00
|
|
|
regex_constants::match_flag_type __flags, bool __at_first) const
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
2019-03-28 17:30:23 +00:00
|
|
|
if (__get_grammar(__flags_) == ECMAScript)
|
2011-03-26 20:02:27 +00:00
|
|
|
return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
|
2010-07-07 19:14:52 +00:00
|
|
|
if (mark_count() == 0)
|
2011-03-26 20:02:27 +00:00
|
|
|
return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
|
|
|
|
return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
|
2010-07-07 19:14:52 +00:00
|
|
|
}
|
|
|
|
|
2010-06-30 17:22:19 +00:00
|
|
|
template <class _CharT, class _Traits>
|
2010-07-14 21:14:52 +00:00
|
|
|
template <class _Allocator>
|
2010-06-30 17:22:19 +00:00
|
|
|
bool
|
|
|
|
basic_regex<_CharT, _Traits>::__search(
|
2010-07-14 21:14:52 +00:00
|
|
|
const _CharT* __first, const _CharT* __last,
|
|
|
|
match_results<const _CharT*, _Allocator>& __m,
|
2010-06-30 17:22:19 +00:00
|
|
|
regex_constants::match_flag_type __flags) const
|
|
|
|
{
|
[FIX][libc++][Regex] Using regex_constants match_prev_avail | match_not_bol | match_not_bow
Summary:
pr42199
When using regex_constants::match_prev_avail, it is defined that
--first is valid, and match_not_bol and match_not_bow should be
ignored. At the moment these flags are not ignored. This fixis that.
Reviewers: ldionne, miyuki, EricWF, mclow.lists, #libc
Reviewed By: ldionne, miyuki, #libc
Subscribers: broadwaylamb, dexonsmith, libcxx-commits
Tags: #libc
Differential Revision: https://reviews.llvm.org/D75622
2020-04-30 23:34:01 +01:00
|
|
|
if (__flags & regex_constants::match_prev_avail)
|
|
|
|
__flags &= ~(regex_constants::match_not_bol | regex_constants::match_not_bow);
|
|
|
|
|
2010-08-16 20:21:16 +00:00
|
|
|
__m.__init(1 + mark_count(), __first, __last,
|
|
|
|
__flags & regex_constants::__no_update_pos);
|
2019-05-29 16:01:36 +00:00
|
|
|
if (__match_at_start(__first, __last, __m, __flags,
|
2013-07-09 17:29:09 +00:00
|
|
|
!(__flags & regex_constants::__no_update_pos)))
|
2010-07-07 19:14:52 +00:00
|
|
|
{
|
|
|
|
__m.__prefix_.second = __m[0].first;
|
|
|
|
__m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
|
|
|
|
__m.__suffix_.first = __m[0].second;
|
|
|
|
__m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
|
|
|
|
return true;
|
|
|
|
}
|
2010-07-29 01:15:27 +00:00
|
|
|
if (__first != __last && !(__flags & regex_constants::match_continuous))
|
2010-06-30 17:22:19 +00:00
|
|
|
{
|
2010-07-29 15:17:28 +00:00
|
|
|
__flags |= regex_constants::match_prev_avail;
|
2010-07-07 19:14:52 +00:00
|
|
|
for (++__first; __first != __last; ++__first)
|
2010-06-30 17:22:19 +00:00
|
|
|
{
|
2010-07-29 15:17:28 +00:00
|
|
|
__m.__matches_.assign(__m.size(), __m.__unmatched_);
|
2011-03-26 20:02:27 +00:00
|
|
|
if (__match_at_start(__first, __last, __m, __flags, false))
|
2010-06-30 17:22:19 +00:00
|
|
|
{
|
2010-07-07 19:14:52 +00:00
|
|
|
__m.__prefix_.second = __m[0].first;
|
|
|
|
__m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
|
|
|
|
__m.__suffix_.first = __m[0].second;
|
|
|
|
__m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
|
|
|
|
return true;
|
2010-06-30 17:22:19 +00:00
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
__m.__matches_.assign(__m.size(), __m.__unmatched_);
|
2010-06-30 17:22:19 +00:00
|
|
|
}
|
|
|
|
}
|
2010-07-07 19:14:52 +00:00
|
|
|
__m.__matches_.clear();
|
|
|
|
return false;
|
2010-06-30 17:22:19 +00:00
|
|
|
}
|
|
|
|
|
2010-06-30 00:21:42 +00:00
|
|
|
template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
|
2010-06-30 17:22:19 +00:00
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
2010-06-30 00:21:42 +00:00
|
|
|
bool
|
|
|
|
regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
|
|
|
|
match_results<_BidirectionalIterator, _Allocator>& __m,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
2010-06-30 17:22:19 +00:00
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
2010-07-14 21:14:52 +00:00
|
|
|
{
|
2013-07-11 15:32:55 +00:00
|
|
|
int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
|
|
|
|
basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
|
2010-07-14 21:14:52 +00:00
|
|
|
match_results<const _CharT*> __mc;
|
2013-07-11 15:32:55 +00:00
|
|
|
bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
|
2010-08-16 20:21:16 +00:00
|
|
|
__m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
|
2010-07-14 21:14:52 +00:00
|
|
|
return __r;
|
|
|
|
}
|
|
|
|
|
2013-06-29 23:45:43 +00:00
|
|
|
template <class _Iter, class _Allocator, class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_search(__wrap_iter<_Iter> __first,
|
|
|
|
__wrap_iter<_Iter> __last,
|
|
|
|
match_results<__wrap_iter<_Iter>, _Allocator>& __m,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
|
|
|
match_results<const _CharT*> __mc;
|
|
|
|
bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
|
|
|
|
__m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
|
|
|
|
return __r;
|
|
|
|
}
|
|
|
|
|
2010-07-14 21:14:52 +00:00
|
|
|
template <class _Allocator, class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_search(const _CharT* __first, const _CharT* __last,
|
|
|
|
match_results<const _CharT*, _Allocator>& __m,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
2010-06-30 17:22:19 +00:00
|
|
|
{
|
|
|
|
return __e.__search(__first, __last, __m, __flags);
|
|
|
|
}
|
2010-06-30 00:21:42 +00:00
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
2010-07-14 21:14:52 +00:00
|
|
|
basic_string<_CharT> __s(__first, __last);
|
|
|
|
match_results<const _CharT*> __mc;
|
|
|
|
return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_search(const _CharT* __first, const _CharT* __last,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
|
|
|
match_results<const _CharT*> __mc;
|
|
|
|
return __e.__search(__first, __last, __mc, __flags);
|
2010-06-30 00:21:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Allocator, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
2010-07-14 21:14:52 +00:00
|
|
|
return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
|
2010-06-30 00:21:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
2010-07-14 21:14:52 +00:00
|
|
|
match_results<const _CharT*> __m;
|
2011-06-30 21:18:19 +00:00
|
|
|
return _VSTD::regex_search(__str, __m, __e, __flags);
|
2010-06-30 00:21:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _ST, class _SA, class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_search(const basic_string<_CharT, _ST, _SA>& __s,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
2010-07-14 21:14:52 +00:00
|
|
|
match_results<const _CharT*> __mc;
|
|
|
|
return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
|
2010-06-30 00:21:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_search(const basic_string<_CharT, _ST, _SA>& __s,
|
|
|
|
match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
2010-07-14 21:14:52 +00:00
|
|
|
match_results<const _CharT*> __mc;
|
|
|
|
bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
|
2010-08-16 20:21:16 +00:00
|
|
|
__m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
|
2010-07-14 21:14:52 +00:00
|
|
|
return __r;
|
2010-06-30 00:21:42 +00:00
|
|
|
}
|
|
|
|
|
2014-02-19 21:21:11 +00:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
|
|
|
|
bool
|
|
|
|
regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
|
|
|
|
match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
|
|
|
|
const basic_regex<_Cp, _Tp>& __e,
|
2019-05-29 16:01:36 +00:00
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
|
2014-02-19 21:21:11 +00:00
|
|
|
#endif
|
|
|
|
|
2010-06-30 00:21:42 +00:00
|
|
|
// regex_match
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
|
2022-08-13 13:23:16 +02:00
|
|
|
_LIBCPP_HIDE_FROM_ABI bool
|
2010-06-30 00:21:42 +00:00
|
|
|
regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
|
|
|
|
match_results<_BidirectionalIterator, _Allocator>& __m,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
2016-10-27 21:40:34 +00:00
|
|
|
bool __r = _VSTD::regex_search(
|
|
|
|
__first, __last, __m, __e,
|
|
|
|
__flags | regex_constants::match_continuous |
|
|
|
|
regex_constants::__full_match);
|
2010-06-30 00:21:42 +00:00
|
|
|
if (__r)
|
|
|
|
{
|
|
|
|
__r = !__m.suffix().matched;
|
|
|
|
if (!__r)
|
|
|
|
__m.__matches_.clear();
|
|
|
|
}
|
|
|
|
return __r;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
|
|
|
match_results<_BidirectionalIterator> __m;
|
2011-06-30 21:18:19 +00:00
|
|
|
return _VSTD::regex_match(__first, __last, __m, __e, __flags);
|
2010-06-30 00:21:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _CharT, class _Allocator, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
|
2010-06-30 00:21:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_match(const basic_string<_CharT, _ST, _SA>& __s,
|
|
|
|
match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
|
2010-06-30 00:21:42 +00:00
|
|
|
}
|
|
|
|
|
2014-02-19 21:21:11 +00:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
|
|
|
|
match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
2019-05-29 16:01:36 +00:00
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
|
2014-02-19 21:21:11 +00:00
|
|
|
#endif
|
|
|
|
|
2010-06-30 00:21:42 +00:00
|
|
|
template <class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
|
2010-06-30 00:21:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _ST, class _SA, class _CharT, class _Traits>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
bool
|
|
|
|
regex_match(const basic_string<_CharT, _ST, _SA>& __s,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
|
2010-06-30 00:21:42 +00:00
|
|
|
}
|
|
|
|
|
2010-08-16 20:21:16 +00:00
|
|
|
// regex_iterator
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator,
|
|
|
|
class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
|
|
|
|
class _Traits = regex_traits<_CharT> >
|
2020-11-11 17:12:18 -08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS regex_iterator;
|
|
|
|
|
|
|
|
typedef regex_iterator<const char*> cregex_iterator;
|
|
|
|
typedef regex_iterator<string::const_iterator> sregex_iterator;
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
|
|
|
typedef regex_iterator<const wchar_t*> wcregex_iterator;
|
2020-11-11 17:12:18 -08:00
|
|
|
typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2020-11-11 17:12:18 -08:00
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
class
|
|
|
|
_LIBCPP_TEMPLATE_VIS
|
|
|
|
_LIBCPP_PREFERRED_NAME(cregex_iterator)
|
2021-08-23 15:32:36 -04:00
|
|
|
_LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_iterator))
|
2020-11-11 17:12:18 -08:00
|
|
|
_LIBCPP_PREFERRED_NAME(sregex_iterator)
|
2021-08-23 15:32:36 -04:00
|
|
|
_LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_iterator))
|
2020-11-11 17:12:18 -08:00
|
|
|
regex_iterator
|
2010-08-16 20:21:16 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef basic_regex<_CharT, _Traits> regex_type;
|
|
|
|
typedef match_results<_BidirectionalIterator> value_type;
|
|
|
|
typedef ptrdiff_t difference_type;
|
|
|
|
typedef const value_type* pointer;
|
|
|
|
typedef const value_type& reference;
|
|
|
|
typedef forward_iterator_tag iterator_category;
|
|
|
|
|
|
|
|
private:
|
|
|
|
_BidirectionalIterator __begin_;
|
|
|
|
_BidirectionalIterator __end_;
|
|
|
|
const regex_type* __pregex_;
|
|
|
|
regex_constants::match_flag_type __flags_;
|
|
|
|
value_type __match_;
|
|
|
|
|
|
|
|
public:
|
|
|
|
regex_iterator();
|
|
|
|
regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type& __re,
|
2014-02-19 21:21:11 +00:00
|
|
|
regex_constants::match_flag_type __m
|
|
|
|
= regex_constants::match_default);
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type&& __re,
|
2019-05-29 16:01:36 +00:00
|
|
|
regex_constants::match_flag_type __m
|
2014-02-19 21:21:11 +00:00
|
|
|
= regex_constants::match_default) = delete;
|
|
|
|
#endif
|
2010-08-16 20:21:16 +00:00
|
|
|
|
|
|
|
bool operator==(const regex_iterator& __x) const;
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-16 20:21:16 +00:00
|
|
|
bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
|
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-16 20:21:16 +00:00
|
|
|
reference operator*() const {return __match_;}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2019-01-24 02:02:50 +00:00
|
|
|
pointer operator->() const {return _VSTD::addressof(__match_);}
|
2010-08-16 20:21:16 +00:00
|
|
|
|
|
|
|
regex_iterator& operator++();
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-16 20:21:16 +00:00
|
|
|
regex_iterator operator++(int)
|
|
|
|
{
|
|
|
|
regex_iterator __t(*this);
|
|
|
|
++(*this);
|
|
|
|
return __t;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
|
|
|
|
: __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
|
|
|
regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type& __re, regex_constants::match_flag_type __m)
|
|
|
|
: __begin_(__a),
|
|
|
|
__end_(__b),
|
2019-01-24 02:02:50 +00:00
|
|
|
__pregex_(_VSTD::addressof(__re)),
|
2010-08-16 20:21:16 +00:00
|
|
|
__flags_(__m)
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
_VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
|
2010-08-16 20:21:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
bool
|
|
|
|
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
|
|
|
operator==(const regex_iterator& __x) const
|
|
|
|
{
|
|
|
|
if (__match_.empty() && __x.__match_.empty())
|
|
|
|
return true;
|
|
|
|
if (__match_.empty() || __x.__match_.empty())
|
|
|
|
return false;
|
|
|
|
return __begin_ == __x.__begin_ &&
|
|
|
|
__end_ == __x.__end_ &&
|
|
|
|
__pregex_ == __x.__pregex_ &&
|
|
|
|
__flags_ == __x.__flags_ &&
|
|
|
|
__match_[0] == __x.__match_[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
|
|
|
|
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
|
|
|
|
{
|
|
|
|
__flags_ |= regex_constants::__no_update_pos;
|
|
|
|
_BidirectionalIterator __start = __match_[0].second;
|
2017-07-05 16:37:19 +00:00
|
|
|
if (__match_[0].first == __match_[0].second)
|
2010-08-16 20:21:16 +00:00
|
|
|
{
|
|
|
|
if (__start == __end_)
|
|
|
|
{
|
|
|
|
__match_ = value_type();
|
|
|
|
return *this;
|
|
|
|
}
|
2011-06-30 21:18:19 +00:00
|
|
|
else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
|
2010-08-16 20:21:16 +00:00
|
|
|
__flags_ | regex_constants::match_not_null |
|
|
|
|
regex_constants::match_continuous))
|
|
|
|
return *this;
|
|
|
|
else
|
|
|
|
++__start;
|
|
|
|
}
|
|
|
|
__flags_ |= regex_constants::match_prev_avail;
|
2011-06-30 21:18:19 +00:00
|
|
|
if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
|
2010-08-16 20:21:16 +00:00
|
|
|
__match_ = value_type();
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
// regex_token_iterator
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator,
|
|
|
|
class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
|
|
|
|
class _Traits = regex_traits<_CharT> >
|
2020-11-11 17:12:18 -08:00
|
|
|
class _LIBCPP_TEMPLATE_VIS regex_token_iterator;
|
|
|
|
|
|
|
|
typedef regex_token_iterator<const char*> cregex_token_iterator;
|
|
|
|
typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
|
2021-08-23 15:32:36 -04:00
|
|
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
|
|
|
typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
|
2020-11-11 17:12:18 -08:00
|
|
|
typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
|
2021-08-23 15:32:36 -04:00
|
|
|
#endif
|
2020-11-11 17:12:18 -08:00
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
class
|
|
|
|
_LIBCPP_TEMPLATE_VIS
|
|
|
|
_LIBCPP_PREFERRED_NAME(cregex_token_iterator)
|
2021-08-23 15:32:36 -04:00
|
|
|
_LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_token_iterator))
|
2020-11-11 17:12:18 -08:00
|
|
|
_LIBCPP_PREFERRED_NAME(sregex_token_iterator)
|
2021-08-23 15:32:36 -04:00
|
|
|
_LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_token_iterator))
|
2020-11-11 17:12:18 -08:00
|
|
|
regex_token_iterator
|
2010-08-16 20:21:16 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef basic_regex<_CharT, _Traits> regex_type;
|
|
|
|
typedef sub_match<_BidirectionalIterator> value_type;
|
|
|
|
typedef ptrdiff_t difference_type;
|
|
|
|
typedef const value_type* pointer;
|
|
|
|
typedef const value_type& reference;
|
|
|
|
typedef forward_iterator_tag iterator_category;
|
|
|
|
|
2010-08-17 20:42:03 +00:00
|
|
|
private:
|
|
|
|
typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
|
|
|
|
|
|
|
|
_Position __position_;
|
|
|
|
const value_type* __result_;
|
|
|
|
value_type __suffix_;
|
2016-12-24 00:24:44 +00:00
|
|
|
ptrdiff_t __n_;
|
2010-08-17 20:42:03 +00:00
|
|
|
vector<int> __subs_;
|
|
|
|
|
|
|
|
public:
|
2010-08-16 20:21:16 +00:00
|
|
|
regex_token_iterator();
|
|
|
|
regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type& __re, int __submatch = 0,
|
2010-08-17 20:42:03 +00:00
|
|
|
regex_constants::match_flag_type __m =
|
|
|
|
regex_constants::match_default);
|
2014-02-19 21:21:11 +00:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type&& __re, int __submatch = 0,
|
|
|
|
regex_constants::match_flag_type __m =
|
|
|
|
regex_constants::match_default) = delete;
|
|
|
|
#endif
|
|
|
|
|
2010-08-16 20:21:16 +00:00
|
|
|
regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type& __re, const vector<int>& __submatches,
|
2010-08-17 20:42:03 +00:00
|
|
|
regex_constants::match_flag_type __m =
|
|
|
|
regex_constants::match_default);
|
2014-02-19 21:21:11 +00:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type&& __re, const vector<int>& __submatches,
|
|
|
|
regex_constants::match_flag_type __m =
|
|
|
|
regex_constants::match_default) = delete;
|
|
|
|
#endif
|
|
|
|
|
2017-04-18 23:42:15 +00:00
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
2010-08-16 20:21:16 +00:00
|
|
|
regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
2010-08-17 20:42:03 +00:00
|
|
|
const regex_type& __re,
|
|
|
|
initializer_list<int> __submatches,
|
|
|
|
regex_constants::match_flag_type __m =
|
|
|
|
regex_constants::match_default);
|
2014-02-19 21:21:11 +00:00
|
|
|
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
|
|
regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type&& __re,
|
|
|
|
initializer_list<int> __submatches,
|
|
|
|
regex_constants::match_flag_type __m =
|
|
|
|
regex_constants::match_default) = delete;
|
|
|
|
#endif
|
2021-04-20 12:03:32 -04:00
|
|
|
#endif // _LIBCPP_CXX03_LANG
|
2011-11-29 18:15:50 +00:00
|
|
|
template <size_t _Np>
|
2010-08-17 20:42:03 +00:00
|
|
|
regex_token_iterator(_BidirectionalIterator __a,
|
|
|
|
_BidirectionalIterator __b,
|
|
|
|
const regex_type& __re,
|
2011-11-29 18:15:50 +00:00
|
|
|
const int (&__submatches)[_Np],
|
2010-08-17 20:42:03 +00:00
|
|
|
regex_constants::match_flag_type __m =
|
|
|
|
regex_constants::match_default);
|
2014-02-19 21:21:11 +00:00
|
|
|
#if _LIBCPP_STD_VER > 11
|
[libc++] Consistently replace `std::` qualification with `_VSTD::` or nothing. NFCI.
I used a lot of `git grep` to find places where `std::` was being used
outside of comments and assert-messages. There were three outcomes:
- Qualified function calls, e.g. `std::move` becomes `_VSTD::move`.
This is the most common case.
- Typenames that don't need qualification, e.g. `std::allocator` becomes `allocator`.
Leaving these as `_VSTD::allocator` would also be fine, but I decided
that removing the qualification is more consistent with existing practice.
- Names that specifically need un-versioned `std::` qualification,
or that I wasn't sure about. For example, I didn't touch any code in
<atomic>, <math.h>, <new>, or any ext/ or experimental/ headers;
and I didn't touch any instances of `std::type_info`.
In some deduction guides, we were accidentally using `class Alloc = typename std::allocator<T>`,
despite `std::allocator<T>`'s type-ness not being template-dependent.
Because `std::allocator` is a qualified name, this did parse as we intended;
but what we meant was simply `class Alloc = allocator<T>`.
Differential Revision: https://reviews.llvm.org/D92250
2020-11-27 11:02:06 -05:00
|
|
|
template <size_t _Np>
|
2014-02-19 21:21:11 +00:00
|
|
|
regex_token_iterator(_BidirectionalIterator __a,
|
|
|
|
_BidirectionalIterator __b,
|
|
|
|
const regex_type&& __re,
|
|
|
|
const int (&__submatches)[_Np],
|
|
|
|
regex_constants::match_flag_type __m =
|
|
|
|
regex_constants::match_default) = delete;
|
|
|
|
#endif
|
|
|
|
|
2010-08-16 20:21:16 +00:00
|
|
|
regex_token_iterator(const regex_token_iterator&);
|
|
|
|
regex_token_iterator& operator=(const regex_token_iterator&);
|
|
|
|
|
2010-08-17 20:42:03 +00:00
|
|
|
bool operator==(const regex_token_iterator& __x) const;
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-17 20:42:03 +00:00
|
|
|
bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
|
2010-08-16 20:21:16 +00:00
|
|
|
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-17 20:42:03 +00:00
|
|
|
const value_type& operator*() const {return *__result_;}
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-17 20:42:03 +00:00
|
|
|
const value_type* operator->() const {return __result_;}
|
2010-08-16 20:21:16 +00:00
|
|
|
|
|
|
|
regex_token_iterator& operator++();
|
2010-09-23 15:13:20 +00:00
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
2010-08-17 20:42:03 +00:00
|
|
|
regex_token_iterator operator++(int)
|
|
|
|
{
|
|
|
|
regex_token_iterator __t(*this);
|
|
|
|
++(*this);
|
|
|
|
return __t;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
|
2014-01-09 18:25:57 +00:00
|
|
|
void __establish_result () {
|
2016-12-24 00:24:44 +00:00
|
|
|
if (__subs_[__n_] == -1)
|
2014-01-09 18:25:57 +00:00
|
|
|
__result_ = &__position_->prefix();
|
|
|
|
else
|
2016-12-24 00:24:44 +00:00
|
|
|
__result_ = &(*__position_)[__subs_[__n_]];
|
2019-05-29 16:01:36 +00:00
|
|
|
}
|
2010-08-16 20:21:16 +00:00
|
|
|
};
|
|
|
|
|
2010-08-17 20:42:03 +00:00
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
|
|
|
regex_token_iterator()
|
|
|
|
: __result_(nullptr),
|
|
|
|
__suffix_(),
|
2016-12-24 00:24:44 +00:00
|
|
|
__n_(0)
|
2010-08-17 20:42:03 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
void
|
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
|
|
|
__init(_BidirectionalIterator __a, _BidirectionalIterator __b)
|
|
|
|
{
|
|
|
|
if (__position_ != _Position())
|
2014-01-09 18:25:57 +00:00
|
|
|
__establish_result ();
|
2016-12-24 00:24:44 +00:00
|
|
|
else if (__subs_[__n_] == -1)
|
2010-08-17 20:42:03 +00:00
|
|
|
{
|
|
|
|
__suffix_.matched = true;
|
|
|
|
__suffix_.first = __a;
|
|
|
|
__suffix_.second = __b;
|
|
|
|
__result_ = &__suffix_;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__result_ = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
|
|
|
regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type& __re, int __submatch,
|
|
|
|
regex_constants::match_flag_type __m)
|
|
|
|
: __position_(__a, __b, __re, __m),
|
2016-12-24 00:24:44 +00:00
|
|
|
__n_(0),
|
2010-08-17 20:42:03 +00:00
|
|
|
__subs_(1, __submatch)
|
|
|
|
{
|
|
|
|
__init(__a, __b);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
|
|
|
regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type& __re, const vector<int>& __submatches,
|
|
|
|
regex_constants::match_flag_type __m)
|
|
|
|
: __position_(__a, __b, __re, __m),
|
2016-12-24 00:24:44 +00:00
|
|
|
__n_(0),
|
2010-08-17 20:42:03 +00:00
|
|
|
__subs_(__submatches)
|
|
|
|
{
|
|
|
|
__init(__a, __b);
|
|
|
|
}
|
|
|
|
|
2017-04-18 23:42:15 +00:00
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
2011-08-12 21:56:02 +00:00
|
|
|
|
2010-08-17 20:42:03 +00:00
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
|
|
|
regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type& __re,
|
|
|
|
initializer_list<int> __submatches,
|
|
|
|
regex_constants::match_flag_type __m)
|
|
|
|
: __position_(__a, __b, __re, __m),
|
2016-12-24 00:24:44 +00:00
|
|
|
__n_(0),
|
2010-08-17 20:42:03 +00:00
|
|
|
__subs_(__submatches)
|
|
|
|
{
|
|
|
|
__init(__a, __b);
|
|
|
|
}
|
|
|
|
|
2021-04-20 12:03:32 -04:00
|
|
|
#endif // _LIBCPP_CXX03_LANG
|
2011-08-12 21:56:02 +00:00
|
|
|
|
2010-08-17 20:42:03 +00:00
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
2011-11-29 18:15:50 +00:00
|
|
|
template <size_t _Np>
|
2010-08-17 20:42:03 +00:00
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
|
|
|
regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
|
|
|
|
const regex_type& __re,
|
2011-11-29 18:15:50 +00:00
|
|
|
const int (&__submatches)[_Np],
|
2010-08-17 20:42:03 +00:00
|
|
|
regex_constants::match_flag_type __m)
|
|
|
|
: __position_(__a, __b, __re, __m),
|
2016-12-24 00:24:44 +00:00
|
|
|
__n_(0),
|
2019-01-24 02:02:50 +00:00
|
|
|
__subs_(begin(__submatches), end(__submatches))
|
2010-08-17 20:42:03 +00:00
|
|
|
{
|
|
|
|
__init(__a, __b);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
|
|
|
regex_token_iterator(const regex_token_iterator& __x)
|
|
|
|
: __position_(__x.__position_),
|
|
|
|
__result_(__x.__result_),
|
|
|
|
__suffix_(__x.__suffix_),
|
2016-12-24 00:24:44 +00:00
|
|
|
__n_(__x.__n_),
|
2010-08-17 20:42:03 +00:00
|
|
|
__subs_(__x.__subs_)
|
|
|
|
{
|
|
|
|
if (__x.__result_ == &__x.__suffix_)
|
2014-01-13 17:47:08 +00:00
|
|
|
__result_ = &__suffix_;
|
2014-01-09 18:25:57 +00:00
|
|
|
else if ( __result_ != nullptr )
|
|
|
|
__establish_result ();
|
2010-08-17 20:42:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
|
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
|
|
|
operator=(const regex_token_iterator& __x)
|
|
|
|
{
|
|
|
|
if (this != &__x)
|
|
|
|
{
|
|
|
|
__position_ = __x.__position_;
|
|
|
|
if (__x.__result_ == &__x.__suffix_)
|
2014-01-09 18:25:57 +00:00
|
|
|
__result_ = &__suffix_;
|
2010-08-17 20:42:03 +00:00
|
|
|
else
|
|
|
|
__result_ = __x.__result_;
|
|
|
|
__suffix_ = __x.__suffix_;
|
2016-12-24 00:24:44 +00:00
|
|
|
__n_ = __x.__n_;
|
2010-08-17 20:42:03 +00:00
|
|
|
__subs_ = __x.__subs_;
|
2014-01-09 18:25:57 +00:00
|
|
|
|
|
|
|
if ( __result_ != nullptr && __result_ != &__suffix_ )
|
|
|
|
__establish_result();
|
2010-08-17 20:42:03 +00:00
|
|
|
}
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
bool
|
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
|
|
|
operator==(const regex_token_iterator& __x) const
|
|
|
|
{
|
|
|
|
if (__result_ == nullptr && __x.__result_ == nullptr)
|
|
|
|
return true;
|
|
|
|
if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
|
|
|
|
__suffix_ == __x.__suffix_)
|
|
|
|
return true;
|
|
|
|
if (__result_ == nullptr || __x.__result_ == nullptr)
|
|
|
|
return false;
|
|
|
|
if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
|
|
|
|
return false;
|
2016-12-24 00:24:44 +00:00
|
|
|
return __position_ == __x.__position_ && __n_ == __x.__n_ &&
|
2010-08-17 20:42:03 +00:00
|
|
|
__subs_ == __x.__subs_;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _BidirectionalIterator, class _CharT, class _Traits>
|
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
|
|
|
|
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
|
|
|
|
{
|
|
|
|
_Position __prev = __position_;
|
|
|
|
if (__result_ == &__suffix_)
|
|
|
|
__result_ = nullptr;
|
2016-12-24 00:24:44 +00:00
|
|
|
else if (static_cast<size_t>(__n_ + 1) < __subs_.size())
|
2010-08-17 20:42:03 +00:00
|
|
|
{
|
2016-12-24 00:24:44 +00:00
|
|
|
++__n_;
|
2014-01-09 18:25:57 +00:00
|
|
|
__establish_result();
|
2010-08-17 20:42:03 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2016-12-24 00:24:44 +00:00
|
|
|
__n_ = 0;
|
2010-08-17 20:42:03 +00:00
|
|
|
++__position_;
|
|
|
|
if (__position_ != _Position())
|
2014-01-09 18:25:57 +00:00
|
|
|
__establish_result();
|
2010-08-17 20:42:03 +00:00
|
|
|
else
|
|
|
|
{
|
2011-06-30 21:18:19 +00:00
|
|
|
if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
|
2010-08-17 20:42:03 +00:00
|
|
|
&& __prev->suffix().length() != 0)
|
|
|
|
{
|
|
|
|
__suffix_.matched = true;
|
|
|
|
__suffix_.first = __prev->suffix().first;
|
|
|
|
__suffix_.second = __prev->suffix().second;
|
|
|
|
__result_ = &__suffix_;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__result_ = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2010-08-18 00:13:08 +00:00
|
|
|
// regex_replace
|
|
|
|
|
|
|
|
template <class _OutputIterator, class _BidirectionalIterator,
|
|
|
|
class _Traits, class _CharT>
|
2022-08-13 13:23:16 +02:00
|
|
|
_LIBCPP_HIDE_FROM_ABI _OutputIterator
|
2017-11-14 11:14:25 +00:00
|
|
|
regex_replace(_OutputIterator __output_iter,
|
2010-08-18 00:13:08 +00:00
|
|
|
_BidirectionalIterator __first, _BidirectionalIterator __last,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
|
|
|
typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
|
|
|
|
_Iter __i(__first, __last, __e, __flags);
|
|
|
|
_Iter __eof;
|
|
|
|
if (__i == __eof)
|
|
|
|
{
|
|
|
|
if (!(__flags & regex_constants::format_no_copy))
|
2017-11-14 11:14:25 +00:00
|
|
|
__output_iter = _VSTD::copy(__first, __last, __output_iter);
|
2010-08-18 00:13:08 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sub_match<_BidirectionalIterator> __lm;
|
|
|
|
for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
|
|
|
|
{
|
|
|
|
if (!(__flags & regex_constants::format_no_copy))
|
2017-11-14 11:14:25 +00:00
|
|
|
__output_iter = _VSTD::copy(__i->prefix().first, __i->prefix().second, __output_iter);
|
|
|
|
__output_iter = __i->format(__output_iter, __fmt, __fmt + __len, __flags);
|
2010-08-18 00:13:08 +00:00
|
|
|
__lm = __i->suffix();
|
|
|
|
if (__flags & regex_constants::format_first_only)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!(__flags & regex_constants::format_no_copy))
|
2017-11-14 11:14:25 +00:00
|
|
|
__output_iter = _VSTD::copy(__lm.first, __lm.second, __output_iter);
|
2010-08-18 00:13:08 +00:00
|
|
|
}
|
2017-11-14 11:14:25 +00:00
|
|
|
return __output_iter;
|
2010-08-18 00:13:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _OutputIterator, class _BidirectionalIterator,
|
|
|
|
class _Traits, class _CharT, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
_OutputIterator
|
2017-11-14 11:14:25 +00:00
|
|
|
regex_replace(_OutputIterator __output_iter,
|
2010-08-18 00:13:08 +00:00
|
|
|
_BidirectionalIterator __first, _BidirectionalIterator __last,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
const basic_string<_CharT, _ST, _SA>& __fmt,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
2017-11-14 11:14:25 +00:00
|
|
|
return _VSTD::regex_replace(__output_iter, __first, __last, __e, __fmt.c_str(), __flags);
|
2010-08-18 00:13:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
|
|
|
|
class _FSA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
basic_string<_CharT, _ST, _SA>
|
|
|
|
regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
const basic_string<_CharT, _FST, _FSA>& __fmt,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
|
|
|
basic_string<_CharT, _ST, _SA> __r;
|
2011-06-30 21:18:19 +00:00
|
|
|
_VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
|
2010-08-18 00:13:08 +00:00
|
|
|
__fmt.c_str(), __flags);
|
|
|
|
return __r;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _Traits, class _CharT, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
basic_string<_CharT, _ST, _SA>
|
|
|
|
regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
|
|
|
basic_string<_CharT, _ST, _SA> __r;
|
2011-06-30 21:18:19 +00:00
|
|
|
_VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
|
2010-08-18 00:13:08 +00:00
|
|
|
__fmt, __flags);
|
|
|
|
return __r;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _Traits, class _CharT, class _ST, class _SA>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
basic_string<_CharT>
|
|
|
|
regex_replace(const _CharT* __s,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
const basic_string<_CharT, _ST, _SA>& __fmt,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
|
|
|
basic_string<_CharT> __r;
|
2011-06-30 21:18:19 +00:00
|
|
|
_VSTD::regex_replace(back_inserter(__r), __s,
|
2010-08-18 00:13:08 +00:00
|
|
|
__s + char_traits<_CharT>::length(__s), __e,
|
|
|
|
__fmt.c_str(), __flags);
|
|
|
|
return __r;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class _Traits, class _CharT>
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
|
|
basic_string<_CharT>
|
|
|
|
regex_replace(const _CharT* __s,
|
|
|
|
const basic_regex<_CharT, _Traits>& __e,
|
|
|
|
const _CharT* __fmt,
|
|
|
|
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
|
|
|
{
|
|
|
|
basic_string<_CharT> __r;
|
2011-06-30 21:18:19 +00:00
|
|
|
_VSTD::regex_replace(back_inserter(__r), __s,
|
2010-08-18 00:13:08 +00:00
|
|
|
__s + char_traits<_CharT>::length(__s), __e,
|
|
|
|
__fmt, __flags);
|
|
|
|
return __r;
|
|
|
|
}
|
|
|
|
|
2010-06-17 00:34:59 +00:00
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
|
2017-05-31 22:07:49 +00:00
|
|
|
_LIBCPP_POP_MACROS
|
|
|
|
|
2021-04-20 12:03:32 -04:00
|
|
|
#endif // _LIBCPP_REGEX
|