update boost
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
#define BOOST_REGEX_V4_BASIC_REGEX_HPP
|
||||
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
#include <boost/functional/hash.hpp>
|
||||
#include <boost/container_hash/hash.hpp>
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
@@ -70,13 +70,14 @@ void bubble_down_one(I first, I last)
|
||||
}
|
||||
}
|
||||
|
||||
static const int hash_value_mask = 1 << (std::numeric_limits<int>::digits - 1);
|
||||
|
||||
template <class Iterator>
|
||||
inline int hash_value_from_capture_name(Iterator i, Iterator j)
|
||||
{
|
||||
std::size_t r = boost::hash_range(i, j);
|
||||
r %= ((std::numeric_limits<int>::max)() - 10001);
|
||||
r += 10000;
|
||||
return static_cast<int>(r);
|
||||
r %= ((std::numeric_limits<int>::max)());
|
||||
return static_cast<int>(r) | hash_value_mask;
|
||||
}
|
||||
|
||||
class named_subexpressions
|
||||
@@ -170,9 +171,19 @@ struct regex_data : public named_subexpressions
|
||||
|
||||
regex_data(const ::boost::shared_ptr<
|
||||
::boost::regex_traits_wrapper<traits> >& t)
|
||||
: m_ptraits(t), m_expression(0), m_expression_len(0), m_disable_match_any(false) {}
|
||||
: m_ptraits(t), m_flags(0), m_status(0), m_expression(0), m_expression_len(0),
|
||||
m_mark_count(0), m_first_state(0), m_restart_type(0),
|
||||
#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) && !(defined(BOOST_MSVC) && (BOOST_MSVC < 1900))
|
||||
m_startmap{ 0 },
|
||||
#endif
|
||||
m_can_be_null(0), m_word_mask(0), m_has_recursions(false), m_disable_match_any(false) {}
|
||||
regex_data()
|
||||
: m_ptraits(new ::boost::regex_traits_wrapper<traits>()), m_expression(0), m_expression_len(0), m_disable_match_any(false) {}
|
||||
: m_ptraits(new ::boost::regex_traits_wrapper<traits>()), m_flags(0), m_status(0), m_expression(0), m_expression_len(0),
|
||||
m_mark_count(0), m_first_state(0), m_restart_type(0),
|
||||
#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) && !(defined(BOOST_MSVC) && (BOOST_MSVC < 1900))
|
||||
m_startmap{ 0 },
|
||||
#endif
|
||||
m_can_be_null(0), m_word_mask(0), m_has_recursions(false), m_disable_match_any(false) {}
|
||||
|
||||
::boost::shared_ptr<
|
||||
::boost::regex_traits_wrapper<traits>
|
||||
@@ -405,7 +416,7 @@ public:
|
||||
{
|
||||
typedef typename traits::string_type seq_type;
|
||||
seq_type a(arg_first, arg_last);
|
||||
if(a.size())
|
||||
if(!a.empty())
|
||||
assign(static_cast<const charT*>(&*a.begin()), static_cast<const charT*>(&*a.begin() + a.size()), f);
|
||||
else
|
||||
assign(static_cast<const charT*>(0), static_cast<const charT*>(0), f);
|
||||
@@ -606,32 +617,32 @@ public:
|
||||
//
|
||||
const BOOST_REGEX_DETAIL_NS::re_syntax_base* get_first_state()const
|
||||
{
|
||||
BOOST_ASSERT(0 != m_pimpl.get());
|
||||
BOOST_REGEX_ASSERT(0 != m_pimpl.get());
|
||||
return m_pimpl->get_first_state();
|
||||
}
|
||||
unsigned get_restart_type()const
|
||||
{
|
||||
BOOST_ASSERT(0 != m_pimpl.get());
|
||||
BOOST_REGEX_ASSERT(0 != m_pimpl.get());
|
||||
return m_pimpl->get_restart_type();
|
||||
}
|
||||
const unsigned char* get_map()const
|
||||
{
|
||||
BOOST_ASSERT(0 != m_pimpl.get());
|
||||
BOOST_REGEX_ASSERT(0 != m_pimpl.get());
|
||||
return m_pimpl->get_map();
|
||||
}
|
||||
const ::boost::regex_traits_wrapper<traits>& get_traits()const
|
||||
{
|
||||
BOOST_ASSERT(0 != m_pimpl.get());
|
||||
BOOST_REGEX_ASSERT(0 != m_pimpl.get());
|
||||
return m_pimpl->get_traits();
|
||||
}
|
||||
bool can_be_null()const
|
||||
{
|
||||
BOOST_ASSERT(0 != m_pimpl.get());
|
||||
BOOST_REGEX_ASSERT(0 != m_pimpl.get());
|
||||
return m_pimpl->can_be_null();
|
||||
}
|
||||
const BOOST_REGEX_DETAIL_NS::regex_data<charT, traits>& get_data()const
|
||||
{
|
||||
BOOST_ASSERT(0 != m_pimpl.get());
|
||||
BOOST_REGEX_ASSERT(0 != m_pimpl.get());
|
||||
return m_pimpl->get_data();
|
||||
}
|
||||
boost::shared_ptr<BOOST_REGEX_DETAIL_NS::named_subexpressions > get_named_subs()const
|
||||
@@ -646,7 +657,7 @@ private:
|
||||
//
|
||||
// out of line members;
|
||||
// these are the only members that mutate the basic_regex object,
|
||||
// and are designed to provide the strong exception guarentee
|
||||
// and are designed to provide the strong exception guarantee
|
||||
// (in the event of a throw, the state of the object remains unchanged).
|
||||
//
|
||||
template <class charT, class traits>
|
||||
@@ -784,4 +795,3 @@ public:
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
#ifndef BOOST_REGEX_V4_BASIC_REGEX_CREATOR_HPP
|
||||
#define BOOST_REGEX_V4_BASIC_REGEX_CREATOR_HPP
|
||||
|
||||
#include <boost/regex/v4/indexed_bit_flag.hpp>
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
@@ -50,11 +52,14 @@ struct digraph : public std::pair<charT, charT>
|
||||
digraph(charT c1, charT c2) : std::pair<charT, charT>(c1, c2)
|
||||
{}
|
||||
digraph(const digraph<charT>& d) : std::pair<charT, charT>(d.first, d.second){}
|
||||
#ifndef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
|
||||
digraph<charT>& operator=(const digraph<charT>&) = default;
|
||||
#endif
|
||||
template <class Seq>
|
||||
digraph(const Seq& s) : std::pair<charT, charT>()
|
||||
{
|
||||
BOOST_ASSERT(s.size() <= 2);
|
||||
BOOST_ASSERT(s.size());
|
||||
BOOST_REGEX_ASSERT(s.size() <= 2);
|
||||
BOOST_REGEX_ASSERT(s.size());
|
||||
this->first = s[0];
|
||||
this->second = (s.size() > 1) ? s[1] : 0;
|
||||
}
|
||||
@@ -239,9 +244,9 @@ protected:
|
||||
bool m_icase; // true for case insensitive matches
|
||||
unsigned m_repeater_id; // the state_id of the next repeater
|
||||
bool m_has_backrefs; // true if there are actually any backrefs
|
||||
unsigned m_backrefs; // bitmask of permitted backrefs
|
||||
indexed_bit_flag m_backrefs; // bitmask of permitted backrefs
|
||||
boost::uintmax_t m_bad_repeats; // bitmask of repeats we can't deduce a startmap for;
|
||||
bool m_has_recursions; // set when we have recursive expresisons to fixup
|
||||
bool m_has_recursions; // set when we have recursive expressions to fixup
|
||||
std::vector<unsigned char> m_recursion_checks; // notes which recursions we've followed while analysing this expression
|
||||
typename traits::char_class_type m_word_mask; // mask used to determine if a character is a word character
|
||||
typename traits::char_class_type m_mask_space; // mask used to determine if a character is a word character
|
||||
@@ -267,7 +272,8 @@ private:
|
||||
|
||||
template <class charT, class traits>
|
||||
basic_regex_creator<charT, traits>::basic_regex_creator(regex_data<charT, traits>* data)
|
||||
: m_pdata(data), m_traits(*(data->m_ptraits)), m_last_state(0), m_repeater_id(0), m_has_backrefs(false), m_backrefs(0), m_has_recursions(false)
|
||||
: m_pdata(data), m_traits(*(data->m_ptraits)), m_last_state(0), m_icase(false), m_repeater_id(0),
|
||||
m_has_backrefs(false), m_bad_repeats(0), m_has_recursions(false), m_word_mask(0), m_mask_space(0), m_lower_mask(0), m_upper_mask(0), m_alpha_mask(0)
|
||||
{
|
||||
m_pdata->m_data.clear();
|
||||
m_pdata->m_status = ::boost::regex_constants::error_ok;
|
||||
@@ -282,11 +288,11 @@ basic_regex_creator<charT, traits>::basic_regex_creator(regex_data<charT, traits
|
||||
m_upper_mask = m_traits.lookup_classname(u, u + 5);
|
||||
m_alpha_mask = m_traits.lookup_classname(a, a + 5);
|
||||
m_pdata->m_word_mask = m_word_mask;
|
||||
BOOST_ASSERT(m_word_mask != 0);
|
||||
BOOST_ASSERT(m_mask_space != 0);
|
||||
BOOST_ASSERT(m_lower_mask != 0);
|
||||
BOOST_ASSERT(m_upper_mask != 0);
|
||||
BOOST_ASSERT(m_alpha_mask != 0);
|
||||
BOOST_REGEX_ASSERT(m_word_mask != 0);
|
||||
BOOST_REGEX_ASSERT(m_mask_space != 0);
|
||||
BOOST_REGEX_ASSERT(m_lower_mask != 0);
|
||||
BOOST_REGEX_ASSERT(m_upper_mask != 0);
|
||||
BOOST_REGEX_ASSERT(m_alpha_mask != 0);
|
||||
}
|
||||
|
||||
template <class charT, class traits>
|
||||
@@ -300,7 +306,7 @@ re_syntax_base* basic_regex_creator<charT, traits>::append_state(syntax_element_
|
||||
// set the offset to the next state in our last one:
|
||||
if(m_last_state)
|
||||
m_last_state->next.i = m_pdata->m_data.size() - getoffset(m_last_state);
|
||||
// now actually extent our data:
|
||||
// now actually extend our data:
|
||||
m_last_state = static_cast<re_syntax_base*>(m_pdata->m_data.extend(s));
|
||||
// fill in boilerplate options in the new state:
|
||||
m_last_state->next.i = 0;
|
||||
@@ -444,9 +450,9 @@ re_syntax_base* basic_regex_creator<charT, traits>::append_set(
|
||||
charT a2[3] = { c2.first, c2.second, charT(0), };
|
||||
s1 = this->m_traits.transform(a1, (a1[1] ? a1+2 : a1+1));
|
||||
s2 = this->m_traits.transform(a2, (a2[1] ? a2+2 : a2+1));
|
||||
if(s1.size() == 0)
|
||||
if(s1.empty())
|
||||
s1 = string_type(1, charT(0));
|
||||
if(s2.size() == 0)
|
||||
if(s2.empty())
|
||||
s2 = string_type(1, charT(0));
|
||||
}
|
||||
else
|
||||
@@ -574,7 +580,7 @@ re_syntax_base* basic_regex_creator<charT, traits>::append_set(
|
||||
// Oops error:
|
||||
return 0;
|
||||
}
|
||||
BOOST_ASSERT(c3[1] == charT(0));
|
||||
BOOST_REGEX_ASSERT(c3[1] == charT(0));
|
||||
for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
|
||||
{
|
||||
c3[0] = static_cast<charT>(i);
|
||||
@@ -591,7 +597,7 @@ re_syntax_base* basic_regex_creator<charT, traits>::append_set(
|
||||
return 0;
|
||||
}
|
||||
// everything in range matches:
|
||||
std::memset(result->_map + static_cast<unsigned char>(c1), true, 1 + static_cast<unsigned char>(c2) - static_cast<unsigned char>(c1));
|
||||
std::memset(result->_map + static_cast<unsigned char>(c1), true, static_cast<unsigned char>(1u) + static_cast<unsigned char>(static_cast<unsigned char>(c2) - static_cast<unsigned char>(c1)));
|
||||
}
|
||||
}
|
||||
//
|
||||
@@ -639,7 +645,7 @@ re_syntax_base* basic_regex_creator<charT, traits>::append_set(
|
||||
while(sfirst != slast)
|
||||
{
|
||||
string_type s;
|
||||
BOOST_ASSERT(static_cast<charT>(0) == sfirst->second);
|
||||
BOOST_REGEX_ASSERT(static_cast<charT>(0) == sfirst->second);
|
||||
s = m_traits.transform_primary(&sfirst->first, &sfirst->first+1);
|
||||
if(s.empty())
|
||||
return 0; // invalid or unsupported equivalence class
|
||||
@@ -763,7 +769,7 @@ void basic_regex_creator<charT, traits>::fixup_recursions(re_syntax_base* state)
|
||||
if(idx < 0)
|
||||
{
|
||||
idx = -idx-1;
|
||||
if(idx >= 10000)
|
||||
if(idx >= hash_value_mask)
|
||||
{
|
||||
idx = m_pdata->get_id(idx);
|
||||
if(idx <= 0)
|
||||
@@ -795,7 +801,7 @@ void basic_regex_creator<charT, traits>::fixup_recursions(re_syntax_base* state)
|
||||
bool ok = false;
|
||||
re_syntax_base* p = base;
|
||||
std::ptrdiff_t idx = static_cast<re_jump*>(state)->alt.i;
|
||||
if(idx > 10000)
|
||||
if(idx >= hash_value_mask)
|
||||
{
|
||||
//
|
||||
// There may be more than one capture group with this hash, just do what Perl
|
||||
@@ -948,7 +954,7 @@ void basic_regex_creator<charT, traits>::create_startmaps(re_syntax_base* state)
|
||||
}
|
||||
|
||||
// now work through our list, building all the maps as we go:
|
||||
while(v.size())
|
||||
while(!v.empty())
|
||||
{
|
||||
// Initialize m_recursion_checks if we need it:
|
||||
if(m_has_recursions)
|
||||
@@ -1032,7 +1038,7 @@ int basic_regex_creator<charT, traits>::calculate_backstep(re_syntax_base* state
|
||||
}
|
||||
else if(state->type == syntax_element_long_set_rep)
|
||||
{
|
||||
BOOST_ASSERT(rep->next.p->type == syntax_element_long_set);
|
||||
BOOST_REGEX_ASSERT(rep->next.p->type == syntax_element_long_set);
|
||||
if(static_cast<re_set_long<m_type>*>(rep->next.p)->singleton == 0)
|
||||
return -1;
|
||||
if(rep->max != rep->min)
|
||||
@@ -1067,9 +1073,21 @@ int basic_regex_creator<charT, traits>::calculate_backstep(re_syntax_base* state
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct recursion_saver
|
||||
{
|
||||
std::vector<unsigned char> saved_state;
|
||||
std::vector<unsigned char>* state;
|
||||
recursion_saver(std::vector<unsigned char>* p) : saved_state(*p), state(p) {}
|
||||
~recursion_saver()
|
||||
{
|
||||
state->swap(saved_state);
|
||||
}
|
||||
};
|
||||
|
||||
template <class charT, class traits>
|
||||
void basic_regex_creator<charT, traits>::create_startmap(re_syntax_base* state, unsigned char* l_map, unsigned int* pnull, unsigned char mask)
|
||||
{
|
||||
recursion_saver saved_recursions(&m_recursion_checks);
|
||||
int not_last_jump = 1;
|
||||
re_syntax_base* recursion_start = 0;
|
||||
int recursion_sub = 0;
|
||||
@@ -1120,7 +1138,7 @@ void basic_regex_creator<charT, traits>::create_startmap(re_syntax_base* state,
|
||||
}
|
||||
case syntax_element_recurse:
|
||||
{
|
||||
BOOST_ASSERT(static_cast<const re_jump*>(state)->alt.p->type == syntax_element_startmark);
|
||||
BOOST_REGEX_ASSERT(static_cast<const re_jump*>(state)->alt.p->type == syntax_element_startmark);
|
||||
recursion_sub = static_cast<re_brace*>(static_cast<const re_jump*>(state)->alt.p)->index;
|
||||
if(m_recursion_checks[recursion_sub] & 1u)
|
||||
{
|
||||
@@ -1501,7 +1519,7 @@ template <class charT, class traits>
|
||||
void basic_regex_creator<charT, traits>::probe_leading_repeat(re_syntax_base* state)
|
||||
{
|
||||
// enumerate our states, and see if we have a leading repeat
|
||||
// for which failed search restarts can be optimised;
|
||||
// for which failed search restarts can be optimized;
|
||||
do
|
||||
{
|
||||
switch(state->type)
|
||||
@@ -1512,6 +1530,10 @@ void basic_regex_creator<charT, traits>::probe_leading_repeat(re_syntax_base* st
|
||||
state = state->next.p;
|
||||
continue;
|
||||
}
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(push)
|
||||
#pragma warning(disable:6011)
|
||||
#endif
|
||||
if((static_cast<re_brace*>(state)->index == -1)
|
||||
|| (static_cast<re_brace*>(state)->index == -2))
|
||||
{
|
||||
@@ -1519,6 +1541,9 @@ void basic_regex_creator<charT, traits>::probe_leading_repeat(re_syntax_base* st
|
||||
state = static_cast<const re_jump*>(state->next.p)->alt.p->next.p;
|
||||
continue;
|
||||
}
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
if(static_cast<re_brace*>(state)->index == -3)
|
||||
{
|
||||
// Have to skip the leading jump state:
|
||||
@@ -1551,7 +1576,6 @@ void basic_regex_creator<charT, traits>::probe_leading_repeat(re_syntax_base* st
|
||||
}while(state);
|
||||
}
|
||||
|
||||
|
||||
} // namespace BOOST_REGEX_DETAIL_NS
|
||||
|
||||
} // namespace boost
|
||||
@@ -1572,4 +1596,3 @@ void basic_regex_creator<charT, traits>::probe_leading_repeat(re_syntax_base* st
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
#if BOOST_MSVC >= 1800
|
||||
#pragma warning(disable: 26812)
|
||||
#endif
|
||||
#endif
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_PREFIX
|
||||
@@ -124,7 +127,8 @@ private:
|
||||
|
||||
template <class charT, class traits>
|
||||
basic_regex_parser<charT, traits>::basic_regex_parser(regex_data<charT, traits>* data)
|
||||
: basic_regex_creator<charT, traits>(data), m_mark_count(0), m_mark_reset(-1), m_max_mark(0), m_paren_start(0), m_alt_insert_point(0), m_has_case_change(false), m_recursion_count(0)
|
||||
: basic_regex_creator<charT, traits>(data), m_parser_proc(), m_base(0), m_end(0), m_position(0),
|
||||
m_mark_count(0), m_mark_reset(-1), m_max_mark(0), m_paren_start(0), m_alt_insert_point(0), m_has_case_change(false), m_recursion_count(0)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -168,7 +172,7 @@ void basic_regex_parser<charT, traits>::parse(const charT* p1, const charT* p2,
|
||||
m_parser_proc = &basic_regex_parser<charT, traits>::parse_literal;
|
||||
break;
|
||||
default:
|
||||
// Ooops, someone has managed to set more than one of the main option flags,
|
||||
// Oops, someone has managed to set more than one of the main option flags,
|
||||
// so this must be an error:
|
||||
fail(regex_constants::error_unknown, 0, "An invalid combination of regular expression syntax flags was used.");
|
||||
return;
|
||||
@@ -193,7 +197,7 @@ void basic_regex_parser<charT, traits>::parse(const charT* p1, const charT* p2,
|
||||
if(this->m_pdata->m_status)
|
||||
return;
|
||||
// fill in our sub-expression count:
|
||||
this->m_pdata->m_mark_count = 1 + m_mark_count;
|
||||
this->m_pdata->m_mark_count = 1u + (std::size_t)m_mark_count;
|
||||
this->finalize(p1, p2);
|
||||
}
|
||||
|
||||
@@ -321,6 +325,12 @@ bool basic_regex_parser<charT, traits>::parse_basic()
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(push)
|
||||
#if BOOST_MSVC >= 1800
|
||||
#pragma warning(disable:26812)
|
||||
#endif
|
||||
#endif
|
||||
template <class charT, class traits>
|
||||
bool basic_regex_parser<charT, traits>::parse_extended()
|
||||
{
|
||||
@@ -409,6 +419,9 @@ bool basic_regex_parser<charT, traits>::parse_extended()
|
||||
return result;
|
||||
}
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
@@ -545,8 +558,8 @@ bool basic_regex_parser<charT, traits>::parse_open_paren()
|
||||
//
|
||||
// allow backrefs to this mark:
|
||||
//
|
||||
if((markid > 0) && (markid < sizeof(unsigned) * CHAR_BIT))
|
||||
this->m_backrefs |= 1u << (markid - 1);
|
||||
if(markid > 0)
|
||||
this->m_backrefs.set(markid);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -859,7 +872,7 @@ escape_type_class_jump:
|
||||
{
|
||||
bool have_brace = false;
|
||||
bool negative = false;
|
||||
static const char* incomplete_message = "Incomplete \\g escape found.";
|
||||
static const char incomplete_message[] = "Incomplete \\g escape found.";
|
||||
if(++m_position == m_end)
|
||||
{
|
||||
fail(regex_constants::error_escape, m_position - m_base, incomplete_message);
|
||||
@@ -911,8 +924,8 @@ escape_type_class_jump:
|
||||
pc = m_position;
|
||||
}
|
||||
if(negative)
|
||||
i = 1 + m_mark_count - i;
|
||||
if(((i > 0) && (i < std::numeric_limits<unsigned>::digits) && (i - 1 < static_cast<boost::intmax_t>(sizeof(unsigned) * CHAR_BIT)) && (this->m_backrefs & (1u << (i-1)))) || ((i > 10000) && (this->m_pdata->get_id(i) > 0) && (this->m_pdata->get_id(i)-1 < static_cast<boost::intmax_t>(sizeof(unsigned) * CHAR_BIT)) && (this->m_backrefs & (1u << (this->m_pdata->get_id(i)-1)))))
|
||||
i = 1 + (static_cast<boost::intmax_t>(m_mark_count) - i);
|
||||
if(((i < hash_value_mask) && (i > 0) && (this->m_backrefs.test(i))) || ((i >= hash_value_mask) && (this->m_pdata->get_id(i) > 0) && (this->m_backrefs.test(this->m_pdata->get_id(i)))))
|
||||
{
|
||||
m_position = pc;
|
||||
re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_backref, sizeof(re_brace)));
|
||||
@@ -968,7 +981,7 @@ template <class charT, class traits>
|
||||
bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_t high)
|
||||
{
|
||||
bool greedy = true;
|
||||
bool pocessive = false;
|
||||
bool possessive = false;
|
||||
std::size_t insert_point;
|
||||
//
|
||||
// when we get to here we may have a non-greedy ? mark still to come:
|
||||
@@ -992,12 +1005,12 @@ bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_
|
||||
greedy = false;
|
||||
++m_position;
|
||||
}
|
||||
// for perl regexes only check for pocessive ++ repeats.
|
||||
// for perl regexes only check for possessive ++ repeats.
|
||||
if((m_position != m_end)
|
||||
&& (0 == (this->flags() & regbase::main_option_type))
|
||||
&& (this->m_traits.syntax_type(*m_position) == regex_constants::syntax_plus))
|
||||
{
|
||||
pocessive = true;
|
||||
possessive = true;
|
||||
++m_position;
|
||||
}
|
||||
}
|
||||
@@ -1042,6 +1055,7 @@ bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_
|
||||
case syntax_element_jump:
|
||||
case syntax_element_startmark:
|
||||
case syntax_element_backstep:
|
||||
case syntax_element_toggle_case:
|
||||
// can't legally repeat any of the above:
|
||||
fail(regex_constants::error_badrepeat, m_position - m_base);
|
||||
return false;
|
||||
@@ -1069,10 +1083,10 @@ bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_
|
||||
rep = static_cast<re_repeat*>(this->getaddress(rep_off));
|
||||
rep->alt.i = this->m_pdata->m_data.size() - rep_off;
|
||||
//
|
||||
// If the repeat is pocessive then bracket the repeat with a (?>...)
|
||||
// If the repeat is possessive then bracket the repeat with a (?>...)
|
||||
// independent sub-expression construct:
|
||||
//
|
||||
if(pocessive)
|
||||
if(possessive)
|
||||
{
|
||||
if(m_position != m_end)
|
||||
{
|
||||
@@ -1111,6 +1125,9 @@ bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_
|
||||
}
|
||||
else
|
||||
contin = false;
|
||||
break;
|
||||
default:
|
||||
contin = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1133,7 +1150,7 @@ bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_
|
||||
template <class charT, class traits>
|
||||
bool basic_regex_parser<charT, traits>::parse_repeat_range(bool isbasic)
|
||||
{
|
||||
static const char* incomplete_message = "Missing } in quantified repetition.";
|
||||
static const char incomplete_message[] = "Missing } in quantified repetition.";
|
||||
//
|
||||
// parse a repeat-range:
|
||||
//
|
||||
@@ -1339,7 +1356,7 @@ bool basic_regex_parser<charT, traits>::parse_alt()
|
||||
template <class charT, class traits>
|
||||
bool basic_regex_parser<charT, traits>::parse_set()
|
||||
{
|
||||
static const char* incomplete_message = "Character set declaration starting with [ terminated prematurely - either no ] was found or the set had no content.";
|
||||
static const char incomplete_message[] = "Character set declaration starting with [ terminated prematurely - either no ] was found or the set had no content.";
|
||||
++m_position;
|
||||
if(m_position == m_end)
|
||||
{
|
||||
@@ -1431,7 +1448,7 @@ bool basic_regex_parser<charT, traits>::parse_set()
|
||||
template <class charT, class traits>
|
||||
bool basic_regex_parser<charT, traits>::parse_inner_set(basic_char_set<charT, traits>& char_set)
|
||||
{
|
||||
static const char* incomplete_message = "Character class declaration starting with [ terminated prematurely - either no ] was found or the set had no content.";
|
||||
static const char incomplete_message[] = "Character class declaration starting with [ terminated prematurely - either no ] was found or the set had no content.";
|
||||
//
|
||||
// we have either a character class [:name:]
|
||||
// a collating element [.name.]
|
||||
@@ -1529,7 +1546,7 @@ bool basic_regex_parser<charT, traits>::parse_inner_set(basic_char_set<charT, tr
|
||||
fail(regex_constants::error_ctype, name_first - m_base);
|
||||
return false;
|
||||
}
|
||||
if(negated == false)
|
||||
if(!negated)
|
||||
char_set.add_class(m);
|
||||
else
|
||||
char_set.add_negated_class(m);
|
||||
@@ -1567,7 +1584,7 @@ bool basic_regex_parser<charT, traits>::parse_inner_set(basic_char_set<charT, tr
|
||||
return false;
|
||||
}
|
||||
string_type m = this->m_traits.lookup_collatename(name_first, name_last);
|
||||
if((0 == m.size()) || (m.size() > 2))
|
||||
if(m.empty() || (m.size() > 2))
|
||||
{
|
||||
fail(regex_constants::error_collate, name_first - m_base);
|
||||
return false;
|
||||
@@ -1935,7 +1952,7 @@ charT basic_regex_parser<charT, traits>::unescape_character()
|
||||
template <class charT, class traits>
|
||||
bool basic_regex_parser<charT, traits>::parse_backref()
|
||||
{
|
||||
BOOST_ASSERT(m_position != m_end);
|
||||
BOOST_REGEX_ASSERT(m_position != m_end);
|
||||
const charT* pc = m_position;
|
||||
boost::intmax_t i = this->m_traits.toi(pc, pc + 1, 10);
|
||||
if((i == 0) || (((this->flags() & regbase::main_option_type) == regbase::perl_syntax_group) && (this->flags() & regbase::no_bk_refs)))
|
||||
@@ -1944,7 +1961,7 @@ bool basic_regex_parser<charT, traits>::parse_backref()
|
||||
charT c = unescape_character();
|
||||
this->append_literal(c);
|
||||
}
|
||||
else if((i > 0) && (this->m_backrefs & (1u << (i-1))))
|
||||
else if((i > 0) && (this->m_backrefs.test(i)))
|
||||
{
|
||||
m_position = pc;
|
||||
re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_backref, sizeof(re_brace)));
|
||||
@@ -2132,7 +2149,7 @@ insert_recursion:
|
||||
// Oops not a relative recursion at all, but a (?-imsx) group:
|
||||
goto option_group_jump;
|
||||
}
|
||||
v = m_mark_count + 1 - v;
|
||||
v = static_cast<boost::intmax_t>(m_mark_count) + 1 - v;
|
||||
if(v <= 0)
|
||||
{
|
||||
// Rewind to start of (? sequence:
|
||||
@@ -2596,7 +2613,7 @@ option_group_jump:
|
||||
this->fail(regex_constants::error_paren, ::boost::BOOST_REGEX_DETAIL_NS::distance(m_base, m_end));
|
||||
return false;
|
||||
}
|
||||
BOOST_ASSERT(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark);
|
||||
BOOST_REGEX_ASSERT(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark);
|
||||
++m_position;
|
||||
//
|
||||
// restore the flags:
|
||||
@@ -2710,7 +2727,7 @@ option_group_jump:
|
||||
{
|
||||
#ifndef BOOST_NO_STD_DISTANCE
|
||||
if(this->flags() & regbase::save_subexpression_location)
|
||||
this->m_pdata->m_subs.at(markid - 1).second = std::distance(m_base, m_position) - 1;
|
||||
this->m_pdata->m_subs.at((std::size_t)markid - 1).second = std::distance(m_base, m_position) - 1;
|
||||
#else
|
||||
if(this->flags() & regbase::save_subexpression_location)
|
||||
this->m_pdata->m_subs.at(markid - 1).second = (m_position - m_base) - 1;
|
||||
@@ -2718,8 +2735,7 @@ option_group_jump:
|
||||
//
|
||||
// allow backrefs to this mark:
|
||||
//
|
||||
if(markid < (int)(sizeof(unsigned) * CHAR_BIT))
|
||||
this->m_backrefs |= 1u << (markid - 1);
|
||||
this->m_backrefs.set(markid);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -2747,6 +2763,12 @@ bool basic_regex_parser<charT, traits>::match_verb(const char* verb)
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(push)
|
||||
#if BOOST_MSVC >= 1800
|
||||
#pragma warning(disable:26812)
|
||||
#endif
|
||||
#endif
|
||||
template <class charT, class traits>
|
||||
bool basic_regex_parser<charT, traits>::parse_perl_verb()
|
||||
{
|
||||
@@ -2915,6 +2937,9 @@ bool basic_regex_parser<charT, traits>::parse_perl_verb()
|
||||
fail(regex_constants::error_perl_extension, m_position - m_base);
|
||||
return false;
|
||||
}
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
template <class charT, class traits>
|
||||
bool basic_regex_parser<charT, traits>::add_emacs_code(bool negate)
|
||||
@@ -3091,7 +3116,7 @@ bool basic_regex_parser<charT, traits>::unwind_alts(std::ptrdiff_t last_paren_st
|
||||
// alternative then that's an error:
|
||||
//
|
||||
if((this->m_alt_insert_point == static_cast<std::ptrdiff_t>(this->m_pdata->m_data.size()))
|
||||
&& m_alt_jumps.size() && (m_alt_jumps.back() > last_paren_start)
|
||||
&& (!m_alt_jumps.empty()) && (m_alt_jumps.back() > last_paren_start)
|
||||
&&
|
||||
!(
|
||||
((this->flags() & regbase::main_option_type) == regbase::perl_syntax_group)
|
||||
@@ -3106,7 +3131,7 @@ bool basic_regex_parser<charT, traits>::unwind_alts(std::ptrdiff_t last_paren_st
|
||||
//
|
||||
// Fix up our alternatives:
|
||||
//
|
||||
while(m_alt_jumps.size() && (m_alt_jumps.back() > last_paren_start))
|
||||
while((!m_alt_jumps.empty()) && (m_alt_jumps.back() > last_paren_start))
|
||||
{
|
||||
//
|
||||
// fix up the jump to point to the end of the states
|
||||
@@ -3116,7 +3141,13 @@ bool basic_regex_parser<charT, traits>::unwind_alts(std::ptrdiff_t last_paren_st
|
||||
m_alt_jumps.pop_back();
|
||||
this->m_pdata->m_data.align();
|
||||
re_jump* jmp = static_cast<re_jump*>(this->getaddress(jump_offset));
|
||||
BOOST_ASSERT(jmp->type == syntax_element_jump);
|
||||
if (jmp->type != syntax_element_jump)
|
||||
{
|
||||
// Something really bad happened, this used to be an assert,
|
||||
// but we'll make it an error just in case we should ever get here.
|
||||
fail(regex_constants::error_unknown, this->m_position - this->m_base, "Internal logic failed while compiling the expression, probably you added a repeat to something non-repeatable!");
|
||||
return false;
|
||||
}
|
||||
jmp->alt.i = this->m_pdata->m_data.size() - jump_offset;
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace std{
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
#pragma warning(disable: 4103 4244)
|
||||
#endif
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_PREFIX
|
||||
@@ -47,11 +47,35 @@ namespace std{
|
||||
|
||||
namespace boost{
|
||||
|
||||
namespace BOOST_REGEX_DETAIL_NS {
|
||||
|
||||
enum
|
||||
{
|
||||
char_class_space = 1 << 0,
|
||||
char_class_print = 1 << 1,
|
||||
char_class_cntrl = 1 << 2,
|
||||
char_class_upper = 1 << 3,
|
||||
char_class_lower = 1 << 4,
|
||||
char_class_alpha = 1 << 5,
|
||||
char_class_digit = 1 << 6,
|
||||
char_class_punct = 1 << 7,
|
||||
char_class_xdigit = 1 << 8,
|
||||
char_class_alnum = char_class_alpha | char_class_digit,
|
||||
char_class_graph = char_class_alnum | char_class_punct,
|
||||
char_class_blank = 1 << 9,
|
||||
char_class_word = 1 << 10,
|
||||
char_class_unicode = 1 << 11,
|
||||
char_class_horizontal = 1 << 12,
|
||||
char_class_vertical = 1 << 13
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
template <class charT>
|
||||
struct c_regex_traits;
|
||||
|
||||
template<>
|
||||
struct BOOST_REGEX_DECL c_regex_traits<char>
|
||||
struct c_regex_traits<char>
|
||||
{
|
||||
c_regex_traits(){}
|
||||
typedef char char_type;
|
||||
@@ -96,7 +120,7 @@ private:
|
||||
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
template<>
|
||||
struct BOOST_REGEX_DECL c_regex_traits<wchar_t>
|
||||
struct c_regex_traits<wchar_t>
|
||||
{
|
||||
c_regex_traits(){}
|
||||
typedef wchar_t char_type;
|
||||
@@ -139,59 +163,335 @@ private:
|
||||
c_regex_traits& operator=(const c_regex_traits&);
|
||||
};
|
||||
|
||||
#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
|
||||
//
|
||||
// Provide an unsigned short version as well, so the user can link to this
|
||||
// no matter whether they build with /Zc:wchar_t or not (MSVC specific).
|
||||
//
|
||||
template<>
|
||||
struct BOOST_REGEX_DECL c_regex_traits<unsigned short>
|
||||
#endif // BOOST_NO_WREGEX
|
||||
|
||||
inline c_regex_traits<char>::string_type BOOST_REGEX_CALL c_regex_traits<char>::transform(const char* p1, const char* p2)
|
||||
{
|
||||
c_regex_traits(){}
|
||||
typedef unsigned short char_type;
|
||||
typedef std::size_t size_type;
|
||||
typedef std::basic_string<unsigned short> string_type;
|
||||
struct locale_type{};
|
||||
typedef boost::uint32_t char_class_type;
|
||||
|
||||
static size_type length(const char_type* p)
|
||||
{
|
||||
return (std::wcslen)((const wchar_t*)p);
|
||||
std::string result(10, ' ');
|
||||
std::size_t s = result.size();
|
||||
std::size_t r;
|
||||
std::string src(p1, p2);
|
||||
while (s < (r = std::strxfrm(&*result.begin(), src.c_str(), s)))
|
||||
{
|
||||
#if defined(_CPPLIB_VER)
|
||||
//
|
||||
// A bug in VC11 and 12 causes the program to hang if we pass a null-string
|
||||
// to std::strxfrm, but only for certain locales :-(
|
||||
// Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware).
|
||||
//
|
||||
if (r == INT_MAX)
|
||||
{
|
||||
result.erase();
|
||||
result.insert(result.begin(), static_cast<char>(0));
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
result.append(r - s + 3, ' ');
|
||||
s = result.size();
|
||||
}
|
||||
result.erase(r);
|
||||
return result;
|
||||
}
|
||||
|
||||
unsigned short translate(unsigned short c) const
|
||||
{
|
||||
return c;
|
||||
inline c_regex_traits<char>::string_type BOOST_REGEX_CALL c_regex_traits<char>::transform_primary(const char* p1, const char* p2)
|
||||
{
|
||||
static char s_delim;
|
||||
static const int s_collate_type = ::boost::BOOST_REGEX_DETAIL_NS::find_sort_syntax(static_cast<c_regex_traits<char>*>(0), &s_delim);
|
||||
std::string result;
|
||||
//
|
||||
// What we do here depends upon the format of the sort key returned by
|
||||
// sort key returned by this->transform:
|
||||
//
|
||||
switch (s_collate_type)
|
||||
{
|
||||
case ::boost::BOOST_REGEX_DETAIL_NS::sort_C:
|
||||
case ::boost::BOOST_REGEX_DETAIL_NS::sort_unknown:
|
||||
// the best we can do is translate to lower case, then get a regular sort key:
|
||||
{
|
||||
result.assign(p1, p2);
|
||||
for (std::string::size_type i = 0; i < result.size(); ++i)
|
||||
result[i] = static_cast<char>((std::tolower)(static_cast<unsigned char>(result[i])));
|
||||
result = transform(&*result.begin(), &*result.begin() + result.size());
|
||||
break;
|
||||
}
|
||||
unsigned short translate_nocase(unsigned short c) const
|
||||
{
|
||||
return (std::towlower)((wchar_t)c);
|
||||
case ::boost::BOOST_REGEX_DETAIL_NS::sort_fixed:
|
||||
{
|
||||
// get a regular sort key, and then truncate it:
|
||||
result = transform(p1, p2);
|
||||
result.erase(s_delim);
|
||||
break;
|
||||
}
|
||||
case ::boost::BOOST_REGEX_DETAIL_NS::sort_delim:
|
||||
// get a regular sort key, and then truncate everything after the delim:
|
||||
result = transform(p1, p2);
|
||||
if ((!result.empty()) && (result[0] == s_delim))
|
||||
break;
|
||||
std::size_t i;
|
||||
for (i = 0; i < result.size(); ++i)
|
||||
{
|
||||
if (result[i] == s_delim)
|
||||
break;
|
||||
}
|
||||
result.erase(i);
|
||||
break;
|
||||
}
|
||||
if (result.empty())
|
||||
result = std::string(1, char(0));
|
||||
return result;
|
||||
}
|
||||
|
||||
static string_type BOOST_REGEX_CALL transform(const unsigned short* p1, const unsigned short* p2);
|
||||
static string_type BOOST_REGEX_CALL transform_primary(const unsigned short* p1, const unsigned short* p2);
|
||||
inline c_regex_traits<char>::char_class_type BOOST_REGEX_CALL c_regex_traits<char>::lookup_classname(const char* p1, const char* p2)
|
||||
{
|
||||
using namespace BOOST_REGEX_DETAIL_NS;
|
||||
static const char_class_type masks[] =
|
||||
{
|
||||
0,
|
||||
char_class_alnum,
|
||||
char_class_alpha,
|
||||
char_class_blank,
|
||||
char_class_cntrl,
|
||||
char_class_digit,
|
||||
char_class_digit,
|
||||
char_class_graph,
|
||||
char_class_horizontal,
|
||||
char_class_lower,
|
||||
char_class_lower,
|
||||
char_class_print,
|
||||
char_class_punct,
|
||||
char_class_space,
|
||||
char_class_space,
|
||||
char_class_upper,
|
||||
char_class_unicode,
|
||||
char_class_upper,
|
||||
char_class_vertical,
|
||||
char_class_alnum | char_class_word,
|
||||
char_class_alnum | char_class_word,
|
||||
char_class_xdigit,
|
||||
};
|
||||
|
||||
static char_class_type BOOST_REGEX_CALL lookup_classname(const unsigned short* p1, const unsigned short* p2);
|
||||
static string_type BOOST_REGEX_CALL lookup_collatename(const unsigned short* p1, const unsigned short* p2);
|
||||
int idx = ::boost::BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
|
||||
if (idx < 0)
|
||||
{
|
||||
std::string s(p1, p2);
|
||||
for (std::string::size_type i = 0; i < s.size(); ++i)
|
||||
s[i] = static_cast<char>((std::tolower)(static_cast<unsigned char>(s[i])));
|
||||
idx = ::boost::BOOST_REGEX_DETAIL_NS::get_default_class_id(&*s.begin(), &*s.begin() + s.size());
|
||||
}
|
||||
BOOST_REGEX_ASSERT(std::size_t(idx) + 1u < sizeof(masks) / sizeof(masks[0]));
|
||||
return masks[idx + 1];
|
||||
}
|
||||
|
||||
static bool BOOST_REGEX_CALL isctype(unsigned short, char_class_type);
|
||||
static int BOOST_REGEX_CALL value(unsigned short, int);
|
||||
inline bool BOOST_REGEX_CALL c_regex_traits<char>::isctype(char c, char_class_type mask)
|
||||
{
|
||||
using namespace BOOST_REGEX_DETAIL_NS;
|
||||
return
|
||||
((mask & char_class_space) && (std::isspace)(static_cast<unsigned char>(c)))
|
||||
|| ((mask & char_class_print) && (std::isprint)(static_cast<unsigned char>(c)))
|
||||
|| ((mask & char_class_cntrl) && (std::iscntrl)(static_cast<unsigned char>(c)))
|
||||
|| ((mask & char_class_upper) && (std::isupper)(static_cast<unsigned char>(c)))
|
||||
|| ((mask & char_class_lower) && (std::islower)(static_cast<unsigned char>(c)))
|
||||
|| ((mask & char_class_alpha) && (std::isalpha)(static_cast<unsigned char>(c)))
|
||||
|| ((mask & char_class_digit) && (std::isdigit)(static_cast<unsigned char>(c)))
|
||||
|| ((mask & char_class_punct) && (std::ispunct)(static_cast<unsigned char>(c)))
|
||||
|| ((mask & char_class_xdigit) && (std::isxdigit)(static_cast<unsigned char>(c)))
|
||||
|| ((mask & char_class_blank) && (std::isspace)(static_cast<unsigned char>(c)) && !::boost::BOOST_REGEX_DETAIL_NS::is_separator(c))
|
||||
|| ((mask & char_class_word) && (c == '_'))
|
||||
|| ((mask & char_class_vertical) && (::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) || (c == '\v')))
|
||||
|| ((mask & char_class_horizontal) && (std::isspace)(static_cast<unsigned char>(c)) && !::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) && (c != '\v'));
|
||||
}
|
||||
|
||||
locale_type imbue(locale_type l)
|
||||
{ return l; }
|
||||
locale_type getloc()const
|
||||
{ return locale_type(); }
|
||||
inline c_regex_traits<char>::string_type BOOST_REGEX_CALL c_regex_traits<char>::lookup_collatename(const char* p1, const char* p2)
|
||||
{
|
||||
std::string s(p1, p2);
|
||||
s = ::boost::BOOST_REGEX_DETAIL_NS::lookup_default_collate_name(s);
|
||||
if (s.empty() && (p2 - p1 == 1))
|
||||
s.append(1, *p1);
|
||||
return s;
|
||||
}
|
||||
|
||||
private:
|
||||
// this type is not copyable:
|
||||
c_regex_traits(const c_regex_traits&);
|
||||
c_regex_traits& operator=(const c_regex_traits&);
|
||||
};
|
||||
inline int BOOST_REGEX_CALL c_regex_traits<char>::value(char c, int radix)
|
||||
{
|
||||
char b[2] = { c, '\0', };
|
||||
char* ep;
|
||||
int result = std::strtol(b, &ep, radix);
|
||||
if (ep == b)
|
||||
return -1;
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
|
||||
inline c_regex_traits<wchar_t>::string_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::transform(const wchar_t* p1, const wchar_t* p2)
|
||||
{
|
||||
std::size_t r;
|
||||
std::size_t s = 10;
|
||||
std::wstring src(p1, p2);
|
||||
std::wstring result(s, L' ');
|
||||
while (s < (r = std::wcsxfrm(&*result.begin(), src.c_str(), s)))
|
||||
{
|
||||
#if defined(_CPPLIB_VER)
|
||||
//
|
||||
// A bug in VC11 and 12 causes the program to hang if we pass a null-string
|
||||
// to std::strxfrm, but only for certain locales :-(
|
||||
// Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware).
|
||||
//
|
||||
if (r == INT_MAX)
|
||||
{
|
||||
result.erase();
|
||||
result.insert(result.begin(), static_cast<wchar_t>(0));
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
result.append(r - s + 3, L' ');
|
||||
s = result.size();
|
||||
}
|
||||
result.erase(r);
|
||||
return result;
|
||||
}
|
||||
|
||||
inline c_regex_traits<wchar_t>::string_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::transform_primary(const wchar_t* p1, const wchar_t* p2)
|
||||
{
|
||||
static wchar_t s_delim;
|
||||
static const int s_collate_type = ::boost::BOOST_REGEX_DETAIL_NS::find_sort_syntax(static_cast<const c_regex_traits<wchar_t>*>(0), &s_delim);
|
||||
std::wstring result;
|
||||
//
|
||||
// What we do here depends upon the format of the sort key returned by
|
||||
// sort key returned by this->transform:
|
||||
//
|
||||
switch (s_collate_type)
|
||||
{
|
||||
case ::boost::BOOST_REGEX_DETAIL_NS::sort_C:
|
||||
case ::boost::BOOST_REGEX_DETAIL_NS::sort_unknown:
|
||||
// the best we can do is translate to lower case, then get a regular sort key:
|
||||
{
|
||||
result.assign(p1, p2);
|
||||
for (std::wstring::size_type i = 0; i < result.size(); ++i)
|
||||
result[i] = (std::towlower)(result[i]);
|
||||
result = c_regex_traits<wchar_t>::transform(&*result.begin(), &*result.begin() + result.size());
|
||||
break;
|
||||
}
|
||||
case ::boost::BOOST_REGEX_DETAIL_NS::sort_fixed:
|
||||
{
|
||||
// get a regular sort key, and then truncate it:
|
||||
result = c_regex_traits<wchar_t>::transform(&*result.begin(), &*result.begin() + result.size());
|
||||
result.erase(s_delim);
|
||||
break;
|
||||
}
|
||||
case ::boost::BOOST_REGEX_DETAIL_NS::sort_delim:
|
||||
// get a regular sort key, and then truncate everything after the delim:
|
||||
result = c_regex_traits<wchar_t>::transform(&*result.begin(), &*result.begin() + result.size());
|
||||
if ((!result.empty()) && (result[0] == s_delim))
|
||||
break;
|
||||
std::size_t i;
|
||||
for (i = 0; i < result.size(); ++i)
|
||||
{
|
||||
if (result[i] == s_delim)
|
||||
break;
|
||||
}
|
||||
result.erase(i);
|
||||
break;
|
||||
}
|
||||
if (result.empty())
|
||||
result = std::wstring(1, char(0));
|
||||
return result;
|
||||
}
|
||||
|
||||
inline c_regex_traits<wchar_t>::char_class_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::lookup_classname(const wchar_t* p1, const wchar_t* p2)
|
||||
{
|
||||
using namespace BOOST_REGEX_DETAIL_NS;
|
||||
static const char_class_type masks[] =
|
||||
{
|
||||
0,
|
||||
char_class_alnum,
|
||||
char_class_alpha,
|
||||
char_class_blank,
|
||||
char_class_cntrl,
|
||||
char_class_digit,
|
||||
char_class_digit,
|
||||
char_class_graph,
|
||||
char_class_horizontal,
|
||||
char_class_lower,
|
||||
char_class_lower,
|
||||
char_class_print,
|
||||
char_class_punct,
|
||||
char_class_space,
|
||||
char_class_space,
|
||||
char_class_upper,
|
||||
char_class_unicode,
|
||||
char_class_upper,
|
||||
char_class_vertical,
|
||||
char_class_alnum | char_class_word,
|
||||
char_class_alnum | char_class_word,
|
||||
char_class_xdigit,
|
||||
};
|
||||
|
||||
int idx = ::boost::BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
|
||||
if (idx < 0)
|
||||
{
|
||||
std::wstring s(p1, p2);
|
||||
for (std::wstring::size_type i = 0; i < s.size(); ++i)
|
||||
s[i] = (std::towlower)(s[i]);
|
||||
idx = ::boost::BOOST_REGEX_DETAIL_NS::get_default_class_id(&*s.begin(), &*s.begin() + s.size());
|
||||
}
|
||||
BOOST_REGEX_ASSERT(idx + 1 < static_cast<int>(sizeof(masks) / sizeof(masks[0])));
|
||||
return masks[idx + 1];
|
||||
}
|
||||
|
||||
inline bool BOOST_REGEX_CALL c_regex_traits<wchar_t>::isctype(wchar_t c, char_class_type mask)
|
||||
{
|
||||
using namespace BOOST_REGEX_DETAIL_NS;
|
||||
return
|
||||
((mask & char_class_space) && (std::iswspace)(c))
|
||||
|| ((mask & char_class_print) && (std::iswprint)(c))
|
||||
|| ((mask & char_class_cntrl) && (std::iswcntrl)(c))
|
||||
|| ((mask & char_class_upper) && (std::iswupper)(c))
|
||||
|| ((mask & char_class_lower) && (std::iswlower)(c))
|
||||
|| ((mask & char_class_alpha) && (std::iswalpha)(c))
|
||||
|| ((mask & char_class_digit) && (std::iswdigit)(c))
|
||||
|| ((mask & char_class_punct) && (std::iswpunct)(c))
|
||||
|| ((mask & char_class_xdigit) && (std::iswxdigit)(c))
|
||||
|| ((mask & char_class_blank) && (std::iswspace)(c) && !::boost::BOOST_REGEX_DETAIL_NS::is_separator(c))
|
||||
|| ((mask & char_class_word) && (c == '_'))
|
||||
|| ((mask & char_class_unicode) && (c & ~static_cast<wchar_t>(0xff)))
|
||||
|| ((mask & char_class_vertical) && (::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) || (c == L'\v')))
|
||||
|| ((mask & char_class_horizontal) && (std::iswspace)(c) && !::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) && (c != L'\v'));
|
||||
}
|
||||
|
||||
inline c_regex_traits<wchar_t>::string_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::lookup_collatename(const wchar_t* p1, const wchar_t* p2)
|
||||
{
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4244)
|
||||
#endif
|
||||
std::string name(p1, p2);
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
name = ::boost::BOOST_REGEX_DETAIL_NS::lookup_default_collate_name(name);
|
||||
if (!name.empty())
|
||||
return string_type(name.begin(), name.end());
|
||||
if (p2 - p1 == 1)
|
||||
return string_type(1, *p1);
|
||||
return string_type();
|
||||
}
|
||||
|
||||
inline int BOOST_REGEX_CALL c_regex_traits<wchar_t>::value(wchar_t c, int radix)
|
||||
{
|
||||
#ifdef BOOST_BORLANDC
|
||||
// workaround for broken wcstol:
|
||||
if ((std::iswxdigit)(c) == 0)
|
||||
return -1;
|
||||
#endif
|
||||
wchar_t b[2] = { c, '\0', };
|
||||
wchar_t* ep;
|
||||
int result = std::wcstol(b, &ep, radix);
|
||||
if (ep == b)
|
||||
return -1;
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif // BOOST_NO_WREGEX
|
||||
|
||||
}
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
|
||||
@@ -38,12 +38,12 @@
|
||||
#include <boost/regex/v4/primary_transform.hpp>
|
||||
#endif
|
||||
#ifndef BOOST_REGEX_OBJECT_CACHE_HPP
|
||||
#include <boost/regex/pending/object_cache.hpp>
|
||||
#include <boost/regex/v4/object_cache.hpp>
|
||||
#endif
|
||||
|
||||
#include <istream>
|
||||
#include <ios>
|
||||
#include <climits>
|
||||
#include <ios>
|
||||
#include <istream>
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
@@ -89,9 +89,9 @@ public:
|
||||
parser_buf() : base_type() { setbuf(0, 0); }
|
||||
const charT* getnext() { return this->gptr(); }
|
||||
protected:
|
||||
std::basic_streambuf<charT, traits>* setbuf(char_type* s, streamsize n);
|
||||
typename parser_buf<charT, traits>::pos_type seekpos(pos_type sp, ::std::ios_base::openmode which);
|
||||
typename parser_buf<charT, traits>::pos_type seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which);
|
||||
std::basic_streambuf<charT, traits>* setbuf(char_type* s, streamsize n) BOOST_OVERRIDE;
|
||||
typename parser_buf<charT, traits>::pos_type seekpos(pos_type sp, ::std::ios_base::openmode which) BOOST_OVERRIDE;
|
||||
typename parser_buf<charT, traits>::pos_type seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which) BOOST_OVERRIDE;
|
||||
private:
|
||||
parser_buf& operator=(const parser_buf&);
|
||||
parser_buf(const parser_buf&);
|
||||
@@ -174,7 +174,7 @@ template <class charT>
|
||||
struct cpp_regex_traits_base
|
||||
{
|
||||
cpp_regex_traits_base(const std::locale& l)
|
||||
{ imbue(l); }
|
||||
{ (void)imbue(l); }
|
||||
std::locale imbue(const std::locale& l);
|
||||
|
||||
std::locale m_locale;
|
||||
@@ -225,7 +225,7 @@ std::locale cpp_regex_traits_base<charT>::imbue(const std::locale& l)
|
||||
|
||||
//
|
||||
// class cpp_regex_traits_char_layer:
|
||||
// implements methods that require specialisation for narrow characters:
|
||||
// implements methods that require specialization for narrow characters:
|
||||
//
|
||||
template <class charT>
|
||||
class cpp_regex_traits_char_layer : public cpp_regex_traits_base<charT>
|
||||
@@ -281,7 +281,7 @@ void cpp_regex_traits_char_layer<charT>::init()
|
||||
typename std::messages<charT>::catalog cat = reinterpret_cast<std::messages<char>::catalog>(-1);
|
||||
#endif
|
||||
std::string cat_name(cpp_regex_traits<charT>::get_catalog_name());
|
||||
if(cat_name.size() && (this->m_pmessages != 0))
|
||||
if((!cat_name.empty()) && (this->m_pmessages != 0))
|
||||
{
|
||||
cat = this->m_pmessages->open(
|
||||
cat_name,
|
||||
@@ -352,10 +352,10 @@ typename cpp_regex_traits_char_layer<charT>::string_type
|
||||
}
|
||||
|
||||
//
|
||||
// specialised version for narrow characters:
|
||||
// specialized version for narrow characters:
|
||||
//
|
||||
template <>
|
||||
class BOOST_REGEX_DECL cpp_regex_traits_char_layer<char> : public cpp_regex_traits_base<char>
|
||||
class cpp_regex_traits_char_layer<char> : public cpp_regex_traits_base<char>
|
||||
{
|
||||
typedef std::string string_type;
|
||||
public:
|
||||
@@ -508,7 +508,7 @@ typename cpp_regex_traits_implementation<charT>::string_type
|
||||
// we work around this elsewhere, but just assert here that
|
||||
// we adhere to gcc's (buggy) preconditions...
|
||||
//
|
||||
BOOST_ASSERT(*p2 == 0);
|
||||
BOOST_REGEX_ASSERT(*p2 == 0);
|
||||
string_type result;
|
||||
#if defined(_CPPLIB_VER)
|
||||
//
|
||||
@@ -566,7 +566,7 @@ typename cpp_regex_traits_implementation<charT>::string_type
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
}catch(...){}
|
||||
#endif
|
||||
while(result.size() && (charT(0) == *result.rbegin()))
|
||||
while((!result.empty()) && (charT(0) == *result.rbegin()))
|
||||
result.erase(result.size() - 1);
|
||||
if(result.empty())
|
||||
{
|
||||
@@ -588,7 +588,7 @@ typename cpp_regex_traits_implementation<charT>::string_type
|
||||
// we work around this elsewhere, but just assert here that
|
||||
// we adhere to gcc's (buggy) preconditions...
|
||||
//
|
||||
BOOST_ASSERT(*p2 == 0);
|
||||
BOOST_REGEX_ASSERT(*p2 == 0);
|
||||
//
|
||||
// swallowing all exceptions here is a bad idea
|
||||
// however at least one std lib will always throw
|
||||
@@ -616,12 +616,12 @@ typename cpp_regex_traits_implementation<charT>::string_type
|
||||
// std::collate<wchar_t>::transform returns a different string!
|
||||
// So as a workaround, we'll truncate the string at the first NULL
|
||||
// which _seems_ to work....
|
||||
#if BOOST_WORKAROUND(__BORLANDC__, < 0x580)
|
||||
#if BOOST_WORKAROUND(BOOST_BORLANDC, < 0x580)
|
||||
result.erase(result.find(charT(0)));
|
||||
#else
|
||||
//
|
||||
// some implementations (Dinkumware) append unnecessary trailing \0's:
|
||||
while(result.size() && (charT(0) == *result.rbegin()))
|
||||
while((!result.empty()) && (charT(0) == *result.rbegin()))
|
||||
result.erase(result.size() - 1);
|
||||
#endif
|
||||
//
|
||||
@@ -646,7 +646,7 @@ typename cpp_regex_traits_implementation<charT>::string_type
|
||||
result2.append(1, static_cast<charT>(1 + static_cast<uchar_type>(result[i]))).append(1, charT('b') - 1);
|
||||
}
|
||||
}
|
||||
BOOST_ASSERT(std::find(result2.begin(), result2.end(), charT(0)) == result2.end());
|
||||
BOOST_REGEX_ASSERT(std::find(result2.begin(), result2.end(), charT(0)) == result2.end());
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
}
|
||||
catch(...)
|
||||
@@ -662,14 +662,14 @@ typename cpp_regex_traits_implementation<charT>::string_type
|
||||
cpp_regex_traits_implementation<charT>::lookup_collatename(const charT* p1, const charT* p2) const
|
||||
{
|
||||
typedef typename std::map<string_type, string_type>::const_iterator iter_type;
|
||||
if(m_custom_collate_names.size())
|
||||
if(!m_custom_collate_names.empty())
|
||||
{
|
||||
iter_type pos = m_custom_collate_names.find(string_type(p1, p2));
|
||||
if(pos != m_custom_collate_names.end())
|
||||
return pos->second;
|
||||
}
|
||||
#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
|
||||
&& !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)
|
||||
&& !BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x0551)
|
||||
std::string name(p1, p2);
|
||||
#else
|
||||
std::string name;
|
||||
@@ -679,11 +679,11 @@ typename cpp_regex_traits_implementation<charT>::string_type
|
||||
#endif
|
||||
name = lookup_default_collate_name(name);
|
||||
#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
|
||||
&& !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)
|
||||
if(name.size())
|
||||
&& !BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x0551)
|
||||
if(!name.empty())
|
||||
return string_type(name.begin(), name.end());
|
||||
#else
|
||||
if(name.size())
|
||||
if(!name.empty())
|
||||
{
|
||||
string_type result;
|
||||
typedef std::string::const_iterator iter;
|
||||
@@ -709,7 +709,7 @@ void cpp_regex_traits_implementation<charT>::init()
|
||||
typename std::messages<charT>::catalog cat = reinterpret_cast<std::messages<char>::catalog>(-1);
|
||||
#endif
|
||||
std::string cat_name(cpp_regex_traits<charT>::get_catalog_name());
|
||||
if(cat_name.size() && (this->m_pmessages != 0))
|
||||
if((!cat_name.empty()) && (this->m_pmessages != 0))
|
||||
{
|
||||
cat = this->m_pmessages->open(
|
||||
cat_name,
|
||||
@@ -796,7 +796,7 @@ void cpp_regex_traits_implementation<charT>::init()
|
||||
for(unsigned int j = 0; j <= 13; ++j)
|
||||
{
|
||||
string_type s(this->m_pmessages->get(cat, 0, j+300, null_string));
|
||||
if(s.size())
|
||||
if(!s.empty())
|
||||
this->m_custom_class_names[s] = masks[j];
|
||||
}
|
||||
}
|
||||
@@ -864,7 +864,7 @@ typename cpp_regex_traits_implementation<charT>::char_class_type
|
||||
::boost::BOOST_REGEX_DETAIL_NS::char_class_xdigit,
|
||||
};
|
||||
#endif
|
||||
if(m_custom_class_names.size())
|
||||
if(!m_custom_class_names.empty())
|
||||
{
|
||||
typedef typename std::map<std::basic_string<charT>, char_class_type>::const_iterator map_iter;
|
||||
map_iter pos = m_custom_class_names.find(string_type(p1, p2));
|
||||
@@ -872,7 +872,7 @@ typename cpp_regex_traits_implementation<charT>::char_class_type
|
||||
return pos->second;
|
||||
}
|
||||
std::size_t state_id = 1 + BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
|
||||
BOOST_ASSERT(state_id < sizeof(masks) / sizeof(masks[0]));
|
||||
BOOST_REGEX_ASSERT(state_id < sizeof(masks) / sizeof(masks[0]));
|
||||
return masks[state_id];
|
||||
}
|
||||
|
||||
@@ -1129,6 +1129,91 @@ static_mutex& cpp_regex_traits<charT>::get_mutex_inst()
|
||||
}
|
||||
#endif
|
||||
|
||||
namespace BOOST_REGEX_DETAIL_NS {
|
||||
|
||||
inline void cpp_regex_traits_char_layer<char>::init()
|
||||
{
|
||||
// we need to start by initialising our syntax map so we know which
|
||||
// character is used for which purpose:
|
||||
std::memset(m_char_map, 0, sizeof(m_char_map));
|
||||
#ifndef BOOST_NO_STD_MESSAGES
|
||||
#ifndef __IBMCPP__
|
||||
std::messages<char>::catalog cat = static_cast<std::messages<char>::catalog>(-1);
|
||||
#else
|
||||
std::messages<char>::catalog cat = reinterpret_cast<std::messages<char>::catalog>(-1);
|
||||
#endif
|
||||
std::string cat_name(cpp_regex_traits<char>::get_catalog_name());
|
||||
if ((!cat_name.empty()) && (m_pmessages != 0))
|
||||
{
|
||||
cat = this->m_pmessages->open(
|
||||
cat_name,
|
||||
this->m_locale);
|
||||
if ((int)cat < 0)
|
||||
{
|
||||
std::string m("Unable to open message catalog: ");
|
||||
std::runtime_error err(m + cat_name);
|
||||
boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
|
||||
}
|
||||
}
|
||||
//
|
||||
// if we have a valid catalog then load our messages:
|
||||
//
|
||||
if ((int)cat >= 0)
|
||||
{
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
|
||||
{
|
||||
string_type mss = this->m_pmessages->get(cat, 0, i, get_default_syntax(i));
|
||||
for (string_type::size_type j = 0; j < mss.size(); ++j)
|
||||
{
|
||||
m_char_map[static_cast<unsigned char>(mss[j])] = i;
|
||||
}
|
||||
}
|
||||
this->m_pmessages->close(cat);
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
this->m_pmessages->close(cat);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#endif
|
||||
for (regex_constants::syntax_type j = 1; j < regex_constants::syntax_max; ++j)
|
||||
{
|
||||
const char* ptr = get_default_syntax(j);
|
||||
while (ptr && *ptr)
|
||||
{
|
||||
m_char_map[static_cast<unsigned char>(*ptr)] = j;
|
||||
++ptr;
|
||||
}
|
||||
}
|
||||
#ifndef BOOST_NO_STD_MESSAGES
|
||||
}
|
||||
#endif
|
||||
//
|
||||
// finish off by calculating our escape types:
|
||||
//
|
||||
unsigned char i = 'A';
|
||||
do
|
||||
{
|
||||
if (m_char_map[i] == 0)
|
||||
{
|
||||
if (this->m_pctype->is(std::ctype_base::lower, i))
|
||||
m_char_map[i] = regex_constants::escape_type_class;
|
||||
else if (this->m_pctype->is(std::ctype_base::upper, i))
|
||||
m_char_map[i] = regex_constants::escape_type_not_class;
|
||||
}
|
||||
} while (0xFF != i++);
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
|
||||
} // boost
|
||||
|
||||
@@ -1150,5 +1235,3 @@ static_mutex& cpp_regex_traits<charT>::get_mutex_inst()
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -200,123 +200,6 @@ BOOST_REGEX_DECL void BOOST_REGEX_CCALL regfreeW(regex_tW*);
|
||||
} /* namespace */
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus)
|
||||
/*
|
||||
* C++ high level wrapper goes here:
|
||||
*/
|
||||
#include <string>
|
||||
#include <vector>
|
||||
namespace boost{
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
#endif
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_PREFIX
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
class RegEx;
|
||||
|
||||
namespace BOOST_REGEX_DETAIL_NS{
|
||||
|
||||
class RegExData;
|
||||
struct pred1;
|
||||
struct pred2;
|
||||
struct pred3;
|
||||
struct pred4;
|
||||
|
||||
} /* namespace BOOST_REGEX_DETAIL_NS */
|
||||
|
||||
#if (defined(BOOST_MSVC) || defined(__BORLANDC__)) && !defined(BOOST_DISABLE_WIN32)
|
||||
typedef bool (__cdecl *GrepCallback)(const RegEx& expression);
|
||||
typedef bool (__cdecl *GrepFileCallback)(const char* file, const RegEx& expression);
|
||||
typedef bool (__cdecl *FindFilesCallback)(const char* file);
|
||||
#else
|
||||
typedef bool (*GrepCallback)(const RegEx& expression);
|
||||
typedef bool (*GrepFileCallback)(const char* file, const RegEx& expression);
|
||||
typedef bool (*FindFilesCallback)(const char* file);
|
||||
#endif
|
||||
|
||||
class BOOST_REGEX_DECL RegEx
|
||||
{
|
||||
private:
|
||||
BOOST_REGEX_DETAIL_NS::RegExData* pdata;
|
||||
public:
|
||||
RegEx();
|
||||
RegEx(const RegEx& o);
|
||||
~RegEx();
|
||||
explicit RegEx(const char* c, bool icase = false);
|
||||
explicit RegEx(const std::string& s, bool icase = false);
|
||||
RegEx& operator=(const RegEx& o);
|
||||
RegEx& operator=(const char* p);
|
||||
RegEx& operator=(const std::string& s){ return this->operator=(s.c_str()); }
|
||||
unsigned int SetExpression(const char* p, bool icase = false);
|
||||
unsigned int SetExpression(const std::string& s, bool icase = false){ return SetExpression(s.c_str(), icase); }
|
||||
std::string Expression()const;
|
||||
unsigned int error_code()const;
|
||||
/*
|
||||
* now matching operators:
|
||||
*/
|
||||
bool Match(const char* p, match_flag_type flags = match_default);
|
||||
bool Match(const std::string& s, match_flag_type flags = match_default) { return Match(s.c_str(), flags); }
|
||||
bool Search(const char* p, match_flag_type flags = match_default);
|
||||
bool Search(const std::string& s, match_flag_type flags = match_default) { return Search(s.c_str(), flags); }
|
||||
unsigned int Grep(GrepCallback cb, const char* p, match_flag_type flags = match_default);
|
||||
unsigned int Grep(GrepCallback cb, const std::string& s, match_flag_type flags = match_default) { return Grep(cb, s.c_str(), flags); }
|
||||
unsigned int Grep(std::vector<std::string>& v, const char* p, match_flag_type flags = match_default);
|
||||
unsigned int Grep(std::vector<std::string>& v, const std::string& s, match_flag_type flags = match_default) { return Grep(v, s.c_str(), flags); }
|
||||
unsigned int Grep(std::vector<std::size_t>& v, const char* p, match_flag_type flags = match_default);
|
||||
unsigned int Grep(std::vector<std::size_t>& v, const std::string& s, match_flag_type flags = match_default) { return Grep(v, s.c_str(), flags); }
|
||||
#ifndef BOOST_REGEX_NO_FILEITER
|
||||
unsigned int GrepFiles(GrepFileCallback cb, const char* files, bool recurse = false, match_flag_type flags = match_default);
|
||||
unsigned int GrepFiles(GrepFileCallback cb, const std::string& files, bool recurse = false, match_flag_type flags = match_default) { return GrepFiles(cb, files.c_str(), recurse, flags); }
|
||||
unsigned int FindFiles(FindFilesCallback cb, const char* files, bool recurse = false, match_flag_type flags = match_default);
|
||||
unsigned int FindFiles(FindFilesCallback cb, const std::string& files, bool recurse = false, match_flag_type flags = match_default) { return FindFiles(cb, files.c_str(), recurse, flags); }
|
||||
#endif
|
||||
|
||||
std::string Merge(const std::string& in, const std::string& fmt,
|
||||
bool copy = true, match_flag_type flags = match_default);
|
||||
std::string Merge(const char* in, const char* fmt,
|
||||
bool copy = true, match_flag_type flags = match_default);
|
||||
|
||||
std::size_t Split(std::vector<std::string>& v, std::string& s, match_flag_type flags = match_default, unsigned max_count = ~0);
|
||||
/*
|
||||
* now operators for returning what matched in more detail:
|
||||
*/
|
||||
std::size_t Position(int i = 0)const;
|
||||
std::size_t Length(int i = 0)const;
|
||||
bool Matched(int i = 0)const;
|
||||
std::size_t Marks()const;
|
||||
std::string What(int i = 0)const;
|
||||
std::string operator[](int i)const { return What(i); }
|
||||
|
||||
static const std::size_t npos;
|
||||
|
||||
friend struct BOOST_REGEX_DETAIL_NS::pred1;
|
||||
friend struct BOOST_REGEX_DETAIL_NS::pred2;
|
||||
friend struct BOOST_REGEX_DETAIL_NS::pred3;
|
||||
friend struct BOOST_REGEX_DETAIL_NS::pred4;
|
||||
};
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
#endif
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_SUFFIX
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
} /* namespace boost */
|
||||
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* include guard */
|
||||
|
||||
|
||||
|
||||
@@ -1,452 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1998-2002
|
||||
* John Maddock
|
||||
*
|
||||
* Use, modification and distribution are subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying file
|
||||
* LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* LOCATION: see http://www.boost.org for most recent version.
|
||||
* FILE fileiter.hpp
|
||||
* VERSION see <boost/version.hpp>
|
||||
* DESCRIPTION: Declares various platform independent file and
|
||||
* directory iterators, plus binary file input in
|
||||
* the form of class map_file.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_RE_FILEITER_HPP_INCLUDED
|
||||
#define BOOST_RE_FILEITER_HPP_INCLUDED
|
||||
|
||||
#ifndef BOOST_REGEX_CONFIG_HPP
|
||||
#include <boost/regex/config.hpp>
|
||||
#endif
|
||||
#include <boost/assert.hpp>
|
||||
|
||||
#ifndef BOOST_REGEX_NO_FILEITER
|
||||
|
||||
#if (defined(__CYGWIN__) || defined(__CYGWIN32__)) && !defined(BOOST_REGEX_NO_W32)
|
||||
#error "Sorry, can't mix <windows.h> with STL code and gcc compiler: if you ran configure, try again with configure --disable-ms-windows"
|
||||
#define BOOST_REGEX_FI_WIN32_MAP
|
||||
#define BOOST_REGEX_FI_POSIX_DIR
|
||||
#elif (defined(__WIN32__) || defined(_WIN32) || defined(WIN32)) && !defined(BOOST_REGEX_NO_W32)
|
||||
#define BOOST_REGEX_FI_WIN32_MAP
|
||||
#define BOOST_REGEX_FI_WIN32_DIR
|
||||
#else
|
||||
#define BOOST_REGEX_FI_POSIX_MAP
|
||||
#define BOOST_REGEX_FI_POSIX_DIR
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_REGEX_FI_WIN32_MAP)||defined(BOOST_REGEX_FI_WIN32_DIR)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_REGEX_FI_WIN32_DIR)
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
namespace boost{
|
||||
namespace BOOST_REGEX_DETAIL_NS{
|
||||
|
||||
#ifndef BOOST_NO_ANSI_APIS
|
||||
typedef WIN32_FIND_DATAA _fi_find_data;
|
||||
#else
|
||||
typedef WIN32_FIND_DATAW _fi_find_data;
|
||||
#endif
|
||||
typedef HANDLE _fi_find_handle;
|
||||
|
||||
} // namespace BOOST_REGEX_DETAIL_NS
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#define _fi_invalid_handle INVALID_HANDLE_VALUE
|
||||
#define _fi_dir FILE_ATTRIBUTE_DIRECTORY
|
||||
|
||||
#elif defined(BOOST_REGEX_FI_POSIX_DIR)
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdio>
|
||||
#include <cctype>
|
||||
#include <iterator>
|
||||
#include <list>
|
||||
#include <cassert>
|
||||
#include <dirent.h>
|
||||
|
||||
#if defined(__SUNPRO_CC)
|
||||
using std::list;
|
||||
#endif
|
||||
|
||||
#ifndef MAX_PATH
|
||||
#define MAX_PATH 256
|
||||
#endif
|
||||
|
||||
namespace boost{
|
||||
namespace BOOST_REGEX_DETAIL_NS{
|
||||
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_PREFIX
|
||||
#endif
|
||||
|
||||
struct _fi_find_data
|
||||
{
|
||||
unsigned dwFileAttributes;
|
||||
char cFileName[MAX_PATH];
|
||||
};
|
||||
|
||||
struct _fi_priv_data;
|
||||
|
||||
typedef _fi_priv_data* _fi_find_handle;
|
||||
#define _fi_invalid_handle 0
|
||||
#define _fi_dir 1
|
||||
|
||||
_fi_find_handle _fi_FindFirstFile(const char* lpFileName, _fi_find_data* lpFindFileData);
|
||||
bool _fi_FindNextFile(_fi_find_handle hFindFile, _fi_find_data* lpFindFileData);
|
||||
bool _fi_FindClose(_fi_find_handle hFindFile);
|
||||
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_SUFFIX
|
||||
#endif
|
||||
|
||||
} // namespace BOOST_REGEX_DETAIL_NS
|
||||
} // namespace boost
|
||||
|
||||
#ifdef FindFirstFile
|
||||
#undef FindFirstFile
|
||||
#endif
|
||||
#ifdef FindNextFile
|
||||
#undef FindNextFile
|
||||
#endif
|
||||
#ifdef FindClose
|
||||
#undef FindClose
|
||||
#endif
|
||||
|
||||
#define FindFirstFileA _fi_FindFirstFile
|
||||
#define FindNextFileA _fi_FindNextFile
|
||||
#define FindClose _fi_FindClose
|
||||
|
||||
#endif
|
||||
|
||||
namespace boost{
|
||||
namespace BOOST_REGEX_DETAIL_NS{
|
||||
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_PREFIX
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_REGEX_FI_WIN32_MAP // win32 mapfile
|
||||
|
||||
class BOOST_REGEX_DECL mapfile
|
||||
{
|
||||
HANDLE hfile;
|
||||
HANDLE hmap;
|
||||
const char* _first;
|
||||
const char* _last;
|
||||
public:
|
||||
|
||||
typedef const char* iterator;
|
||||
|
||||
mapfile(){ hfile = hmap = 0; _first = _last = 0; }
|
||||
mapfile(const char* file){ hfile = hmap = 0; _first = _last = 0; open(file); }
|
||||
~mapfile(){ close(); }
|
||||
void open(const char* file);
|
||||
void close();
|
||||
const char* begin(){ return _first; }
|
||||
const char* end(){ return _last; }
|
||||
size_t size(){ return _last - _first; }
|
||||
bool valid(){ return (hfile != 0) && (hfile != INVALID_HANDLE_VALUE); }
|
||||
};
|
||||
|
||||
|
||||
#else
|
||||
|
||||
class BOOST_REGEX_DECL mapfile_iterator;
|
||||
|
||||
class BOOST_REGEX_DECL mapfile
|
||||
{
|
||||
typedef char* pointer;
|
||||
std::FILE* hfile;
|
||||
long int _size;
|
||||
pointer* _first;
|
||||
pointer* _last;
|
||||
mutable std::list<pointer*> condemed;
|
||||
enum sizes
|
||||
{
|
||||
buf_size = 4096
|
||||
};
|
||||
void lock(pointer* node)const;
|
||||
void unlock(pointer* node)const;
|
||||
public:
|
||||
|
||||
typedef mapfile_iterator iterator;
|
||||
|
||||
mapfile(){ hfile = 0; _size = 0; _first = _last = 0; }
|
||||
mapfile(const char* file){ hfile = 0; _size = 0; _first = _last = 0; open(file); }
|
||||
~mapfile(){ close(); }
|
||||
void open(const char* file);
|
||||
void close();
|
||||
iterator begin()const;
|
||||
iterator end()const;
|
||||
unsigned long size()const{ return _size; }
|
||||
bool valid()const{ return hfile != 0; }
|
||||
friend class mapfile_iterator;
|
||||
};
|
||||
|
||||
class BOOST_REGEX_DECL mapfile_iterator
|
||||
{
|
||||
typedef mapfile::pointer internal_pointer;
|
||||
internal_pointer* node;
|
||||
const mapfile* file;
|
||||
unsigned long offset;
|
||||
long position()const
|
||||
{
|
||||
return file ? ((node - file->_first) * mapfile::buf_size + offset) : 0;
|
||||
}
|
||||
void position(long pos)
|
||||
{
|
||||
if(file)
|
||||
{
|
||||
node = file->_first + (pos / mapfile::buf_size);
|
||||
offset = pos % mapfile::buf_size;
|
||||
}
|
||||
}
|
||||
public:
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef char value_type;
|
||||
typedef const char* pointer;
|
||||
typedef const char& reference;
|
||||
typedef std::random_access_iterator_tag iterator_category;
|
||||
|
||||
mapfile_iterator() { node = 0; file = 0; offset = 0; }
|
||||
mapfile_iterator(const mapfile* f, long arg_position)
|
||||
{
|
||||
BOOST_ASSERT(f);
|
||||
file = f;
|
||||
node = f->_first + arg_position / mapfile::buf_size;
|
||||
offset = arg_position % mapfile::buf_size;
|
||||
file->lock(node);
|
||||
}
|
||||
mapfile_iterator(const mapfile_iterator& i)
|
||||
{
|
||||
file = i.file;
|
||||
node = i.node;
|
||||
offset = i.offset;
|
||||
if(file)
|
||||
file->lock(node);
|
||||
}
|
||||
~mapfile_iterator()
|
||||
{
|
||||
if(file && node)
|
||||
file->unlock(node);
|
||||
}
|
||||
mapfile_iterator& operator = (const mapfile_iterator& i);
|
||||
char operator* ()const
|
||||
{
|
||||
BOOST_ASSERT(node >= file->_first);
|
||||
BOOST_ASSERT(node < file->_last);
|
||||
return file ? *(*node + sizeof(int) + offset) : char(0);
|
||||
}
|
||||
char operator[] (long off)const
|
||||
{
|
||||
mapfile_iterator tmp(*this);
|
||||
tmp += off;
|
||||
return *tmp;
|
||||
}
|
||||
mapfile_iterator& operator++ ();
|
||||
mapfile_iterator operator++ (int);
|
||||
mapfile_iterator& operator-- ();
|
||||
mapfile_iterator operator-- (int);
|
||||
|
||||
mapfile_iterator& operator += (long off)
|
||||
{
|
||||
position(position() + off);
|
||||
return *this;
|
||||
}
|
||||
mapfile_iterator& operator -= (long off)
|
||||
{
|
||||
position(position() - off);
|
||||
return *this;
|
||||
}
|
||||
|
||||
friend inline bool operator==(const mapfile_iterator& i, const mapfile_iterator& j)
|
||||
{
|
||||
return (i.file == j.file) && (i.node == j.node) && (i.offset == j.offset);
|
||||
}
|
||||
|
||||
friend inline bool operator!=(const mapfile_iterator& i, const mapfile_iterator& j)
|
||||
{
|
||||
return !(i == j);
|
||||
}
|
||||
|
||||
friend inline bool operator<(const mapfile_iterator& i, const mapfile_iterator& j)
|
||||
{
|
||||
return i.position() < j.position();
|
||||
}
|
||||
friend inline bool operator>(const mapfile_iterator& i, const mapfile_iterator& j)
|
||||
{
|
||||
return i.position() > j.position();
|
||||
}
|
||||
friend inline bool operator<=(const mapfile_iterator& i, const mapfile_iterator& j)
|
||||
{
|
||||
return i.position() <= j.position();
|
||||
}
|
||||
friend inline bool operator>=(const mapfile_iterator& i, const mapfile_iterator& j)
|
||||
{
|
||||
return i.position() >= j.position();
|
||||
}
|
||||
|
||||
friend mapfile_iterator operator + (const mapfile_iterator& i, long off);
|
||||
friend mapfile_iterator operator + (long off, const mapfile_iterator& i)
|
||||
{
|
||||
mapfile_iterator tmp(i);
|
||||
return tmp += off;
|
||||
}
|
||||
friend mapfile_iterator operator - (const mapfile_iterator& i, long off);
|
||||
friend inline long operator - (const mapfile_iterator& i, const mapfile_iterator& j)
|
||||
{
|
||||
return i.position() - j.position();
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
// _fi_sep determines the directory separator, either '\\' or '/'
|
||||
BOOST_REGEX_DECL extern const char* _fi_sep;
|
||||
|
||||
struct file_iterator_ref
|
||||
{
|
||||
_fi_find_handle hf;
|
||||
_fi_find_data _data;
|
||||
long count;
|
||||
};
|
||||
|
||||
|
||||
class BOOST_REGEX_DECL file_iterator
|
||||
{
|
||||
char* _root;
|
||||
char* _path;
|
||||
char* ptr;
|
||||
file_iterator_ref* ref;
|
||||
|
||||
public:
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef const char* value_type;
|
||||
typedef const char** pointer;
|
||||
typedef const char*& reference;
|
||||
typedef std::input_iterator_tag iterator_category;
|
||||
|
||||
file_iterator();
|
||||
file_iterator(const char* wild);
|
||||
~file_iterator();
|
||||
file_iterator(const file_iterator&);
|
||||
file_iterator& operator=(const file_iterator&);
|
||||
const char* root()const { return _root; }
|
||||
const char* path()const { return _path; }
|
||||
const char* name()const { return ptr; }
|
||||
_fi_find_data* data() { return &(ref->_data); }
|
||||
void next();
|
||||
file_iterator& operator++() { next(); return *this; }
|
||||
file_iterator operator++(int);
|
||||
const char* operator*() { return path(); }
|
||||
|
||||
friend inline bool operator == (const file_iterator& f1, const file_iterator& f2)
|
||||
{
|
||||
return ((f1.ref->hf == _fi_invalid_handle) && (f2.ref->hf == _fi_invalid_handle));
|
||||
}
|
||||
|
||||
friend inline bool operator != (const file_iterator& f1, const file_iterator& f2)
|
||||
{
|
||||
return !(f1 == f2);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// dwa 9/13/00 - suppress unused parameter warning
|
||||
inline bool operator < (const file_iterator&, const file_iterator&)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
class BOOST_REGEX_DECL directory_iterator
|
||||
{
|
||||
char* _root;
|
||||
char* _path;
|
||||
char* ptr;
|
||||
file_iterator_ref* ref;
|
||||
|
||||
public:
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef const char* value_type;
|
||||
typedef const char** pointer;
|
||||
typedef const char*& reference;
|
||||
typedef std::input_iterator_tag iterator_category;
|
||||
|
||||
directory_iterator();
|
||||
directory_iterator(const char* wild);
|
||||
~directory_iterator();
|
||||
directory_iterator(const directory_iterator& other);
|
||||
directory_iterator& operator=(const directory_iterator& other);
|
||||
|
||||
const char* root()const { return _root; }
|
||||
const char* path()const { return _path; }
|
||||
const char* name()const { return ptr; }
|
||||
_fi_find_data* data() { return &(ref->_data); }
|
||||
void next();
|
||||
directory_iterator& operator++() { next(); return *this; }
|
||||
directory_iterator operator++(int);
|
||||
const char* operator*() { return path(); }
|
||||
|
||||
static const char* separator() { return _fi_sep; }
|
||||
|
||||
friend inline bool operator == (const directory_iterator& f1, const directory_iterator& f2)
|
||||
{
|
||||
return ((f1.ref->hf == _fi_invalid_handle) && (f2.ref->hf == _fi_invalid_handle));
|
||||
}
|
||||
|
||||
|
||||
friend inline bool operator != (const directory_iterator& f1, const directory_iterator& f2)
|
||||
{
|
||||
return !(f1 == f2);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
inline bool operator < (const directory_iterator&, const directory_iterator&)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_SUFFIX
|
||||
#endif
|
||||
|
||||
|
||||
} // namespace BOOST_REGEX_DETAIL_NS
|
||||
using boost::BOOST_REGEX_DETAIL_NS::directory_iterator;
|
||||
using boost::BOOST_REGEX_DETAIL_NS::file_iterator;
|
||||
using boost::BOOST_REGEX_DETAIL_NS::mapfile;
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_REGEX_NO_FILEITER
|
||||
#endif // BOOST_RE_FILEITER_HPP
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1516
linx64/include/boost/regex/v4/icu.hpp
Normal file
1516
linx64/include/boost/regex/v4/icu.hpp
Normal file
File diff suppressed because it is too large
Load Diff
54
linx64/include/boost/regex/v4/indexed_bit_flag.hpp
Normal file
54
linx64/include/boost/regex/v4/indexed_bit_flag.hpp
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2020
|
||||
* John Maddock
|
||||
*
|
||||
* Use, modification and distribution are subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying file
|
||||
* LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* LOCATION: see http://www.boost.org for most recent version.
|
||||
* FILE basic_regex_parser.cpp
|
||||
* VERSION see <boost/version.hpp>
|
||||
* DESCRIPTION: Declares template class basic_regex_parser.
|
||||
*/
|
||||
|
||||
#include <boost/regex/config.hpp>
|
||||
#include <set>
|
||||
|
||||
#ifndef BOOST_REGEX_V4_INDEXED_BIT_FLAG_HPP
|
||||
#define BOOST_REGEX_V4_INDEXED_BIT_FLAG_HPP
|
||||
|
||||
namespace boost{
|
||||
namespace BOOST_REGEX_DETAIL_NS{
|
||||
|
||||
class indexed_bit_flag
|
||||
{
|
||||
boost::uint64_t low_mask;
|
||||
std::set<std::size_t> mask_set;
|
||||
public:
|
||||
indexed_bit_flag() : low_mask(0) {}
|
||||
void set(std::size_t i)
|
||||
{
|
||||
if (i < std::numeric_limits<boost::uint64_t>::digits - 1)
|
||||
low_mask |= static_cast<boost::uint64_t>(1u) << i;
|
||||
else
|
||||
mask_set.insert(i);
|
||||
}
|
||||
bool test(std::size_t i)
|
||||
{
|
||||
if (i < std::numeric_limits<boost::uint64_t>::digits - 1)
|
||||
return low_mask & static_cast<boost::uint64_t>(1u) << i ? true : false;
|
||||
else
|
||||
return mask_set.find(i) != mask_set.end();
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace BOOST_REGEX_DETAIL_NS
|
||||
} // namespace boost
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,236 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1998-2002
|
||||
* John Maddock
|
||||
*
|
||||
* Use, modification and distribution are subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying file
|
||||
* LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* LOCATION: see http://www.boost.org for most recent version.
|
||||
* FILE instances.cpp
|
||||
* VERSION see <boost/version.hpp>
|
||||
* DESCRIPTION: Defines those template instances that are placed in the
|
||||
* library rather than in the users object files.
|
||||
*/
|
||||
|
||||
//
|
||||
// note no include guard, we may include this multiple times:
|
||||
//
|
||||
#ifndef BOOST_REGEX_NO_EXTERNAL_TEMPLATES
|
||||
|
||||
namespace boost{
|
||||
|
||||
//
|
||||
// this header can be included multiple times, each time with
|
||||
// a different character type, BOOST_REGEX_CHAR_T must be defined
|
||||
// first:
|
||||
//
|
||||
#ifndef BOOST_REGEX_CHAR_T
|
||||
# error "BOOST_REGEX_CHAR_T not defined"
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_REGEX_TRAITS_T
|
||||
# define BOOST_REGEX_TRAITS_T , boost::regex_traits<BOOST_REGEX_CHAR_T >
|
||||
#endif
|
||||
|
||||
//
|
||||
// what follows is compiler specific:
|
||||
//
|
||||
|
||||
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x600)
|
||||
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_PREFIX
|
||||
#endif
|
||||
|
||||
# ifndef BOOST_REGEX_INSTANTIATE
|
||||
# pragma option push -Jgx
|
||||
# endif
|
||||
|
||||
template class BOOST_REGEX_DECL basic_regex< BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >;
|
||||
template class BOOST_REGEX_DECL match_results< const BOOST_REGEX_CHAR_T* >;
|
||||
#ifndef BOOST_NO_STD_ALLOCATOR
|
||||
template class BOOST_REGEX_DECL ::boost::BOOST_REGEX_DETAIL_NS::perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >;
|
||||
#endif
|
||||
|
||||
# ifndef BOOST_REGEX_INSTANTIATE
|
||||
# pragma option pop
|
||||
# endif
|
||||
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_SUFFIX
|
||||
#endif
|
||||
|
||||
#elif defined(BOOST_MSVC) || defined(__ICL)
|
||||
|
||||
# ifndef BOOST_REGEX_INSTANTIATE
|
||||
# ifdef __GNUC__
|
||||
# define template __extension__ extern template
|
||||
# else
|
||||
# if BOOST_MSVC > 1310
|
||||
# define BOOST_REGEX_TEMPLATE_DECL
|
||||
# endif
|
||||
# define template extern template
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#ifndef BOOST_REGEX_TEMPLATE_DECL
|
||||
# define BOOST_REGEX_TEMPLATE_DECL BOOST_REGEX_DECL
|
||||
#endif
|
||||
|
||||
# ifdef BOOST_MSVC
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable : 4251)
|
||||
#if BOOST_MSVC < 1700
|
||||
# pragma warning(disable : 4231)
|
||||
#endif
|
||||
# if BOOST_MSVC < 1600
|
||||
# pragma warning(disable : 4660)
|
||||
# endif
|
||||
# endif
|
||||
|
||||
template class BOOST_REGEX_TEMPLATE_DECL basic_regex< BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >;
|
||||
|
||||
template class BOOST_REGEX_TEMPLATE_DECL match_results< const BOOST_REGEX_CHAR_T* >;
|
||||
#ifndef BOOST_NO_STD_ALLOCATOR
|
||||
template class BOOST_REGEX_TEMPLATE_DECL ::boost::BOOST_REGEX_DETAIL_NS::perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >;
|
||||
#endif
|
||||
#if !(defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB <= 1))\
|
||||
&& !(defined(BOOST_INTEL_CXX_VERSION) && (BOOST_INTEL_CXX_VERSION <= 800))\
|
||||
&& !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION))\
|
||||
&& !defined(BOOST_REGEX_ICU_INSTANCES)
|
||||
template class BOOST_REGEX_TEMPLATE_DECL match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >;
|
||||
#ifndef BOOST_NO_STD_ALLOCATOR
|
||||
template class BOOST_REGEX_TEMPLATE_DECL ::boost::BOOST_REGEX_DETAIL_NS::perl_matcher< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
# ifdef BOOST_MSVC
|
||||
# pragma warning(pop)
|
||||
# endif
|
||||
|
||||
# ifdef template
|
||||
# undef template
|
||||
# endif
|
||||
|
||||
#undef BOOST_REGEX_TEMPLATE_DECL
|
||||
|
||||
#elif (defined(__GNUC__) && (__GNUC__ >= 3)) || !defined(BOOST_NO_CXX11_EXTERN_TEMPLATE)
|
||||
|
||||
#if defined(__clang__)
|
||||
# pragma clang diagnostic push
|
||||
# if defined(__APPLE_CC__)
|
||||
# if (__clang_major__ > 6)
|
||||
# pragma clang diagnostic ignored "-Wkeyword-macro"
|
||||
# endif
|
||||
# else
|
||||
# if (__clang_major__ > 3) || ((__clang_major__ == 3) && (__clang_minor__ > 5))
|
||||
# pragma clang diagnostic ignored "-Wkeyword-macro"
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
# ifndef BOOST_REGEX_INSTANTIATE
|
||||
# ifdef __GNUC__
|
||||
# define template __extension__ extern template
|
||||
# else
|
||||
# define template extern template
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#if !defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_REGEX_ICU_INSTANCES)
|
||||
namespace BOOST_REGEX_DETAIL_NS{
|
||||
template BOOST_REGEX_DECL
|
||||
std::locale cpp_regex_traits_base<BOOST_REGEX_CHAR_T>::imbue(const std::locale& l);
|
||||
|
||||
template BOOST_REGEX_DECL
|
||||
cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::string_type
|
||||
cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::transform_primary(const BOOST_REGEX_CHAR_T* p1, const BOOST_REGEX_CHAR_T* p2) const;
|
||||
template BOOST_REGEX_DECL
|
||||
cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::string_type
|
||||
cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::transform(const BOOST_REGEX_CHAR_T* p1, const BOOST_REGEX_CHAR_T* p2) const;
|
||||
template BOOST_REGEX_DECL
|
||||
cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::string_type
|
||||
cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::lookup_collatename(const BOOST_REGEX_CHAR_T* p1, const BOOST_REGEX_CHAR_T* p2) const;
|
||||
template BOOST_REGEX_DECL
|
||||
void cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::init();
|
||||
template BOOST_REGEX_DECL
|
||||
cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::char_class_type
|
||||
cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::lookup_classname_imp(const BOOST_REGEX_CHAR_T* p1, const BOOST_REGEX_CHAR_T* p2) const;
|
||||
#ifdef BOOST_REGEX_BUGGY_CTYPE_FACET
|
||||
template BOOST_REGEX_DECL
|
||||
bool cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::isctype(const BOOST_REGEX_CHAR_T c, char_class_type mask) const;
|
||||
#endif
|
||||
} // namespace
|
||||
template BOOST_REGEX_DECL
|
||||
boost::intmax_t cpp_regex_traits<BOOST_REGEX_CHAR_T>::toi(const BOOST_REGEX_CHAR_T*& first, const BOOST_REGEX_CHAR_T* last, int radix)const;
|
||||
template BOOST_REGEX_DECL
|
||||
std::string cpp_regex_traits<BOOST_REGEX_CHAR_T>::catalog_name(const std::string& name);
|
||||
template BOOST_REGEX_DECL
|
||||
std::string& cpp_regex_traits<BOOST_REGEX_CHAR_T>::get_catalog_name_inst();
|
||||
template BOOST_REGEX_DECL
|
||||
std::string cpp_regex_traits<BOOST_REGEX_CHAR_T>::get_catalog_name();
|
||||
#ifdef BOOST_HAS_THREADS
|
||||
template BOOST_REGEX_DECL
|
||||
static_mutex& cpp_regex_traits<BOOST_REGEX_CHAR_T>::get_mutex_inst();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
template BOOST_REGEX_DECL basic_regex<BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >&
|
||||
basic_regex<BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >::do_assign(
|
||||
const BOOST_REGEX_CHAR_T* p1,
|
||||
const BOOST_REGEX_CHAR_T* p2,
|
||||
flag_type f);
|
||||
template BOOST_REGEX_DECL basic_regex<BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >::locale_type BOOST_REGEX_CALL
|
||||
basic_regex<BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >::imbue(locale_type l);
|
||||
|
||||
template BOOST_REGEX_DECL void BOOST_REGEX_CALL
|
||||
match_results<const BOOST_REGEX_CHAR_T*>::maybe_assign(
|
||||
const match_results<const BOOST_REGEX_CHAR_T*>& m);
|
||||
|
||||
namespace BOOST_REGEX_DETAIL_NS{
|
||||
template BOOST_REGEX_DECL void perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >::construct_init(
|
||||
const basic_regex<BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >& e, match_flag_type f);
|
||||
template BOOST_REGEX_DECL bool perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >::match();
|
||||
template BOOST_REGEX_DECL bool perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >::find();
|
||||
} // namespace
|
||||
|
||||
#if (defined(__GLIBCPP__) || defined(__GLIBCXX__)) \
|
||||
&& !defined(BOOST_REGEX_ICU_INSTANCES)\
|
||||
&& !defined(__SGI_STL_PORT)\
|
||||
&& !defined(_STLPORT_VERSION)
|
||||
// std:basic_string<>::const_iterator instances as well:
|
||||
template BOOST_REGEX_DECL void BOOST_REGEX_CALL
|
||||
match_results<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator>::maybe_assign(
|
||||
const match_results<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator>& m);
|
||||
|
||||
namespace BOOST_REGEX_DETAIL_NS{
|
||||
template BOOST_REGEX_DECL void perl_matcher<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >::construct_init(
|
||||
const basic_regex<BOOST_REGEX_CHAR_T>& e, match_flag_type f);
|
||||
template BOOST_REGEX_DECL bool perl_matcher<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >::match();
|
||||
template BOOST_REGEX_DECL bool perl_matcher<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >::find();
|
||||
} // namespace
|
||||
#endif
|
||||
|
||||
# ifdef template
|
||||
# undef template
|
||||
# endif
|
||||
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
#endif
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_REGEX_NO_EXTERNAL_TEMPLATES
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -28,6 +28,13 @@ namespace boost{
|
||||
namespace regex_constants{
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#if BOOST_MSVC >= 1800
|
||||
#pragma warning(disable : 26812)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef enum _match_flags
|
||||
{
|
||||
match_default = 0,
|
||||
@@ -44,7 +51,7 @@ typedef enum _match_flags
|
||||
match_any = match_init << 1, /* don't care what we match */
|
||||
match_not_null = match_any << 1, /* string can't be null */
|
||||
match_continuous = match_not_null << 1, /* each grep match must continue from */
|
||||
/* uninterupted from the previous one */
|
||||
/* uninterrupted from the previous one */
|
||||
match_partial = match_continuous << 1, /* find partial matches */
|
||||
|
||||
match_stop = match_partial << 1, /* stop after first match (grep) V3 only */
|
||||
@@ -54,7 +61,7 @@ typedef enum _match_flags
|
||||
match_posix = match_perl << 1, /* Use POSIX matching rules */
|
||||
match_nosubs = match_posix << 1, /* don't trap marked subs */
|
||||
match_extra = match_nosubs << 1, /* include full capture information for repeated captures */
|
||||
match_single_line = match_extra << 1, /* treat text as single line and ignor any \n's when matching ^ and $. */
|
||||
match_single_line = match_extra << 1, /* treat text as single line and ignore any \n's when matching ^ and $. */
|
||||
match_unused1 = match_single_line << 1, /* unused */
|
||||
match_unused2 = match_unused1 << 1, /* unused */
|
||||
match_unused3 = match_unused2 << 1, /* unused */
|
||||
@@ -63,9 +70,9 @@ typedef enum _match_flags
|
||||
format_perl = 0, /* perl style replacement */
|
||||
format_default = 0, /* ditto. */
|
||||
format_sed = match_max << 1, /* sed style replacement. */
|
||||
format_all = format_sed << 1, /* enable all extentions to sytax. */
|
||||
format_all = format_sed << 1, /* enable all extensions to syntax. */
|
||||
format_no_copy = format_all << 1, /* don't copy non-matching segments. */
|
||||
format_first_only = format_no_copy << 1, /* Only replace first occurance. */
|
||||
format_first_only = format_no_copy << 1, /* Only replace first occurrence. */
|
||||
format_is_if = format_first_only << 1, /* internal use only. */
|
||||
format_literal = format_is_if << 1, /* treat string as a literal */
|
||||
|
||||
@@ -82,7 +89,7 @@ typedef enum _match_flags
|
||||
|
||||
} match_flags;
|
||||
|
||||
#if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER <= 1310))
|
||||
#if defined(BOOST_BORLANDC) || (defined(_MSC_VER) && (_MSC_VER <= 1310))
|
||||
typedef unsigned long match_flag_type;
|
||||
#else
|
||||
typedef match_flags match_flag_type;
|
||||
@@ -109,7 +116,7 @@ inline match_flags& operator^=(match_flags& m1, match_flags m2)
|
||||
#ifdef __cplusplus
|
||||
} /* namespace regex_constants */
|
||||
/*
|
||||
* import names into boost for backwards compatiblity:
|
||||
* import names into boost for backwards compatibility:
|
||||
*/
|
||||
using regex_constants::match_flag_type;
|
||||
using regex_constants::match_default;
|
||||
@@ -143,6 +150,11 @@ using regex_constants::format_no_copy;
|
||||
using regex_constants::format_first_only;
|
||||
/*using regex_constants::format_is_if;*/
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
|
||||
} /* namespace boost */
|
||||
#endif /* __cplusplus */
|
||||
#endif /* include guard */
|
||||
|
||||
@@ -95,7 +95,7 @@ public:
|
||||
// See https://svn.boost.org/trac/boost/ticket/3632.
|
||||
//
|
||||
match_results(const match_results& m)
|
||||
: m_subs(m.m_subs), m_named_subs(m.m_named_subs), m_last_closed_paren(m.m_last_closed_paren), m_is_singular(m.m_is_singular)
|
||||
: m_subs(m.m_subs), m_base(), m_null(), m_named_subs(m.m_named_subs), m_last_closed_paren(m.m_last_closed_paren), m_is_singular(m.m_is_singular)
|
||||
{
|
||||
if(!m_is_singular)
|
||||
{
|
||||
@@ -474,7 +474,7 @@ public:
|
||||
// private access functions:
|
||||
void BOOST_REGEX_CALL set_second(BidiIterator i)
|
||||
{
|
||||
BOOST_ASSERT(m_subs.size() > 2);
|
||||
BOOST_REGEX_ASSERT(m_subs.size() > 2);
|
||||
m_subs[2].second = i;
|
||||
m_subs[2].matched = true;
|
||||
m_subs[0].first = i;
|
||||
@@ -490,7 +490,7 @@ public:
|
||||
if(pos)
|
||||
m_last_closed_paren = static_cast<int>(pos);
|
||||
pos += 2;
|
||||
BOOST_ASSERT(m_subs.size() > pos);
|
||||
BOOST_REGEX_ASSERT(m_subs.size() > pos);
|
||||
m_subs[pos].second = i;
|
||||
m_subs[pos].matched = m;
|
||||
if((pos == 2) && !escape_k)
|
||||
@@ -531,7 +531,7 @@ public:
|
||||
}
|
||||
void BOOST_REGEX_CALL set_first(BidiIterator i)
|
||||
{
|
||||
BOOST_ASSERT(m_subs.size() > 2);
|
||||
BOOST_REGEX_ASSERT(m_subs.size() > 2);
|
||||
// set up prefix:
|
||||
m_subs[1].second = i;
|
||||
m_subs[1].matched = (m_subs[1].first != i);
|
||||
@@ -546,7 +546,7 @@ public:
|
||||
}
|
||||
void BOOST_REGEX_CALL set_first(BidiIterator i, size_type pos, bool escape_k = false)
|
||||
{
|
||||
BOOST_ASSERT(pos+2 < m_subs.size());
|
||||
BOOST_REGEX_ASSERT(pos+2 < m_subs.size());
|
||||
if(pos || escape_k)
|
||||
{
|
||||
m_subs[pos+2].first = i;
|
||||
@@ -650,15 +650,15 @@ void BOOST_REGEX_CALL match_results<BidiIterator, Allocator>::maybe_assign(const
|
||||
}
|
||||
base1 = ::boost::BOOST_REGEX_DETAIL_NS::distance(l_base, p1->first);
|
||||
base2 = ::boost::BOOST_REGEX_DETAIL_NS::distance(l_base, p2->first);
|
||||
BOOST_ASSERT(base1 >= 0);
|
||||
BOOST_ASSERT(base2 >= 0);
|
||||
BOOST_REGEX_ASSERT(base1 >= 0);
|
||||
BOOST_REGEX_ASSERT(base2 >= 0);
|
||||
if(base1 < base2) return;
|
||||
if(base2 < base1) break;
|
||||
|
||||
len1 = ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)p1->first, (BidiIterator)p1->second);
|
||||
len2 = ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)p2->first, (BidiIterator)p2->second);
|
||||
BOOST_ASSERT(len1 >= 0);
|
||||
BOOST_ASSERT(len2 >= 0);
|
||||
BOOST_REGEX_ASSERT(len1 >= 0);
|
||||
BOOST_REGEX_ASSERT(len2 >= 0);
|
||||
if((len1 != len2) || ((p1->matched == false) && (p2->matched == true)))
|
||||
break;
|
||||
if((p1->matched == true) && (p2->matched == false))
|
||||
|
||||
@@ -69,6 +69,12 @@ struct mem_block_cache
|
||||
}
|
||||
::operator delete(ptr);
|
||||
}
|
||||
|
||||
static mem_block_cache& instance()
|
||||
{
|
||||
static mem_block_cache block_cache = { { {nullptr} } };
|
||||
return block_cache;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -129,11 +135,43 @@ struct mem_block_cache
|
||||
++cached_blocks;
|
||||
}
|
||||
}
|
||||
static mem_block_cache& instance()
|
||||
{
|
||||
#ifdef BOOST_HAS_THREADS
|
||||
static mem_block_cache block_cache = { 0, 0, BOOST_STATIC_MUTEX_INIT, };
|
||||
#else
|
||||
static mem_block_cache block_cache = { 0, 0, };
|
||||
#endif
|
||||
return block_cache;
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
extern mem_block_cache block_cache;
|
||||
#if BOOST_REGEX_MAX_CACHE_BLOCKS == 0
|
||||
|
||||
inline void* BOOST_REGEX_CALL get_mem_block()
|
||||
{
|
||||
return ::operator new(BOOST_REGEX_BLOCKSIZE);
|
||||
}
|
||||
|
||||
inline void BOOST_REGEX_CALL put_mem_block(void* p)
|
||||
{
|
||||
::operator delete(p);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
inline void* BOOST_REGEX_CALL get_mem_block()
|
||||
{
|
||||
return mem_block_cache::instance().get();
|
||||
}
|
||||
|
||||
inline void BOOST_REGEX_CALL put_mem_block(void* p)
|
||||
{
|
||||
mem_block_cache::instance().put(p);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
} // namespace boost
|
||||
|
||||
|
||||
171
linx64/include/boost/regex/v4/object_cache.hpp
Normal file
171
linx64/include/boost/regex/v4/object_cache.hpp
Normal file
@@ -0,0 +1,171 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2004
|
||||
* John Maddock
|
||||
*
|
||||
* Use, modification and distribution are subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying file
|
||||
* LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* LOCATION: see http://www.boost.org for most recent version.
|
||||
* FILE object_cache.hpp
|
||||
* VERSION see <boost/version.hpp>
|
||||
* DESCRIPTION: Implements a generic object cache.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_REGEX_OBJECT_CACHE_HPP
|
||||
#define BOOST_REGEX_OBJECT_CACHE_HPP
|
||||
|
||||
#include <boost/regex/config.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#ifdef BOOST_HAS_THREADS
|
||||
#include <boost/regex/pending/static_mutex.hpp>
|
||||
#endif
|
||||
|
||||
namespace boost{
|
||||
|
||||
template <class Key, class Object>
|
||||
class object_cache
|
||||
{
|
||||
public:
|
||||
typedef std::pair< ::boost::shared_ptr<Object const>, Key const*> value_type;
|
||||
typedef std::list<value_type> list_type;
|
||||
typedef typename list_type::iterator list_iterator;
|
||||
typedef std::map<Key, list_iterator> map_type;
|
||||
typedef typename map_type::iterator map_iterator;
|
||||
typedef typename list_type::size_type size_type;
|
||||
static boost::shared_ptr<Object const> get(const Key& k, size_type l_max_cache_size);
|
||||
|
||||
private:
|
||||
static boost::shared_ptr<Object const> do_get(const Key& k, size_type l_max_cache_size);
|
||||
|
||||
struct data
|
||||
{
|
||||
list_type cont;
|
||||
map_type index;
|
||||
};
|
||||
|
||||
// Needed by compilers not implementing the resolution to DR45. For reference,
|
||||
// see http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45.
|
||||
friend struct data;
|
||||
};
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4702)
|
||||
#endif
|
||||
template <class Key, class Object>
|
||||
boost::shared_ptr<Object const> object_cache<Key, Object>::get(const Key& k, size_type l_max_cache_size)
|
||||
{
|
||||
#ifdef BOOST_HAS_THREADS
|
||||
static boost::static_mutex mut = BOOST_STATIC_MUTEX_INIT;
|
||||
boost::static_mutex::scoped_lock l(mut);
|
||||
if (l)
|
||||
{
|
||||
return do_get(k, l_max_cache_size);
|
||||
}
|
||||
//
|
||||
// what do we do if the lock fails?
|
||||
// for now just throw, but we should never really get here...
|
||||
//
|
||||
::boost::throw_exception(std::runtime_error("Error in thread safety code: could not acquire a lock"));
|
||||
#if defined(BOOST_NO_UNREACHABLE_RETURN_DETECTION) || defined(BOOST_NO_EXCEPTIONS)
|
||||
return boost::shared_ptr<Object>();
|
||||
#endif
|
||||
#else
|
||||
return do_get(k, l_max_cache_size);
|
||||
#endif
|
||||
}
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
template <class Key, class Object>
|
||||
boost::shared_ptr<Object const> object_cache<Key, Object>::do_get(const Key& k, size_type l_max_cache_size)
|
||||
{
|
||||
typedef typename object_cache<Key, Object>::data object_data;
|
||||
typedef typename map_type::size_type map_size_type;
|
||||
static object_data s_data;
|
||||
|
||||
//
|
||||
// see if the object is already in the cache:
|
||||
//
|
||||
map_iterator mpos = s_data.index.find(k);
|
||||
if(mpos != s_data.index.end())
|
||||
{
|
||||
//
|
||||
// Eureka!
|
||||
// We have a cached item, bump it up the list and return it:
|
||||
//
|
||||
if(--(s_data.cont.end()) != mpos->second)
|
||||
{
|
||||
// splice out the item we want to move:
|
||||
list_type temp;
|
||||
temp.splice(temp.end(), s_data.cont, mpos->second);
|
||||
// and now place it at the end of the list:
|
||||
s_data.cont.splice(s_data.cont.end(), temp, temp.begin());
|
||||
BOOST_REGEX_ASSERT(*(s_data.cont.back().second) == k);
|
||||
// update index with new position:
|
||||
mpos->second = --(s_data.cont.end());
|
||||
BOOST_REGEX_ASSERT(&(mpos->first) == mpos->second->second);
|
||||
BOOST_REGEX_ASSERT(&(mpos->first) == s_data.cont.back().second);
|
||||
}
|
||||
return s_data.cont.back().first;
|
||||
}
|
||||
//
|
||||
// if we get here then the item is not in the cache,
|
||||
// so create it:
|
||||
//
|
||||
boost::shared_ptr<Object const> result(new Object(k));
|
||||
//
|
||||
// Add it to the list, and index it:
|
||||
//
|
||||
s_data.cont.push_back(value_type(result, static_cast<Key const*>(0)));
|
||||
s_data.index.insert(std::make_pair(k, --(s_data.cont.end())));
|
||||
s_data.cont.back().second = &(s_data.index.find(k)->first);
|
||||
map_size_type s = s_data.index.size();
|
||||
BOOST_REGEX_ASSERT(s_data.index[k]->first.get() == result.get());
|
||||
BOOST_REGEX_ASSERT(&(s_data.index.find(k)->first) == s_data.cont.back().second);
|
||||
BOOST_REGEX_ASSERT(s_data.index.find(k)->first == k);
|
||||
if(s > l_max_cache_size)
|
||||
{
|
||||
//
|
||||
// We have too many items in the list, so we need to start
|
||||
// popping them off the back of the list, but only if they're
|
||||
// being held uniquely by us:
|
||||
//
|
||||
list_iterator pos = s_data.cont.begin();
|
||||
list_iterator last = s_data.cont.end();
|
||||
while((pos != last) && (s > l_max_cache_size))
|
||||
{
|
||||
if(pos->first.unique())
|
||||
{
|
||||
list_iterator condemmed(pos);
|
||||
++pos;
|
||||
// now remove the items from our containers,
|
||||
// then order has to be as follows:
|
||||
BOOST_REGEX_ASSERT(s_data.index.find(*(condemmed->second)) != s_data.index.end());
|
||||
s_data.index.erase(*(condemmed->second));
|
||||
s_data.cont.erase(condemmed);
|
||||
--s;
|
||||
}
|
||||
else
|
||||
++pos;
|
||||
}
|
||||
BOOST_REGEX_ASSERT(s_data.index[k]->first.get() == result.get());
|
||||
BOOST_REGEX_ASSERT(&(s_data.index.find(k)->first) == s_data.cont.back().second);
|
||||
BOOST_REGEX_ASSERT(s_data.index.find(k)->first == k);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
128
linx64/include/boost/regex/v4/pattern_except.hpp
Normal file
128
linx64/include/boost/regex/v4/pattern_except.hpp
Normal file
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1998-2002
|
||||
* John Maddock
|
||||
*
|
||||
* Use, modification and distribution are subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying file
|
||||
* LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* LOCATION: see http://www.boost.org for most recent version.
|
||||
* FILE pattern_except.hpp
|
||||
* VERSION see <boost/version.hpp>
|
||||
* DESCRIPTION: Declares pattern-matching exception classes.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_RE_V4_PAT_EXCEPT_HPP
|
||||
#define BOOST_RE_V4_PAT_EXCEPT_HPP
|
||||
|
||||
#ifndef BOOST_REGEX_CONFIG_HPP
|
||||
#include <boost/regex/config.hpp>
|
||||
#endif
|
||||
|
||||
#include <cstddef>
|
||||
#include <stdexcept>
|
||||
#include <boost/regex/v4/error_type.hpp>
|
||||
#include <boost/regex/v4/regex_traits_defaults.hpp>
|
||||
|
||||
namespace boost{
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
#endif
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_PREFIX
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4275)
|
||||
#if BOOST_MSVC >= 1800
|
||||
#pragma warning(disable : 26812)
|
||||
#endif
|
||||
#endif
|
||||
class regex_error : public std::runtime_error
|
||||
{
|
||||
public:
|
||||
explicit regex_error(const std::string& s, regex_constants::error_type err = regex_constants::error_unknown, std::ptrdiff_t pos = 0)
|
||||
: std::runtime_error(s)
|
||||
, m_error_code(err)
|
||||
, m_position(pos)
|
||||
{
|
||||
}
|
||||
explicit regex_error(regex_constants::error_type err)
|
||||
: std::runtime_error(::boost::BOOST_REGEX_DETAIL_NS::get_default_error_string(err))
|
||||
, m_error_code(err)
|
||||
, m_position(0)
|
||||
{
|
||||
}
|
||||
~regex_error() BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE {}
|
||||
regex_constants::error_type code()const
|
||||
{ return m_error_code; }
|
||||
std::ptrdiff_t position()const
|
||||
{ return m_position; }
|
||||
void raise()const
|
||||
{
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
#ifndef BOOST_REGEX_STANDALONE
|
||||
::boost::throw_exception(*this);
|
||||
#else
|
||||
throw* this;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
private:
|
||||
regex_constants::error_type m_error_code;
|
||||
std::ptrdiff_t m_position;
|
||||
};
|
||||
|
||||
typedef regex_error bad_pattern;
|
||||
typedef regex_error bad_expression;
|
||||
|
||||
namespace BOOST_REGEX_DETAIL_NS{
|
||||
|
||||
template <class E>
|
||||
inline void raise_runtime_error(const E& ex)
|
||||
{
|
||||
#ifndef BOOST_REGEX_STANDALONE
|
||||
::boost::throw_exception(ex);
|
||||
#else
|
||||
throw ex;
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class traits>
|
||||
void raise_error(const traits& t, regex_constants::error_type code)
|
||||
{
|
||||
(void)t; // warning suppression
|
||||
regex_error e(t.error_string(code), code, 0);
|
||||
::boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
#endif
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_SUFFIX
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif
|
||||
@@ -27,6 +27,13 @@
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(push)
|
||||
#pragma warning(disable : 4251)
|
||||
#if BOOST_MSVC < 1700
|
||||
# pragma warning(disable : 4231)
|
||||
#endif
|
||||
# if BOOST_MSVC < 1600
|
||||
# pragma warning(disable : 4660)
|
||||
# endif
|
||||
#if BOOST_MSVC < 1910
|
||||
#pragma warning(disable:4800)
|
||||
#endif
|
||||
@@ -38,7 +45,17 @@ namespace BOOST_REGEX_DETAIL_NS{
|
||||
//
|
||||
// error checking API:
|
||||
//
|
||||
BOOST_REGEX_DECL void BOOST_REGEX_CALL verify_options(boost::regex_constants::syntax_option_type ef, match_flag_type mf);
|
||||
inline void BOOST_REGEX_CALL verify_options(boost::regex_constants::syntax_option_type, match_flag_type mf)
|
||||
{
|
||||
//
|
||||
// can't mix match_extra with POSIX matching rules:
|
||||
//
|
||||
if ((mf & match_extra) && (mf & match_posix))
|
||||
{
|
||||
std::logic_error msg("Usage Error: Can't mix regular expression captures with POSIX matching rules");
|
||||
throw_exception(msg);
|
||||
}
|
||||
}
|
||||
//
|
||||
// function can_start:
|
||||
//
|
||||
@@ -81,7 +98,7 @@ inline bool can_start(unsigned int c, const unsigned char* map, unsigned char ma
|
||||
|
||||
//
|
||||
// Unfortunately Rogue Waves standard library appears to have a bug
|
||||
// in std::basic_string::compare that results in eroneous answers
|
||||
// in std::basic_string::compare that results in erroneous answers
|
||||
// in some cases (tested with Borland C++ 5.1, Rogue Wave lib version
|
||||
// 0x020101) the test case was:
|
||||
// {39135,0} < {0xff,0}
|
||||
@@ -341,6 +358,12 @@ enum saved_state_type
|
||||
saved_state_count = 14
|
||||
};
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(push)
|
||||
#if BOOST_MSVC >= 1800
|
||||
#pragma warning(disable:26495)
|
||||
#endif
|
||||
#endif
|
||||
template <class Results>
|
||||
struct recursion_info
|
||||
{
|
||||
@@ -352,16 +375,8 @@ struct recursion_info
|
||||
repeater_count<iterator>* repeater_stack;
|
||||
iterator location_of_start;
|
||||
};
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4251)
|
||||
#if BOOST_MSVC < 1700
|
||||
# pragma warning(disable : 4231)
|
||||
#endif
|
||||
# if BOOST_MSVC < 1600
|
||||
# pragma warning(disable : 4660)
|
||||
# endif
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
@@ -370,7 +385,7 @@ class perl_matcher
|
||||
public:
|
||||
typedef typename traits::char_type char_type;
|
||||
typedef perl_matcher<BidiIterator, Allocator, traits> self_type;
|
||||
typedef bool (self_type::*matcher_proc_type)(void);
|
||||
typedef bool (self_type::*matcher_proc_type)();
|
||||
typedef std::size_t traits_size_type;
|
||||
typedef typename is_byte<char_type>::width_type width_type;
|
||||
typedef typename regex_iterator_traits<BidiIterator>::difference_type difference_type;
|
||||
@@ -578,6 +593,12 @@ private:
|
||||
unsigned m_recursions;
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(push)
|
||||
#if BOOST_MSVC >= 1800
|
||||
#pragma warning(disable:26495)
|
||||
#endif
|
||||
#endif
|
||||
// these operations aren't allowed, so are declared private,
|
||||
// bodies are provided to keep explicit-instantiation requests happy:
|
||||
perl_matcher& operator=(const perl_matcher&)
|
||||
@@ -586,14 +607,17 @@ private:
|
||||
}
|
||||
perl_matcher(const perl_matcher& that)
|
||||
: m_result(that.m_result), re(that.re), traits_inst(that.traits_inst), rep_obj(0) {}
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
} // namespace BOOST_REGEX_DETAIL_NS
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
@@ -607,10 +631,6 @@ private:
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
//
|
||||
// include the implementation of perl_matcher:
|
||||
//
|
||||
@@ -623,4 +643,3 @@ private:
|
||||
#include <boost/regex/v4/perl_matcher_common.hpp>
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
#if BOOST_MSVC >= 1800
|
||||
#pragma warning(disable: 26812)
|
||||
#endif
|
||||
#endif
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_PREFIX
|
||||
@@ -31,7 +34,7 @@
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
# pragma option push -w-8008 -w-8066
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
@@ -44,7 +47,11 @@
|
||||
namespace boost{
|
||||
namespace BOOST_REGEX_DETAIL_NS{
|
||||
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(push)
|
||||
#pragma warning(disable:26812)
|
||||
#endif
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
void perl_matcher<BidiIterator, Allocator, traits>::construct_init(const basic_regex<char_type, traits>& e, match_flag_type f)
|
||||
{
|
||||
typedef typename regex_iterator_traits<BidiIterator>::iterator_category category;
|
||||
@@ -94,6 +101,9 @@ void perl_matcher<BidiIterator, Allocator, traits>::construct_init(const basic_r
|
||||
if(e.get_data().m_disable_match_any)
|
||||
m_match_flags &= regex_constants::match_not_any;
|
||||
}
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
void perl_matcher<BidiIterator, Allocator, traits>::estimate_max_state_count(std::random_access_iterator_tag*)
|
||||
@@ -609,10 +619,10 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_backref()
|
||||
// or PCRE.
|
||||
//
|
||||
int index = static_cast<const re_brace*>(pstate)->index;
|
||||
if(index >= 10000)
|
||||
if(index >= hash_value_mask)
|
||||
{
|
||||
named_subexpressions::range_type r = re.get_data().equal_range(index);
|
||||
BOOST_ASSERT(r.first != r.second);
|
||||
BOOST_REGEX_ASSERT(r.first != r.second);
|
||||
do
|
||||
{
|
||||
index = r.first->index;
|
||||
@@ -758,7 +768,7 @@ inline bool perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref(
|
||||
{
|
||||
// Have we matched subexpression "index"?
|
||||
// Check if index is a hash value:
|
||||
if(index >= 10000)
|
||||
if(index >= hash_value_mask)
|
||||
{
|
||||
named_subexpressions::range_type r = re.get_data().equal_range(index);
|
||||
while(r.first != r.second)
|
||||
@@ -782,7 +792,7 @@ inline bool perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref(
|
||||
// Have we recursed into subexpression "index"?
|
||||
// If index == 0 then check for any recursion at all, otherwise for recursion to -index-1.
|
||||
int idx = -(index+1);
|
||||
if(idx >= 10000)
|
||||
if(idx >= hash_value_mask)
|
||||
{
|
||||
named_subexpressions::range_type r = re.get_data().equal_range(idx);
|
||||
int stack_index = recursion_stack.empty() ? -1 : recursion_stack.back().idx;
|
||||
@@ -1002,7 +1012,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_lit()
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
# pragma option pop
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#ifndef BOOST_REGEX_V4_PERL_MATCHER_NON_RECURSIVE_HPP
|
||||
#define BOOST_REGEX_V4_PERL_MATCHER_NON_RECURSIVE_HPP
|
||||
|
||||
#include <new>
|
||||
#include <boost/regex/v4/mem_block_cache.hpp>
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
@@ -67,7 +67,7 @@ struct saved_matched_paren : public saved_state
|
||||
{
|
||||
int index;
|
||||
sub_match<BidiIterator> sub;
|
||||
saved_matched_paren(int i, const sub_match<BidiIterator>& s) : saved_state(1), index(i), sub(s){};
|
||||
saved_matched_paren(int i, const sub_match<BidiIterator>& s) : saved_state(1), index(i), sub(s){}
|
||||
};
|
||||
|
||||
template <class BidiIterator>
|
||||
@@ -75,7 +75,7 @@ struct saved_position : public saved_state
|
||||
{
|
||||
const re_syntax_base* pstate;
|
||||
BidiIterator position;
|
||||
saved_position(const re_syntax_base* ps, BidiIterator pos, int i) : saved_state(i), pstate(ps), position(pos){};
|
||||
saved_position(const re_syntax_base* ps, BidiIterator pos, int i) : saved_state(i), pstate(ps), position(pos){}
|
||||
};
|
||||
|
||||
template <class BidiIterator>
|
||||
@@ -83,7 +83,7 @@ struct saved_assertion : public saved_position<BidiIterator>
|
||||
{
|
||||
bool positive;
|
||||
saved_assertion(bool p, const re_syntax_base* ps, BidiIterator pos)
|
||||
: saved_position<BidiIterator>(ps, pos, saved_type_assertion), positive(p){};
|
||||
: saved_position<BidiIterator>(ps, pos, saved_type_assertion), positive(p){}
|
||||
};
|
||||
|
||||
template <class BidiIterator>
|
||||
@@ -111,7 +111,7 @@ struct save_state_init
|
||||
*end = reinterpret_cast<saved_state*>(reinterpret_cast<char*>(*base)+BOOST_REGEX_BLOCKSIZE);
|
||||
--(*end);
|
||||
(void) new (*end)saved_state(0);
|
||||
BOOST_ASSERT(*end > *base);
|
||||
BOOST_REGEX_ASSERT(*end > *base);
|
||||
}
|
||||
~save_state_init()
|
||||
{
|
||||
@@ -217,7 +217,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
|
||||
bool successful_unwind = unwind(false);
|
||||
if((m_match_flags & match_partial) && (position == last) && (position != search_base))
|
||||
m_has_partial_match = true;
|
||||
if(false == successful_unwind)
|
||||
if(!successful_unwind)
|
||||
return m_recursive_result;
|
||||
}
|
||||
}
|
||||
@@ -248,7 +248,7 @@ void perl_matcher<BidiIterator, Allocator, traits>::extend_stack()
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
inline void perl_matcher<BidiIterator, Allocator, traits>::push_matched_paren(int index, const sub_match<BidiIterator>& sub)
|
||||
{
|
||||
//BOOST_ASSERT(index);
|
||||
//BOOST_REGEX_ASSERT(index);
|
||||
saved_matched_paren<BidiIterator>* pmp = static_cast<saved_matched_paren<BidiIterator>*>(m_backup_state);
|
||||
--pmp;
|
||||
if(pmp < m_stack_base)
|
||||
@@ -264,7 +264,7 @@ inline void perl_matcher<BidiIterator, Allocator, traits>::push_matched_paren(in
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
inline void perl_matcher<BidiIterator, Allocator, traits>::push_case_change(bool c)
|
||||
{
|
||||
//BOOST_ASSERT(index);
|
||||
//BOOST_REGEX_ASSERT(index);
|
||||
saved_change_case* pmp = static_cast<saved_change_case*>(m_backup_state);
|
||||
--pmp;
|
||||
if(pmp < m_stack_base)
|
||||
@@ -348,7 +348,7 @@ inline void perl_matcher<BidiIterator, Allocator, traits>::push_repeater_count(i
|
||||
pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
|
||||
--pmp;
|
||||
}
|
||||
(void) new (pmp)saved_repeater<BidiIterator>(i, s, position, this->recursion_stack.size() ? this->recursion_stack.back().idx : (INT_MIN + 3));
|
||||
(void) new (pmp)saved_repeater<BidiIterator>(i, s, position, this->recursion_stack.empty() ? (INT_MIN + 3) : this->recursion_stack.back().idx);
|
||||
m_backup_state = pmp;
|
||||
}
|
||||
|
||||
@@ -492,7 +492,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
|
||||
{
|
||||
// conditional expression:
|
||||
const re_alt* alt = static_cast<const re_alt*>(pstate->next.p);
|
||||
BOOST_ASSERT(alt->type == syntax_element_alt);
|
||||
BOOST_REGEX_ASSERT(alt->type == syntax_element_alt);
|
||||
pstate = alt->next.p;
|
||||
if(pstate->type == syntax_element_assert_backref)
|
||||
{
|
||||
@@ -503,7 +503,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
|
||||
else
|
||||
{
|
||||
// zero width assertion, have to match this recursively:
|
||||
BOOST_ASSERT(pstate->type == syntax_element_startmark);
|
||||
BOOST_REGEX_ASSERT(pstate->type == syntax_element_startmark);
|
||||
bool negated = static_cast<const re_brace*>(pstate)->index == -2;
|
||||
BidiIterator saved_position = position;
|
||||
const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
|
||||
@@ -543,7 +543,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
|
||||
}
|
||||
default:
|
||||
{
|
||||
BOOST_ASSERT(index > 0);
|
||||
BOOST_REGEX_ASSERT(index > 0);
|
||||
if((m_match_flags & match_nosubs) == 0)
|
||||
{
|
||||
push_matched_paren(index, (*m_presult)[index]);
|
||||
@@ -600,7 +600,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_rep()
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4127 4244)
|
||||
#endif
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option push -w-8008 -w-8066 -w-8004
|
||||
#endif
|
||||
const re_repeat* rep = static_cast<const re_repeat*>(pstate);
|
||||
@@ -691,7 +691,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_rep()
|
||||
}
|
||||
}
|
||||
return false;
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option pop
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
@@ -705,7 +705,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow()
|
||||
std::size_t count = 0;
|
||||
const re_repeat* rep = static_cast<const re_repeat*>(pstate);
|
||||
re_syntax_base* psingle = rep->next.p;
|
||||
// match compulsary repeats first:
|
||||
// match compulsory repeats first:
|
||||
while(count < rep->min)
|
||||
{
|
||||
pstate = psingle;
|
||||
@@ -790,11 +790,11 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4127)
|
||||
#endif
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option push -w-8008 -w-8066 -w-8004
|
||||
#endif
|
||||
const re_repeat* rep = static_cast<const re_repeat*>(pstate);
|
||||
BOOST_ASSERT(1 == static_cast<const re_literal*>(rep->next.p)->length);
|
||||
BOOST_REGEX_ASSERT(1 == static_cast<const re_literal*>(rep->next.p)->length);
|
||||
const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(rep->next.p) + 1);
|
||||
std::size_t count = 0;
|
||||
//
|
||||
@@ -850,7 +850,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
|
||||
pstate = rep->alt.p;
|
||||
return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
|
||||
}
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option pop
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
@@ -865,7 +865,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4127)
|
||||
#endif
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option push -w-8008 -w-8066 -w-8004
|
||||
#endif
|
||||
const re_repeat* rep = static_cast<const re_repeat*>(pstate);
|
||||
@@ -924,7 +924,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
|
||||
pstate = rep->alt.p;
|
||||
return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
|
||||
}
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option pop
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
@@ -939,7 +939,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4127)
|
||||
#endif
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option push -w-8008 -w-8066 -w-8004
|
||||
#endif
|
||||
typedef typename traits::char_class_type m_type;
|
||||
@@ -999,7 +999,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
|
||||
pstate = rep->alt.p;
|
||||
return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
|
||||
}
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option pop
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
@@ -1010,7 +1010,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
bool perl_matcher<BidiIterator, Allocator, traits>::match_recursion()
|
||||
{
|
||||
BOOST_ASSERT(pstate->type == syntax_element_recurse);
|
||||
BOOST_REGEX_ASSERT(pstate->type == syntax_element_recurse);
|
||||
//
|
||||
// See if we've seen this recursion before at this location, if we have then
|
||||
// we need to prevent infinite recursion:
|
||||
@@ -1087,7 +1087,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_match()
|
||||
{
|
||||
if(!recursion_stack.empty())
|
||||
{
|
||||
BOOST_ASSERT(0 == recursion_stack.back().idx);
|
||||
BOOST_REGEX_ASSERT(0 == recursion_stack.back().idx);
|
||||
pstate = recursion_stack.back().preturn_address;
|
||||
push_recursion(recursion_stack.back().idx, recursion_stack.back().preturn_address, m_presult, &recursion_stack.back().results);
|
||||
*m_presult = recursion_stack.back().results;
|
||||
@@ -1224,7 +1224,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::skip_until_paren(int index,
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Unwind and associated proceedures follow, these perform what normal stack
|
||||
Unwind and associated procedures follow, these perform what normal stack
|
||||
unwinding does in the recursive implementation.
|
||||
|
||||
****************************************************************************/
|
||||
@@ -1296,7 +1296,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_paren(bool have_match
|
||||
{
|
||||
saved_matched_paren<BidiIterator>* pmp = static_cast<saved_matched_paren<BidiIterator>*>(m_backup_state);
|
||||
// restore previous values if no match was found:
|
||||
if(have_match == false)
|
||||
if(!have_match)
|
||||
{
|
||||
m_presult->set_first(pmp->sub.first, pmp->index, pmp->index == 0);
|
||||
m_presult->set_second(pmp->sub.second, pmp->index, pmp->sub.matched, pmp->index == 0);
|
||||
@@ -1354,6 +1354,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_alt(bool r)
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_repeater_counter(bool)
|
||||
{
|
||||
++used_block_count;
|
||||
saved_repeater<BidiIterator>* pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
|
||||
boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
|
||||
m_backup_state = pmp;
|
||||
@@ -1394,15 +1395,15 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_greedy_single_repeat(
|
||||
|
||||
const re_repeat* rep = pmp->rep;
|
||||
std::size_t count = pmp->count;
|
||||
BOOST_ASSERT(rep->next.p != 0);
|
||||
BOOST_ASSERT(rep->alt.p != 0);
|
||||
BOOST_REGEX_ASSERT(rep->next.p != 0);
|
||||
BOOST_REGEX_ASSERT(rep->alt.p != 0);
|
||||
|
||||
count -= rep->min;
|
||||
|
||||
if((m_match_flags & match_partial) && (position == last))
|
||||
m_has_partial_match = true;
|
||||
|
||||
BOOST_ASSERT(count);
|
||||
BOOST_REGEX_ASSERT(count);
|
||||
position = pmp->last_position;
|
||||
|
||||
// backtrack till we can skip out:
|
||||
@@ -1443,12 +1444,12 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_slow_dot_repeat(bool
|
||||
|
||||
const re_repeat* rep = pmp->rep;
|
||||
std::size_t count = pmp->count;
|
||||
BOOST_ASSERT(rep->type == syntax_element_dot_rep);
|
||||
BOOST_ASSERT(rep->next.p != 0);
|
||||
BOOST_ASSERT(rep->alt.p != 0);
|
||||
BOOST_ASSERT(rep->next.p->type == syntax_element_wild);
|
||||
BOOST_REGEX_ASSERT(rep->type == syntax_element_dot_rep);
|
||||
BOOST_REGEX_ASSERT(rep->next.p != 0);
|
||||
BOOST_REGEX_ASSERT(rep->alt.p != 0);
|
||||
BOOST_REGEX_ASSERT(rep->next.p->type == syntax_element_wild);
|
||||
|
||||
BOOST_ASSERT(count < rep->max);
|
||||
BOOST_REGEX_ASSERT(count < rep->max);
|
||||
pstate = rep->next.p;
|
||||
position = pmp->last_position;
|
||||
|
||||
@@ -1508,7 +1509,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_fast_dot_repeat(bool
|
||||
const re_repeat* rep = pmp->rep;
|
||||
std::size_t count = pmp->count;
|
||||
|
||||
BOOST_ASSERT(count < rep->max);
|
||||
BOOST_REGEX_ASSERT(count < rep->max);
|
||||
position = pmp->last_position;
|
||||
if(position != last)
|
||||
{
|
||||
@@ -1568,11 +1569,11 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_char_repeat(bool r)
|
||||
const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(pstate) + 1);
|
||||
position = pmp->last_position;
|
||||
|
||||
BOOST_ASSERT(rep->type == syntax_element_char_rep);
|
||||
BOOST_ASSERT(rep->next.p != 0);
|
||||
BOOST_ASSERT(rep->alt.p != 0);
|
||||
BOOST_ASSERT(rep->next.p->type == syntax_element_literal);
|
||||
BOOST_ASSERT(count < rep->max);
|
||||
BOOST_REGEX_ASSERT(rep->type == syntax_element_char_rep);
|
||||
BOOST_REGEX_ASSERT(rep->next.p != 0);
|
||||
BOOST_REGEX_ASSERT(rep->alt.p != 0);
|
||||
BOOST_REGEX_ASSERT(rep->next.p->type == syntax_element_literal);
|
||||
BOOST_REGEX_ASSERT(count < rep->max);
|
||||
|
||||
if(position != last)
|
||||
{
|
||||
@@ -1637,11 +1638,11 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_short_set_repeat(bool
|
||||
const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map;
|
||||
position = pmp->last_position;
|
||||
|
||||
BOOST_ASSERT(rep->type == syntax_element_short_set_rep);
|
||||
BOOST_ASSERT(rep->next.p != 0);
|
||||
BOOST_ASSERT(rep->alt.p != 0);
|
||||
BOOST_ASSERT(rep->next.p->type == syntax_element_set);
|
||||
BOOST_ASSERT(count < rep->max);
|
||||
BOOST_REGEX_ASSERT(rep->type == syntax_element_short_set_rep);
|
||||
BOOST_REGEX_ASSERT(rep->next.p != 0);
|
||||
BOOST_REGEX_ASSERT(rep->alt.p != 0);
|
||||
BOOST_REGEX_ASSERT(rep->next.p->type == syntax_element_set);
|
||||
BOOST_REGEX_ASSERT(count < rep->max);
|
||||
|
||||
if(position != last)
|
||||
{
|
||||
@@ -1707,11 +1708,11 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_long_set_repeat(bool
|
||||
const re_set_long<m_type>* set = static_cast<const re_set_long<m_type>*>(pstate);
|
||||
position = pmp->last_position;
|
||||
|
||||
BOOST_ASSERT(rep->type == syntax_element_long_set_rep);
|
||||
BOOST_ASSERT(rep->next.p != 0);
|
||||
BOOST_ASSERT(rep->alt.p != 0);
|
||||
BOOST_ASSERT(rep->next.p->type == syntax_element_long_set);
|
||||
BOOST_ASSERT(count < rep->max);
|
||||
BOOST_REGEX_ASSERT(rep->type == syntax_element_long_set_rep);
|
||||
BOOST_REGEX_ASSERT(rep->next.p != 0);
|
||||
BOOST_REGEX_ASSERT(rep->alt.p != 0);
|
||||
BOOST_REGEX_ASSERT(rep->next.p->type == syntax_element_long_set);
|
||||
BOOST_REGEX_ASSERT(count < rep->max);
|
||||
|
||||
if(position != last)
|
||||
{
|
||||
@@ -1944,5 +1945,3 @@ inline void perl_matcher<BidiIterator, Allocator, traits>::push_parenthesis_push
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -195,7 +195,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
|
||||
{
|
||||
// conditional expression:
|
||||
const re_alt* alt = static_cast<const re_alt*>(pstate->next.p);
|
||||
BOOST_ASSERT(alt->type == syntax_element_alt);
|
||||
BOOST_REGEX_ASSERT(alt->type == syntax_element_alt);
|
||||
pstate = alt->next.p;
|
||||
if(pstate->type == syntax_element_assert_backref)
|
||||
{
|
||||
@@ -206,7 +206,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
|
||||
else
|
||||
{
|
||||
// zero width assertion, have to match this recursively:
|
||||
BOOST_ASSERT(pstate->type == syntax_element_startmark);
|
||||
BOOST_REGEX_ASSERT(pstate->type == syntax_element_startmark);
|
||||
bool negated = static_cast<const re_brace*>(pstate)->index == -2;
|
||||
BidiIterator saved_position = position;
|
||||
const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
|
||||
@@ -235,7 +235,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
|
||||
}
|
||||
default:
|
||||
{
|
||||
BOOST_ASSERT(index > 0);
|
||||
BOOST_REGEX_ASSERT(index > 0);
|
||||
if((m_match_flags & match_nosubs) == 0)
|
||||
{
|
||||
backup_subex<BidiIterator> sub(*m_presult, index);
|
||||
@@ -548,11 +548,11 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
|
||||
#pragma warning(disable:4127)
|
||||
#pragma warning(disable:4267)
|
||||
#endif
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option push -w-8008 -w-8066 -w-8004
|
||||
#endif
|
||||
const re_repeat* rep = static_cast<const re_repeat*>(pstate);
|
||||
BOOST_ASSERT(1 == static_cast<const re_literal*>(rep->next.p)->length);
|
||||
BOOST_REGEX_ASSERT(1 == static_cast<const re_literal*>(rep->next.p)->length);
|
||||
const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(rep->next.p) + 1);
|
||||
//
|
||||
// start by working out how much we can skip:
|
||||
@@ -637,7 +637,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
|
||||
return false;
|
||||
}
|
||||
}while(true);
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option pop
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
@@ -652,7 +652,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4127)
|
||||
#endif
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option push -w-8008 -w-8066 -w-8004
|
||||
#endif
|
||||
const re_repeat* rep = static_cast<const re_repeat*>(pstate);
|
||||
@@ -732,7 +732,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
|
||||
return false;
|
||||
}
|
||||
}while(true);
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option pop
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
@@ -747,7 +747,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4127)
|
||||
#endif
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option push -w-8008 -w-8066 -w-8004
|
||||
#endif
|
||||
typedef typename traits::char_class_type char_class_type;
|
||||
@@ -828,7 +828,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
|
||||
return false;
|
||||
}
|
||||
}while(true);
|
||||
#ifdef __BORLANDC__
|
||||
#ifdef BOOST_BORLANDC
|
||||
#pragma option pop
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
@@ -892,7 +892,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::backtrack_till_match(std::si
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
bool perl_matcher<BidiIterator, Allocator, traits>::match_recursion()
|
||||
{
|
||||
BOOST_ASSERT(pstate->type == syntax_element_recurse);
|
||||
BOOST_REGEX_ASSERT(pstate->type == syntax_element_recurse);
|
||||
//
|
||||
// Set new call stack:
|
||||
//
|
||||
@@ -987,7 +987,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_match()
|
||||
{
|
||||
if(!recursion_stack.empty())
|
||||
{
|
||||
BOOST_ASSERT(0 == recursion_stack.back().idx);
|
||||
BOOST_REGEX_ASSERT(0 == recursion_stack.back().idx);
|
||||
const re_syntax_base* saved_state = pstate = recursion_stack.back().preturn_address;
|
||||
*m_presult = recursion_stack.back().results;
|
||||
recursion_stack.pop_back();
|
||||
|
||||
@@ -46,7 +46,7 @@ template <class S, class charT>
|
||||
unsigned count_chars(const S& s, charT c)
|
||||
{
|
||||
//
|
||||
// Count how many occurances of character c occur
|
||||
// Count how many occurrences of character c occur
|
||||
// in string s: if c is a delimeter between collation
|
||||
// fields, then this should be the same value for all
|
||||
// sort keys:
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
#ifndef BOOST_REGEX_V4_PROTECTED_CALL_HPP
|
||||
#define BOOST_REGEX_V4_PROTECTED_CALL_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
@@ -53,7 +55,7 @@ public:
|
||||
concrete_protected_call(T* o, proc_type p)
|
||||
: obj(o), proc(p) {}
|
||||
private:
|
||||
virtual bool call()const;
|
||||
bool call()const BOOST_OVERRIDE;
|
||||
T* obj;
|
||||
proc_type proc;
|
||||
};
|
||||
|
||||
@@ -87,42 +87,6 @@
|
||||
#ifndef BOOST_REGEX_MATCHER_HPP
|
||||
#include <boost/regex/v4/perl_matcher.hpp>
|
||||
#endif
|
||||
//
|
||||
// template instances:
|
||||
//
|
||||
#define BOOST_REGEX_CHAR_T char
|
||||
#ifdef BOOST_REGEX_NARROW_INSTANTIATE
|
||||
# define BOOST_REGEX_INSTANTIATE
|
||||
#endif
|
||||
#include <boost/regex/v4/instances.hpp>
|
||||
#undef BOOST_REGEX_CHAR_T
|
||||
#ifdef BOOST_REGEX_INSTANTIATE
|
||||
# undef BOOST_REGEX_INSTANTIATE
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
#define BOOST_REGEX_CHAR_T wchar_t
|
||||
#ifdef BOOST_REGEX_WIDE_INSTANTIATE
|
||||
# define BOOST_REGEX_INSTANTIATE
|
||||
#endif
|
||||
#include <boost/regex/v4/instances.hpp>
|
||||
#undef BOOST_REGEX_CHAR_T
|
||||
#ifdef BOOST_REGEX_INSTANTIATE
|
||||
# undef BOOST_REGEX_INSTANTIATE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_WREGEX) && defined(BOOST_REGEX_HAS_OTHER_WCHAR_T)
|
||||
#define BOOST_REGEX_CHAR_T unsigned short
|
||||
#ifdef BOOST_REGEX_US_INSTANTIATE
|
||||
# define BOOST_REGEX_INSTANTIATE
|
||||
#endif
|
||||
#include <boost/regex/v4/instances.hpp>
|
||||
#undef BOOST_REGEX_CHAR_T
|
||||
#ifdef BOOST_REGEX_INSTANTIATE
|
||||
# undef BOOST_REGEX_INSTANTIATE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
namespace boost{
|
||||
|
||||
@@ -90,6 +90,10 @@ struct trivial_format_traits
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(push)
|
||||
#pragma warning(disable:26812)
|
||||
#endif
|
||||
template <class OutputIterator, class Results, class traits, class ForwardIter>
|
||||
class basic_regex_formatter
|
||||
{
|
||||
@@ -203,6 +207,9 @@ private:
|
||||
basic_regex_formatter(const basic_regex_formatter&);
|
||||
basic_regex_formatter& operator=(const basic_regex_formatter&);
|
||||
};
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
template <class OutputIterator, class Results, class traits, class ForwardIter>
|
||||
OutputIterator basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format(ForwardIter p1, ForwardIter p2, match_flag_type f)
|
||||
@@ -244,7 +251,7 @@ void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format
|
||||
m_have_conditional = have_conditional;
|
||||
if(m_position == m_end)
|
||||
return;
|
||||
BOOST_ASSERT(*m_position == static_cast<char_type>(')'));
|
||||
BOOST_REGEX_ASSERT(*m_position == static_cast<char_type>(')'));
|
||||
++m_position; // skip the closing ')'
|
||||
break;
|
||||
}
|
||||
@@ -300,7 +307,7 @@ void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format
|
||||
// On entry *m_position points to a '$' character
|
||||
// output the information that goes with it:
|
||||
//
|
||||
BOOST_ASSERT(*m_position == '$');
|
||||
BOOST_REGEX_ASSERT(*m_position == '$');
|
||||
//
|
||||
// see if this is a trailing '$':
|
||||
//
|
||||
@@ -649,7 +656,7 @@ void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format
|
||||
len = ::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end);
|
||||
len = (std::min)(static_cast<std::ptrdiff_t>(4), len);
|
||||
v = this->toi(m_position, m_position + len, 8);
|
||||
BOOST_ASSERT(v >= 0);
|
||||
BOOST_REGEX_ASSERT(v >= 0);
|
||||
put(static_cast<char_type>(v));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -50,6 +50,8 @@ class regex_iterator_implementation
|
||||
public:
|
||||
regex_iterator_implementation(const regex_type* p, BidirectionalIterator last, match_flag_type f)
|
||||
: base(), end(last), re(*p), flags(f){}
|
||||
regex_iterator_implementation(const regex_iterator_implementation& other)
|
||||
:what(other.what), base(other.base), end(other.end), re(other.re), flags(other.flags){}
|
||||
bool init(BidirectionalIterator first)
|
||||
{
|
||||
base = first;
|
||||
|
||||
@@ -106,7 +106,7 @@ enum{
|
||||
// this is used by basic_regex for expression storage
|
||||
//
|
||||
|
||||
class BOOST_REGEX_DECL raw_storage
|
||||
class raw_storage
|
||||
{
|
||||
public:
|
||||
typedef std::size_t size_type;
|
||||
@@ -123,8 +123,30 @@ public:
|
||||
::operator delete(start);
|
||||
}
|
||||
|
||||
void BOOST_REGEX_CALL resize(size_type n);
|
||||
|
||||
void BOOST_REGEX_CALL resize(size_type n)
|
||||
{
|
||||
size_type newsize = start ? last - start : 1024;
|
||||
while (newsize < n)
|
||||
newsize *= 2;
|
||||
size_type datasize = end - start;
|
||||
// extend newsize to WORD/DWORD boundary:
|
||||
newsize = (newsize + padding_mask) & ~(padding_mask);
|
||||
|
||||
// allocate and copy data:
|
||||
pointer ptr = static_cast<pointer>(::operator new(newsize));
|
||||
BOOST_REGEX_NOEH_ASSERT(ptr)
|
||||
if (start)
|
||||
std::memcpy(ptr, start, datasize);
|
||||
|
||||
// get rid of old buffer:
|
||||
::operator delete(start);
|
||||
|
||||
// and set up pointers:
|
||||
start = ptr;
|
||||
end = ptr + datasize;
|
||||
last = ptr + newsize;
|
||||
}
|
||||
|
||||
void* BOOST_REGEX_CALL extend(size_type n)
|
||||
{
|
||||
if(size_type(last - end) < n)
|
||||
@@ -134,7 +156,16 @@ public:
|
||||
return result;
|
||||
}
|
||||
|
||||
void* BOOST_REGEX_CALL insert(size_type pos, size_type n);
|
||||
void* BOOST_REGEX_CALL insert(size_type pos, size_type n)
|
||||
{
|
||||
BOOST_REGEX_ASSERT(pos <= size_type(end - start));
|
||||
if (size_type(last - end) < n)
|
||||
resize(n + (end - start));
|
||||
void* result = start + pos;
|
||||
std::memmove(start + pos + n, start + pos, (end - start) - pos);
|
||||
end += n;
|
||||
return result;
|
||||
}
|
||||
|
||||
size_type BOOST_REGEX_CALL size()
|
||||
{
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#if (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
|
||||
#if (BOOST_WORKAROUND(BOOST_BORLANDC, >= 0x560) && BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x570)))\
|
||||
|| BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
|
||||
//
|
||||
// Borland C++ Builder 6, and Visual C++ 6,
|
||||
@@ -66,17 +66,19 @@ class regex_token_iterator_implementation
|
||||
std::vector<int> subs; // the sub-expressions to enumerate
|
||||
|
||||
public:
|
||||
regex_token_iterator_implementation(const regex_token_iterator_implementation& other)
|
||||
: what(other.what), base(other.base), end(other.end), re(other.re), flags(other.flags), result(other.result), N(other.N), subs(other.subs) {}
|
||||
regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, int sub, match_flag_type f)
|
||||
: end(last), re(*p), flags(f){ subs.push_back(sub); }
|
||||
: end(last), re(*p), flags(f), N(0){ subs.push_back(sub); }
|
||||
regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const std::vector<int>& v, match_flag_type f)
|
||||
: end(last), re(*p), flags(f), subs(v){}
|
||||
: end(last), re(*p), flags(f), N(0), subs(v){}
|
||||
#if !BOOST_WORKAROUND(__HP_aCC, < 60700)
|
||||
#if (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
|
||||
#if (BOOST_WORKAROUND(BOOST_BORLANDC, >= 0x560) && BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x570)))\
|
||||
|| BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) \
|
||||
|| BOOST_WORKAROUND(__HP_aCC, < 60700)
|
||||
template <class T>
|
||||
regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const T& submatches, match_flag_type f)
|
||||
: end(last), re(*p), flags(f)
|
||||
: end(last), re(*p), flags(f), N(0)
|
||||
{
|
||||
// assert that T really is an array:
|
||||
BOOST_STATIC_ASSERT(::boost::is_array<T>::value);
|
||||
@@ -89,7 +91,7 @@ public:
|
||||
#else
|
||||
template <std::size_t CN>
|
||||
regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const int (&submatches)[CN], match_flag_type f)
|
||||
: end(last), re(*p), flags(f)
|
||||
: end(last), re(*p), flags(f), N(0)
|
||||
{
|
||||
for(std::size_t i = 0; i < CN; ++i)
|
||||
{
|
||||
@@ -196,7 +198,7 @@ public:
|
||||
pdata.reset();
|
||||
}
|
||||
#if !BOOST_WORKAROUND(__HP_aCC, < 60700)
|
||||
#if (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
|
||||
#if (BOOST_WORKAROUND(BOOST_BORLANDC, >= 0x560) && BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x570)))\
|
||||
|| BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) \
|
||||
|| BOOST_WORKAROUND(__HP_aCC, < 60700)
|
||||
template <class T>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
# include <boost/regex/v4/cpp_regex_traits.hpp>
|
||||
# endif
|
||||
#endif
|
||||
#if !BOOST_WORKAROUND(__BORLANDC__, < 0x560)
|
||||
#if !BOOST_WORKAROUND(BOOST_BORLANDC, < 0x560)
|
||||
# ifndef BOOST_C_REGEX_TRAITS_HPP_INCLUDED
|
||||
# include <boost/regex/v4/c_regex_traits.hpp>
|
||||
# endif
|
||||
|
||||
@@ -31,6 +31,11 @@
|
||||
#endif
|
||||
|
||||
#include <boost/regex/config.hpp>
|
||||
#include <boost/cstdint.hpp>
|
||||
|
||||
#include <cctype>
|
||||
#include <cwctype>
|
||||
#include <locale>
|
||||
|
||||
#ifndef BOOST_REGEX_SYNTAX_TYPE_HPP
|
||||
#include <boost/regex/v4/syntax_type.hpp>
|
||||
@@ -38,6 +43,7 @@
|
||||
#ifndef BOOST_REGEX_ERROR_TYPE_HPP
|
||||
#include <boost/regex/v4/error_type.hpp>
|
||||
#endif
|
||||
#include <boost/regex/v4/regex_workaround.hpp>
|
||||
#include <boost/type_traits/make_unsigned.hpp>
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
|
||||
@@ -62,14 +68,548 @@ inline bool is_extended(charT c)
|
||||
inline bool is_extended(char)
|
||||
{ return false; }
|
||||
|
||||
inline const char* BOOST_REGEX_CALL get_default_syntax(regex_constants::syntax_type n)
|
||||
{
|
||||
// if the user hasn't supplied a message catalog, then this supplies
|
||||
// default "messages" for us to load in the range 1-100.
|
||||
const char* messages[] = {
|
||||
"",
|
||||
"(",
|
||||
")",
|
||||
"$",
|
||||
"^",
|
||||
".",
|
||||
"*",
|
||||
"+",
|
||||
"?",
|
||||
"[",
|
||||
"]",
|
||||
"|",
|
||||
"\\",
|
||||
"#",
|
||||
"-",
|
||||
"{",
|
||||
"}",
|
||||
"0123456789",
|
||||
"b",
|
||||
"B",
|
||||
"<",
|
||||
">",
|
||||
"",
|
||||
"",
|
||||
"A`",
|
||||
"z'",
|
||||
"\n",
|
||||
",",
|
||||
"a",
|
||||
"f",
|
||||
"n",
|
||||
"r",
|
||||
"t",
|
||||
"v",
|
||||
"x",
|
||||
"c",
|
||||
":",
|
||||
"=",
|
||||
"e",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"E",
|
||||
"Q",
|
||||
"X",
|
||||
"C",
|
||||
"Z",
|
||||
"G",
|
||||
"!",
|
||||
"p",
|
||||
"P",
|
||||
"N",
|
||||
"gk",
|
||||
"K",
|
||||
"R",
|
||||
};
|
||||
|
||||
BOOST_REGEX_DECL const char* BOOST_REGEX_CALL get_default_syntax(regex_constants::syntax_type n);
|
||||
BOOST_REGEX_DECL const char* BOOST_REGEX_CALL get_default_error_string(regex_constants::error_type n);
|
||||
BOOST_REGEX_DECL regex_constants::syntax_type BOOST_REGEX_CALL get_default_syntax_type(char c);
|
||||
BOOST_REGEX_DECL regex_constants::escape_syntax_type BOOST_REGEX_CALL get_default_escape_syntax_type(char c);
|
||||
return ((n >= (sizeof(messages) / sizeof(messages[1]))) ? "" : messages[n]);
|
||||
}
|
||||
|
||||
inline const char* BOOST_REGEX_CALL get_default_error_string(regex_constants::error_type n)
|
||||
{
|
||||
static const char* const s_default_error_messages[] = {
|
||||
"Success", /* REG_NOERROR 0 error_ok */
|
||||
"No match", /* REG_NOMATCH 1 error_no_match */
|
||||
"Invalid regular expression.", /* REG_BADPAT 2 error_bad_pattern */
|
||||
"Invalid collation character.", /* REG_ECOLLATE 3 error_collate */
|
||||
"Invalid character class name, collating name, or character range.", /* REG_ECTYPE 4 error_ctype */
|
||||
"Invalid or unterminated escape sequence.", /* REG_EESCAPE 5 error_escape */
|
||||
"Invalid back reference: specified capturing group does not exist.", /* REG_ESUBREG 6 error_backref */
|
||||
"Unmatched [ or [^ in character class declaration.", /* REG_EBRACK 7 error_brack */
|
||||
"Unmatched marking parenthesis ( or \\(.", /* REG_EPAREN 8 error_paren */
|
||||
"Unmatched quantified repeat operator { or \\{.", /* REG_EBRACE 9 error_brace */
|
||||
"Invalid content of repeat range.", /* REG_BADBR 10 error_badbrace */
|
||||
"Invalid range end in character class", /* REG_ERANGE 11 error_range */
|
||||
"Out of memory.", /* REG_ESPACE 12 error_space NOT USED */
|
||||
"Invalid preceding regular expression prior to repetition operator.", /* REG_BADRPT 13 error_badrepeat */
|
||||
"Premature end of regular expression", /* REG_EEND 14 error_end NOT USED */
|
||||
"Regular expression is too large.", /* REG_ESIZE 15 error_size NOT USED */
|
||||
"Unmatched ) or \\)", /* REG_ERPAREN 16 error_right_paren NOT USED */
|
||||
"Empty regular expression.", /* REG_EMPTY 17 error_empty */
|
||||
"The complexity of matching the regular expression exceeded predefined bounds. "
|
||||
"Try refactoring the regular expression to make each choice made by the state machine unambiguous. "
|
||||
"This exception is thrown to prevent \"eternal\" matches that take an "
|
||||
"indefinite period time to locate.", /* REG_ECOMPLEXITY 18 error_complexity */
|
||||
"Ran out of stack space trying to match the regular expression.", /* REG_ESTACK 19 error_stack */
|
||||
"Invalid or unterminated Perl (?...) sequence.", /* REG_E_PERL 20 error_perl */
|
||||
"Unknown error.", /* REG_E_UNKNOWN 21 error_unknown */
|
||||
};
|
||||
|
||||
return (n > ::boost::regex_constants::error_unknown) ? s_default_error_messages[::boost::regex_constants::error_unknown] : s_default_error_messages[n];
|
||||
}
|
||||
|
||||
inline regex_constants::syntax_type BOOST_REGEX_CALL get_default_syntax_type(char c)
|
||||
{
|
||||
//
|
||||
// char_syntax determines how the compiler treats a given character
|
||||
// in a regular expression.
|
||||
//
|
||||
static regex_constants::syntax_type char_syntax[] = {
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_newline, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /* */ // 32
|
||||
regex_constants::syntax_not, /*!*/
|
||||
regex_constants::syntax_char, /*"*/
|
||||
regex_constants::syntax_hash, /*#*/
|
||||
regex_constants::syntax_dollar, /*$*/
|
||||
regex_constants::syntax_char, /*%*/
|
||||
regex_constants::syntax_char, /*&*/
|
||||
regex_constants::escape_type_end_buffer, /*'*/
|
||||
regex_constants::syntax_open_mark, /*(*/
|
||||
regex_constants::syntax_close_mark, /*)*/
|
||||
regex_constants::syntax_star, /***/
|
||||
regex_constants::syntax_plus, /*+*/
|
||||
regex_constants::syntax_comma, /*,*/
|
||||
regex_constants::syntax_dash, /*-*/
|
||||
regex_constants::syntax_dot, /*.*/
|
||||
regex_constants::syntax_char, /*/*/
|
||||
regex_constants::syntax_digit, /*0*/
|
||||
regex_constants::syntax_digit, /*1*/
|
||||
regex_constants::syntax_digit, /*2*/
|
||||
regex_constants::syntax_digit, /*3*/
|
||||
regex_constants::syntax_digit, /*4*/
|
||||
regex_constants::syntax_digit, /*5*/
|
||||
regex_constants::syntax_digit, /*6*/
|
||||
regex_constants::syntax_digit, /*7*/
|
||||
regex_constants::syntax_digit, /*8*/
|
||||
regex_constants::syntax_digit, /*9*/
|
||||
regex_constants::syntax_colon, /*:*/
|
||||
regex_constants::syntax_char, /*;*/
|
||||
regex_constants::escape_type_left_word, /*<*/
|
||||
regex_constants::syntax_equal, /*=*/
|
||||
regex_constants::escape_type_right_word, /*>*/
|
||||
regex_constants::syntax_question, /*?*/
|
||||
regex_constants::syntax_char, /*@*/
|
||||
regex_constants::syntax_char, /*A*/
|
||||
regex_constants::syntax_char, /*B*/
|
||||
regex_constants::syntax_char, /*C*/
|
||||
regex_constants::syntax_char, /*D*/
|
||||
regex_constants::syntax_char, /*E*/
|
||||
regex_constants::syntax_char, /*F*/
|
||||
regex_constants::syntax_char, /*G*/
|
||||
regex_constants::syntax_char, /*H*/
|
||||
regex_constants::syntax_char, /*I*/
|
||||
regex_constants::syntax_char, /*J*/
|
||||
regex_constants::syntax_char, /*K*/
|
||||
regex_constants::syntax_char, /*L*/
|
||||
regex_constants::syntax_char, /*M*/
|
||||
regex_constants::syntax_char, /*N*/
|
||||
regex_constants::syntax_char, /*O*/
|
||||
regex_constants::syntax_char, /*P*/
|
||||
regex_constants::syntax_char, /*Q*/
|
||||
regex_constants::syntax_char, /*R*/
|
||||
regex_constants::syntax_char, /*S*/
|
||||
regex_constants::syntax_char, /*T*/
|
||||
regex_constants::syntax_char, /*U*/
|
||||
regex_constants::syntax_char, /*V*/
|
||||
regex_constants::syntax_char, /*W*/
|
||||
regex_constants::syntax_char, /*X*/
|
||||
regex_constants::syntax_char, /*Y*/
|
||||
regex_constants::syntax_char, /*Z*/
|
||||
regex_constants::syntax_open_set, /*[*/
|
||||
regex_constants::syntax_escape, /*\*/
|
||||
regex_constants::syntax_close_set, /*]*/
|
||||
regex_constants::syntax_caret, /*^*/
|
||||
regex_constants::syntax_char, /*_*/
|
||||
regex_constants::syntax_char, /*`*/
|
||||
regex_constants::syntax_char, /*a*/
|
||||
regex_constants::syntax_char, /*b*/
|
||||
regex_constants::syntax_char, /*c*/
|
||||
regex_constants::syntax_char, /*d*/
|
||||
regex_constants::syntax_char, /*e*/
|
||||
regex_constants::syntax_char, /*f*/
|
||||
regex_constants::syntax_char, /*g*/
|
||||
regex_constants::syntax_char, /*h*/
|
||||
regex_constants::syntax_char, /*i*/
|
||||
regex_constants::syntax_char, /*j*/
|
||||
regex_constants::syntax_char, /*k*/
|
||||
regex_constants::syntax_char, /*l*/
|
||||
regex_constants::syntax_char, /*m*/
|
||||
regex_constants::syntax_char, /*n*/
|
||||
regex_constants::syntax_char, /*o*/
|
||||
regex_constants::syntax_char, /*p*/
|
||||
regex_constants::syntax_char, /*q*/
|
||||
regex_constants::syntax_char, /*r*/
|
||||
regex_constants::syntax_char, /*s*/
|
||||
regex_constants::syntax_char, /*t*/
|
||||
regex_constants::syntax_char, /*u*/
|
||||
regex_constants::syntax_char, /*v*/
|
||||
regex_constants::syntax_char, /*w*/
|
||||
regex_constants::syntax_char, /*x*/
|
||||
regex_constants::syntax_char, /*y*/
|
||||
regex_constants::syntax_char, /*z*/
|
||||
regex_constants::syntax_open_brace, /*{*/
|
||||
regex_constants::syntax_or, /*|*/
|
||||
regex_constants::syntax_close_brace, /*}*/
|
||||
regex_constants::syntax_char, /*~*/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
regex_constants::syntax_char, /**/
|
||||
};
|
||||
|
||||
return char_syntax[(unsigned char)c];
|
||||
}
|
||||
|
||||
inline regex_constants::escape_syntax_type BOOST_REGEX_CALL get_default_escape_syntax_type(char c)
|
||||
{
|
||||
//
|
||||
// char_syntax determines how the compiler treats a given character
|
||||
// in a regular expression.
|
||||
//
|
||||
static regex_constants::escape_syntax_type char_syntax[] = {
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /* */ // 32
|
||||
regex_constants::escape_type_identity, /*!*/
|
||||
regex_constants::escape_type_identity, /*"*/
|
||||
regex_constants::escape_type_identity, /*#*/
|
||||
regex_constants::escape_type_identity, /*$*/
|
||||
regex_constants::escape_type_identity, /*%*/
|
||||
regex_constants::escape_type_identity, /*&*/
|
||||
regex_constants::escape_type_end_buffer, /*'*/
|
||||
regex_constants::syntax_open_mark, /*(*/
|
||||
regex_constants::syntax_close_mark, /*)*/
|
||||
regex_constants::escape_type_identity, /***/
|
||||
regex_constants::syntax_plus, /*+*/
|
||||
regex_constants::escape_type_identity, /*,*/
|
||||
regex_constants::escape_type_identity, /*-*/
|
||||
regex_constants::escape_type_identity, /*.*/
|
||||
regex_constants::escape_type_identity, /*/*/
|
||||
regex_constants::escape_type_decimal, /*0*/
|
||||
regex_constants::escape_type_backref, /*1*/
|
||||
regex_constants::escape_type_backref, /*2*/
|
||||
regex_constants::escape_type_backref, /*3*/
|
||||
regex_constants::escape_type_backref, /*4*/
|
||||
regex_constants::escape_type_backref, /*5*/
|
||||
regex_constants::escape_type_backref, /*6*/
|
||||
regex_constants::escape_type_backref, /*7*/
|
||||
regex_constants::escape_type_backref, /*8*/
|
||||
regex_constants::escape_type_backref, /*9*/
|
||||
regex_constants::escape_type_identity, /*:*/
|
||||
regex_constants::escape_type_identity, /*;*/
|
||||
regex_constants::escape_type_left_word, /*<*/
|
||||
regex_constants::escape_type_identity, /*=*/
|
||||
regex_constants::escape_type_right_word, /*>*/
|
||||
regex_constants::syntax_question, /*?*/
|
||||
regex_constants::escape_type_identity, /*@*/
|
||||
regex_constants::escape_type_start_buffer, /*A*/
|
||||
regex_constants::escape_type_not_word_assert, /*B*/
|
||||
regex_constants::escape_type_C, /*C*/
|
||||
regex_constants::escape_type_not_class, /*D*/
|
||||
regex_constants::escape_type_E, /*E*/
|
||||
regex_constants::escape_type_not_class, /*F*/
|
||||
regex_constants::escape_type_G, /*G*/
|
||||
regex_constants::escape_type_not_class, /*H*/
|
||||
regex_constants::escape_type_not_class, /*I*/
|
||||
regex_constants::escape_type_not_class, /*J*/
|
||||
regex_constants::escape_type_reset_start_mark, /*K*/
|
||||
regex_constants::escape_type_not_class, /*L*/
|
||||
regex_constants::escape_type_not_class, /*M*/
|
||||
regex_constants::escape_type_named_char, /*N*/
|
||||
regex_constants::escape_type_not_class, /*O*/
|
||||
regex_constants::escape_type_not_property, /*P*/
|
||||
regex_constants::escape_type_Q, /*Q*/
|
||||
regex_constants::escape_type_line_ending, /*R*/
|
||||
regex_constants::escape_type_not_class, /*S*/
|
||||
regex_constants::escape_type_not_class, /*T*/
|
||||
regex_constants::escape_type_not_class, /*U*/
|
||||
regex_constants::escape_type_not_class, /*V*/
|
||||
regex_constants::escape_type_not_class, /*W*/
|
||||
regex_constants::escape_type_X, /*X*/
|
||||
regex_constants::escape_type_not_class, /*Y*/
|
||||
regex_constants::escape_type_Z, /*Z*/
|
||||
regex_constants::escape_type_identity, /*[*/
|
||||
regex_constants::escape_type_identity, /*\*/
|
||||
regex_constants::escape_type_identity, /*]*/
|
||||
regex_constants::escape_type_identity, /*^*/
|
||||
regex_constants::escape_type_identity, /*_*/
|
||||
regex_constants::escape_type_start_buffer, /*`*/
|
||||
regex_constants::escape_type_control_a, /*a*/
|
||||
regex_constants::escape_type_word_assert, /*b*/
|
||||
regex_constants::escape_type_ascii_control, /*c*/
|
||||
regex_constants::escape_type_class, /*d*/
|
||||
regex_constants::escape_type_e, /*e*/
|
||||
regex_constants::escape_type_control_f, /*f*/
|
||||
regex_constants::escape_type_extended_backref, /*g*/
|
||||
regex_constants::escape_type_class, /*h*/
|
||||
regex_constants::escape_type_class, /*i*/
|
||||
regex_constants::escape_type_class, /*j*/
|
||||
regex_constants::escape_type_extended_backref, /*k*/
|
||||
regex_constants::escape_type_class, /*l*/
|
||||
regex_constants::escape_type_class, /*m*/
|
||||
regex_constants::escape_type_control_n, /*n*/
|
||||
regex_constants::escape_type_class, /*o*/
|
||||
regex_constants::escape_type_property, /*p*/
|
||||
regex_constants::escape_type_class, /*q*/
|
||||
regex_constants::escape_type_control_r, /*r*/
|
||||
regex_constants::escape_type_class, /*s*/
|
||||
regex_constants::escape_type_control_t, /*t*/
|
||||
regex_constants::escape_type_class, /*u*/
|
||||
regex_constants::escape_type_control_v, /*v*/
|
||||
regex_constants::escape_type_class, /*w*/
|
||||
regex_constants::escape_type_hex, /*x*/
|
||||
regex_constants::escape_type_class, /*y*/
|
||||
regex_constants::escape_type_end_buffer, /*z*/
|
||||
regex_constants::syntax_open_brace, /*{*/
|
||||
regex_constants::syntax_or, /*|*/
|
||||
regex_constants::syntax_close_brace, /*}*/
|
||||
regex_constants::escape_type_identity, /*~*/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
regex_constants::escape_type_identity, /**/
|
||||
};
|
||||
|
||||
return char_syntax[(unsigned char)c];
|
||||
}
|
||||
|
||||
// is charT c a combining character?
|
||||
BOOST_REGEX_DECL bool BOOST_REGEX_CALL is_combining_implementation(uint_least16_t s);
|
||||
inline bool BOOST_REGEX_CALL is_combining_implementation(boost::uint_least16_t c)
|
||||
{
|
||||
const boost::uint_least16_t combining_ranges[] = { 0x0300, 0x0361,
|
||||
0x0483, 0x0486,
|
||||
0x0903, 0x0903,
|
||||
0x093E, 0x0940,
|
||||
0x0949, 0x094C,
|
||||
0x0982, 0x0983,
|
||||
0x09BE, 0x09C0,
|
||||
0x09C7, 0x09CC,
|
||||
0x09D7, 0x09D7,
|
||||
0x0A3E, 0x0A40,
|
||||
0x0A83, 0x0A83,
|
||||
0x0ABE, 0x0AC0,
|
||||
0x0AC9, 0x0ACC,
|
||||
0x0B02, 0x0B03,
|
||||
0x0B3E, 0x0B3E,
|
||||
0x0B40, 0x0B40,
|
||||
0x0B47, 0x0B4C,
|
||||
0x0B57, 0x0B57,
|
||||
0x0B83, 0x0B83,
|
||||
0x0BBE, 0x0BBF,
|
||||
0x0BC1, 0x0BCC,
|
||||
0x0BD7, 0x0BD7,
|
||||
0x0C01, 0x0C03,
|
||||
0x0C41, 0x0C44,
|
||||
0x0C82, 0x0C83,
|
||||
0x0CBE, 0x0CBE,
|
||||
0x0CC0, 0x0CC4,
|
||||
0x0CC7, 0x0CCB,
|
||||
0x0CD5, 0x0CD6,
|
||||
0x0D02, 0x0D03,
|
||||
0x0D3E, 0x0D40,
|
||||
0x0D46, 0x0D4C,
|
||||
0x0D57, 0x0D57,
|
||||
0x0F7F, 0x0F7F,
|
||||
0x20D0, 0x20E1,
|
||||
0x3099, 0x309A,
|
||||
0xFE20, 0xFE23,
|
||||
0xffff, 0xffff, };
|
||||
|
||||
const boost::uint_least16_t* p = combining_ranges + 1;
|
||||
while (*p < c) p += 2;
|
||||
--p;
|
||||
if ((c >= *p) && (c <= *(p + 1)))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class charT>
|
||||
inline bool is_combining(charT c)
|
||||
@@ -138,10 +678,80 @@ inline bool is_separator<char>(char c)
|
||||
//
|
||||
// get a default collating element:
|
||||
//
|
||||
BOOST_REGEX_DECL std::string BOOST_REGEX_CALL lookup_default_collate_name(const std::string& name);
|
||||
inline std::string BOOST_REGEX_CALL lookup_default_collate_name(const std::string& name)
|
||||
{
|
||||
//
|
||||
// these are the POSIX collating names:
|
||||
//
|
||||
static const char* def_coll_names[] = {
|
||||
"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "alert", "backspace", "tab", "newline",
|
||||
"vertical-tab", "form-feed", "carriage-return", "SO", "SI", "DLE", "DC1", "DC2", "DC3", "DC4", "NAK",
|
||||
"SYN", "ETB", "CAN", "EM", "SUB", "ESC", "IS4", "IS3", "IS2", "IS1", "space", "exclamation-mark",
|
||||
"quotation-mark", "number-sign", "dollar-sign", "percent-sign", "ampersand", "apostrophe",
|
||||
"left-parenthesis", "right-parenthesis", "asterisk", "plus-sign", "comma", "hyphen",
|
||||
"period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
|
||||
"colon", "semicolon", "less-than-sign", "equals-sign", "greater-than-sign",
|
||||
"question-mark", "commercial-at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
|
||||
"Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "left-square-bracket", "backslash",
|
||||
"right-square-bracket", "circumflex", "underscore", "grave-accent", "a", "b", "c", "d", "e", "f",
|
||||
"g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "left-curly-bracket",
|
||||
"vertical-line", "right-curly-bracket", "tilde", "DEL", "",
|
||||
};
|
||||
|
||||
// these multi-character collating elements
|
||||
// should keep most Western-European locales
|
||||
// happy - we should really localise these a
|
||||
// little more - but this will have to do for
|
||||
// now:
|
||||
|
||||
static const char* def_multi_coll[] = {
|
||||
"ae",
|
||||
"Ae",
|
||||
"AE",
|
||||
"ch",
|
||||
"Ch",
|
||||
"CH",
|
||||
"ll",
|
||||
"Ll",
|
||||
"LL",
|
||||
"ss",
|
||||
"Ss",
|
||||
"SS",
|
||||
"nj",
|
||||
"Nj",
|
||||
"NJ",
|
||||
"dz",
|
||||
"Dz",
|
||||
"DZ",
|
||||
"lj",
|
||||
"Lj",
|
||||
"LJ",
|
||||
"",
|
||||
};
|
||||
|
||||
unsigned int i = 0;
|
||||
while (*def_coll_names[i])
|
||||
{
|
||||
if (def_coll_names[i] == name)
|
||||
{
|
||||
return std::string(1, char(i));
|
||||
}
|
||||
++i;
|
||||
}
|
||||
i = 0;
|
||||
while (*def_multi_coll[i])
|
||||
{
|
||||
if (def_multi_coll[i] == name)
|
||||
{
|
||||
return def_multi_coll[i];
|
||||
}
|
||||
++i;
|
||||
}
|
||||
return std::string();
|
||||
}
|
||||
|
||||
//
|
||||
// get the state_id of a character clasification, the individual
|
||||
// get the state_id of a character classification, the individual
|
||||
// traits classes then transform that state_id into a bitmask:
|
||||
//
|
||||
template <class charT>
|
||||
@@ -208,8 +818,8 @@ int get_default_class_id(const charT* p1, const charT* p2)
|
||||
{data+63, data+67,}, // word
|
||||
{data+67, data+73,}, // xdigit
|
||||
};
|
||||
static const character_pointer_range<charT>* ranges_begin = ranges;
|
||||
static const character_pointer_range<charT>* ranges_end = ranges + (sizeof(ranges)/sizeof(ranges[0]));
|
||||
const character_pointer_range<charT>* ranges_begin = ranges;
|
||||
const character_pointer_range<charT>* ranges_end = ranges + (sizeof(ranges)/sizeof(ranges[0]));
|
||||
|
||||
character_pointer_range<charT> t = { p1, p2, };
|
||||
const character_pointer_range<charT>* p = std::lower_bound(ranges_begin, ranges_end, t);
|
||||
@@ -255,15 +865,25 @@ inline charT BOOST_REGEX_CALL global_upper(charT c)
|
||||
return c;
|
||||
}
|
||||
|
||||
BOOST_REGEX_DECL char BOOST_REGEX_CALL do_global_lower(char c);
|
||||
BOOST_REGEX_DECL char BOOST_REGEX_CALL do_global_upper(char c);
|
||||
inline char BOOST_REGEX_CALL do_global_lower(char c)
|
||||
{
|
||||
return static_cast<char>((std::tolower)((unsigned char)c));
|
||||
}
|
||||
|
||||
inline char BOOST_REGEX_CALL do_global_upper(char c)
|
||||
{
|
||||
return static_cast<char>((std::toupper)((unsigned char)c));
|
||||
}
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
BOOST_REGEX_DECL wchar_t BOOST_REGEX_CALL do_global_lower(wchar_t c);
|
||||
BOOST_REGEX_DECL wchar_t BOOST_REGEX_CALL do_global_upper(wchar_t c);
|
||||
#endif
|
||||
#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
|
||||
BOOST_REGEX_DECL unsigned short BOOST_REGEX_CALL do_global_lower(unsigned short c);
|
||||
BOOST_REGEX_DECL unsigned short BOOST_REGEX_CALL do_global_upper(unsigned short c);
|
||||
inline wchar_t BOOST_REGEX_CALL do_global_lower(wchar_t c)
|
||||
{
|
||||
return (std::towlower)(c);
|
||||
}
|
||||
|
||||
inline wchar_t BOOST_REGEX_CALL do_global_upper(wchar_t c)
|
||||
{
|
||||
return (std::towupper)(c);
|
||||
}
|
||||
#endif
|
||||
//
|
||||
// This sucks: declare template specialisations of global_lower/global_upper
|
||||
@@ -275,15 +895,11 @@ BOOST_REGEX_DECL unsigned short BOOST_REGEX_CALL do_global_upper(unsigned short
|
||||
// otherwise the "local template instantiation" compiler option can pick
|
||||
// the wrong instantiation when linking:
|
||||
//
|
||||
template<> inline char BOOST_REGEX_CALL global_lower<char>(char c){ return do_global_lower(c); }
|
||||
template<> inline char BOOST_REGEX_CALL global_upper<char>(char c){ return do_global_upper(c); }
|
||||
template<> inline char BOOST_REGEX_CALL global_lower<char>(char c) { return do_global_lower(c); }
|
||||
template<> inline char BOOST_REGEX_CALL global_upper<char>(char c) { return do_global_upper(c); }
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
template<> inline wchar_t BOOST_REGEX_CALL global_lower<wchar_t>(wchar_t c){ return do_global_lower(c); }
|
||||
template<> inline wchar_t BOOST_REGEX_CALL global_upper<wchar_t>(wchar_t c){ return do_global_upper(c); }
|
||||
#endif
|
||||
#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
|
||||
template<> inline unsigned short BOOST_REGEX_CALL global_lower<unsigned short>(unsigned short c){ return do_global_lower(c); }
|
||||
template<> inline unsigned short BOOST_REGEX_CALL global_upper<unsigned short>(unsigned short c){ return do_global_upper(c); }
|
||||
template<> inline wchar_t BOOST_REGEX_CALL global_lower<wchar_t>(wchar_t c) { return do_global_lower(c); }
|
||||
template<> inline wchar_t BOOST_REGEX_CALL global_upper<wchar_t>(wchar_t c) { return do_global_upper(c); }
|
||||
#endif
|
||||
|
||||
template <class charT>
|
||||
|
||||
@@ -198,10 +198,10 @@ namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
|
||||
const char *strSource
|
||||
)
|
||||
{
|
||||
std::size_t lenSourceWithNull = std::strlen(strSource) + 1;
|
||||
if (lenSourceWithNull > sizeInBytes)
|
||||
std::size_t lenSourceWithNull = std::strlen(strSource) + 1;
|
||||
if (lenSourceWithNull > sizeInBytes)
|
||||
return 1;
|
||||
std::memcpy(strDestination, strSource, lenSourceWithNull);
|
||||
std::memcpy(strDestination, strSource, lenSourceWithNull);
|
||||
return 0;
|
||||
}
|
||||
inline std::size_t strcat_s(
|
||||
@@ -210,11 +210,11 @@ namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
|
||||
const char *strSource
|
||||
)
|
||||
{
|
||||
std::size_t lenSourceWithNull = std::strlen(strSource) + 1;
|
||||
std::size_t lenDestination = std::strlen(strDestination);
|
||||
if (lenSourceWithNull + lenDestination > sizeInBytes)
|
||||
std::size_t lenSourceWithNull = std::strlen(strSource) + 1;
|
||||
std::size_t lenDestination = std::strlen(strDestination);
|
||||
if (lenSourceWithNull + lenDestination > sizeInBytes)
|
||||
return 1;
|
||||
std::memcpy(strDestination + lenDestination, strSource, lenSourceWithNull);
|
||||
std::memcpy(strDestination + lenDestination, strSource, lenSourceWithNull);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@ A marked parenthesis.
|
||||
struct re_brace : public re_syntax_base
|
||||
{
|
||||
// The index to match, can be zero (don't mark the sub-expression)
|
||||
// or negative (for perl style (?...) extentions):
|
||||
// or negative (for perl style (?...) extensions):
|
||||
int index;
|
||||
bool icase;
|
||||
};
|
||||
|
||||
@@ -50,7 +50,7 @@ struct sub_match : public std::pair<BidiIterator, BidiIterator>
|
||||
sub_match() : std::pair<BidiIterator, BidiIterator>(), matched(false) {}
|
||||
sub_match(BidiIterator i) : std::pair<BidiIterator, BidiIterator>(i, i), matched(false) {}
|
||||
#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
|
||||
&& !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)\
|
||||
&& !BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x0551)\
|
||||
&& !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042))
|
||||
template <class T, class A>
|
||||
operator std::basic_string<value_type, T, A> ()const
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#ifndef BOOST_REGEX_V4_U32REGEX_TOKEN_ITERATOR_HPP
|
||||
#define BOOST_REGEX_V4_U32REGEX_TOKEN_ITERATOR_HPP
|
||||
|
||||
#if (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
|
||||
#if (BOOST_WORKAROUND(BOOST_BORLANDC, >= 0x560) && BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x570)))\
|
||||
|| BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
|
||||
//
|
||||
// Borland C++ Builder 6, and Visual C++ 6,
|
||||
|
||||
871
linx64/include/boost/regex/v4/unicode_iterator.hpp
Normal file
871
linx64/include/boost/regex/v4/unicode_iterator.hpp
Normal file
@@ -0,0 +1,871 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2004
|
||||
* John Maddock
|
||||
*
|
||||
* Use, modification and distribution are subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying file
|
||||
* LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* LOCATION: see http://www.boost.org for most recent version.
|
||||
* FILE unicode_iterator.hpp
|
||||
* VERSION see <boost/version.hpp>
|
||||
* DESCRIPTION: Iterator adapters for converting between different Unicode encodings.
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Contents:
|
||||
~~~~~~~~~
|
||||
|
||||
1) Read Only, Input Adapters:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
template <class BaseIterator, class U8Type = ::boost::uint8_t>
|
||||
class u32_to_u8_iterator;
|
||||
|
||||
Adapts sequence of UTF-32 code points to "look like" a sequence of UTF-8.
|
||||
|
||||
template <class BaseIterator, class U32Type = ::boost::uint32_t>
|
||||
class u8_to_u32_iterator;
|
||||
|
||||
Adapts sequence of UTF-8 code points to "look like" a sequence of UTF-32.
|
||||
|
||||
template <class BaseIterator, class U16Type = ::boost::uint16_t>
|
||||
class u32_to_u16_iterator;
|
||||
|
||||
Adapts sequence of UTF-32 code points to "look like" a sequence of UTF-16.
|
||||
|
||||
template <class BaseIterator, class U32Type = ::boost::uint32_t>
|
||||
class u16_to_u32_iterator;
|
||||
|
||||
Adapts sequence of UTF-16 code points to "look like" a sequence of UTF-32.
|
||||
|
||||
2) Single pass output iterator adapters:
|
||||
|
||||
template <class BaseIterator>
|
||||
class utf8_output_iterator;
|
||||
|
||||
Accepts UTF-32 code points and forwards them on as UTF-8 code points.
|
||||
|
||||
template <class BaseIterator>
|
||||
class utf16_output_iterator;
|
||||
|
||||
Accepts UTF-32 code points and forwards them on as UTF-16 code points.
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef BOOST_REGEX_V4_UNICODE_ITERATOR_HPP
|
||||
#define BOOST_REGEX_V4_UNICODE_ITERATOR_HPP
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/regex/config.hpp>
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <stdexcept>
|
||||
#ifndef BOOST_NO_STD_LOCALE
|
||||
#include <sstream>
|
||||
#include <ios>
|
||||
#endif
|
||||
#include <limits.h> // CHAR_BIT
|
||||
|
||||
#ifdef BOOST_REGEX_CXX03
|
||||
|
||||
#else
|
||||
#endif
|
||||
|
||||
namespace boost{
|
||||
|
||||
namespace detail{
|
||||
|
||||
static const ::boost::uint16_t high_surrogate_base = 0xD7C0u;
|
||||
static const ::boost::uint16_t low_surrogate_base = 0xDC00u;
|
||||
static const ::boost::uint32_t ten_bit_mask = 0x3FFu;
|
||||
|
||||
inline bool is_high_surrogate(::boost::uint16_t v)
|
||||
{
|
||||
return (v & 0xFFFFFC00u) == 0xd800u;
|
||||
}
|
||||
inline bool is_low_surrogate(::boost::uint16_t v)
|
||||
{
|
||||
return (v & 0xFFFFFC00u) == 0xdc00u;
|
||||
}
|
||||
template <class T>
|
||||
inline bool is_surrogate(T v)
|
||||
{
|
||||
return (v & 0xFFFFF800u) == 0xd800;
|
||||
}
|
||||
|
||||
inline unsigned utf8_byte_count(boost::uint8_t c)
|
||||
{
|
||||
// if the most significant bit with a zero in it is in position
|
||||
// 8-N then there are N bytes in this UTF-8 sequence:
|
||||
boost::uint8_t mask = 0x80u;
|
||||
unsigned result = 0;
|
||||
while(c & mask)
|
||||
{
|
||||
++result;
|
||||
mask >>= 1;
|
||||
}
|
||||
return (result == 0) ? 1 : ((result > 4) ? 4 : result);
|
||||
}
|
||||
|
||||
inline unsigned utf8_trailing_byte_count(boost::uint8_t c)
|
||||
{
|
||||
return utf8_byte_count(c) - 1;
|
||||
}
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4100)
|
||||
#endif
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
BOOST_NORETURN
|
||||
#endif
|
||||
inline void invalid_utf32_code_point(::boost::uint32_t val)
|
||||
{
|
||||
#ifndef BOOST_NO_STD_LOCALE
|
||||
std::stringstream ss;
|
||||
ss << "Invalid UTF-32 code point U+" << std::showbase << std::hex << val << " encountered while trying to encode UTF-16 sequence";
|
||||
std::out_of_range e(ss.str());
|
||||
#else
|
||||
std::out_of_range e("Invalid UTF-32 code point encountered while trying to encode UTF-16 sequence");
|
||||
#endif
|
||||
boost::throw_exception(e);
|
||||
}
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <class BaseIterator, class U16Type = ::boost::uint16_t>
|
||||
class u32_to_u16_iterator
|
||||
{
|
||||
#if !defined(BOOST_NO_STD_ITERATOR_TRAITS)
|
||||
typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
|
||||
|
||||
BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 32);
|
||||
BOOST_STATIC_ASSERT(sizeof(U16Type)*CHAR_BIT == 16);
|
||||
#endif
|
||||
|
||||
public:
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef U16Type value_type;
|
||||
typedef value_type const* pointer;
|
||||
typedef value_type const reference;
|
||||
typedef std::bidirectional_iterator_tag iterator_category;
|
||||
|
||||
reference operator*()const
|
||||
{
|
||||
if(m_current == 2)
|
||||
extract_current();
|
||||
return m_values[m_current];
|
||||
}
|
||||
bool operator==(const u32_to_u16_iterator& that)const
|
||||
{
|
||||
if(m_position == that.m_position)
|
||||
{
|
||||
// Both m_currents must be equal, or both even
|
||||
// this is the same as saying their sum must be even:
|
||||
return (m_current + that.m_current) & 1u ? false : true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool operator!=(const u32_to_u16_iterator& that)const
|
||||
{
|
||||
return !(*this == that);
|
||||
}
|
||||
u32_to_u16_iterator& operator++()
|
||||
{
|
||||
// if we have a pending read then read now, so that we know whether
|
||||
// to skip a position, or move to a low-surrogate:
|
||||
if(m_current == 2)
|
||||
{
|
||||
// pending read:
|
||||
extract_current();
|
||||
}
|
||||
// move to the next surrogate position:
|
||||
++m_current;
|
||||
// if we've reached the end skip a position:
|
||||
if(m_values[m_current] == 0)
|
||||
{
|
||||
m_current = 2;
|
||||
++m_position;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
u32_to_u16_iterator operator++(int)
|
||||
{
|
||||
u32_to_u16_iterator r(*this);
|
||||
++(*this);
|
||||
return r;
|
||||
}
|
||||
u32_to_u16_iterator& operator--()
|
||||
{
|
||||
if(m_current != 1)
|
||||
{
|
||||
// decrementing an iterator always leads to a valid position:
|
||||
--m_position;
|
||||
extract_current();
|
||||
m_current = m_values[1] ? 1 : 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_current = 0;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
u32_to_u16_iterator operator--(int)
|
||||
{
|
||||
u32_to_u16_iterator r(*this);
|
||||
--(*this);
|
||||
return r;
|
||||
}
|
||||
BaseIterator base()const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
// construct:
|
||||
u32_to_u16_iterator() : m_position(), m_current(0)
|
||||
{
|
||||
m_values[0] = 0;
|
||||
m_values[1] = 0;
|
||||
m_values[2] = 0;
|
||||
}
|
||||
u32_to_u16_iterator(BaseIterator b) : m_position(b), m_current(2)
|
||||
{
|
||||
m_values[0] = 0;
|
||||
m_values[1] = 0;
|
||||
m_values[2] = 0;
|
||||
}
|
||||
private:
|
||||
|
||||
void extract_current()const
|
||||
{
|
||||
// begin by checking for a code point out of range:
|
||||
::boost::uint32_t v = *m_position;
|
||||
if(v >= 0x10000u)
|
||||
{
|
||||
if(v > 0x10FFFFu)
|
||||
detail::invalid_utf32_code_point(*m_position);
|
||||
// split into two surrogates:
|
||||
m_values[0] = static_cast<U16Type>(v >> 10) + detail::high_surrogate_base;
|
||||
m_values[1] = static_cast<U16Type>(v & detail::ten_bit_mask) + detail::low_surrogate_base;
|
||||
m_current = 0;
|
||||
BOOST_REGEX_ASSERT(detail::is_high_surrogate(m_values[0]));
|
||||
BOOST_REGEX_ASSERT(detail::is_low_surrogate(m_values[1]));
|
||||
}
|
||||
else
|
||||
{
|
||||
// 16-bit code point:
|
||||
m_values[0] = static_cast<U16Type>(*m_position);
|
||||
m_values[1] = 0;
|
||||
m_current = 0;
|
||||
// value must not be a surrogate:
|
||||
if(detail::is_surrogate(m_values[0]))
|
||||
detail::invalid_utf32_code_point(*m_position);
|
||||
}
|
||||
}
|
||||
BaseIterator m_position;
|
||||
mutable U16Type m_values[3];
|
||||
mutable unsigned m_current;
|
||||
};
|
||||
|
||||
template <class BaseIterator, class U32Type = ::boost::uint32_t>
|
||||
class u16_to_u32_iterator
|
||||
{
|
||||
// special values for pending iterator reads:
|
||||
BOOST_STATIC_CONSTANT(U32Type, pending_read = 0xffffffffu);
|
||||
|
||||
#if !defined(BOOST_NO_STD_ITERATOR_TRAITS)
|
||||
typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
|
||||
|
||||
BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 16);
|
||||
BOOST_STATIC_ASSERT(sizeof(U32Type)*CHAR_BIT == 32);
|
||||
#endif
|
||||
|
||||
public:
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef U32Type value_type;
|
||||
typedef value_type const* pointer;
|
||||
typedef value_type const reference;
|
||||
typedef std::bidirectional_iterator_tag iterator_category;
|
||||
|
||||
reference operator*()const
|
||||
{
|
||||
if(m_value == pending_read)
|
||||
extract_current();
|
||||
return m_value;
|
||||
}
|
||||
bool operator==(const u16_to_u32_iterator& that)const
|
||||
{
|
||||
return m_position == that.m_position;
|
||||
}
|
||||
bool operator!=(const u16_to_u32_iterator& that)const
|
||||
{
|
||||
return !(*this == that);
|
||||
}
|
||||
u16_to_u32_iterator& operator++()
|
||||
{
|
||||
// skip high surrogate first if there is one:
|
||||
if(detail::is_high_surrogate(*m_position)) ++m_position;
|
||||
++m_position;
|
||||
m_value = pending_read;
|
||||
return *this;
|
||||
}
|
||||
u16_to_u32_iterator operator++(int)
|
||||
{
|
||||
u16_to_u32_iterator r(*this);
|
||||
++(*this);
|
||||
return r;
|
||||
}
|
||||
u16_to_u32_iterator& operator--()
|
||||
{
|
||||
--m_position;
|
||||
// if we have a low surrogate then go back one more:
|
||||
if(detail::is_low_surrogate(*m_position))
|
||||
--m_position;
|
||||
m_value = pending_read;
|
||||
return *this;
|
||||
}
|
||||
u16_to_u32_iterator operator--(int)
|
||||
{
|
||||
u16_to_u32_iterator r(*this);
|
||||
--(*this);
|
||||
return r;
|
||||
}
|
||||
BaseIterator base()const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
// construct:
|
||||
u16_to_u32_iterator() : m_position()
|
||||
{
|
||||
m_value = pending_read;
|
||||
}
|
||||
u16_to_u32_iterator(BaseIterator b) : m_position(b)
|
||||
{
|
||||
m_value = pending_read;
|
||||
}
|
||||
//
|
||||
// Range checked version:
|
||||
//
|
||||
u16_to_u32_iterator(BaseIterator b, BaseIterator start, BaseIterator end) : m_position(b)
|
||||
{
|
||||
m_value = pending_read;
|
||||
//
|
||||
// The range must not start with a low surrogate, or end in a high surrogate,
|
||||
// otherwise we run the risk of running outside the underlying input range.
|
||||
// Likewise b must not be located at a low surrogate.
|
||||
//
|
||||
boost::uint16_t val;
|
||||
if(start != end)
|
||||
{
|
||||
if((b != start) && (b != end))
|
||||
{
|
||||
val = *b;
|
||||
if(detail::is_surrogate(val) && ((val & 0xFC00u) == 0xDC00u))
|
||||
invalid_code_point(val);
|
||||
}
|
||||
val = *start;
|
||||
if(detail::is_surrogate(val) && ((val & 0xFC00u) == 0xDC00u))
|
||||
invalid_code_point(val);
|
||||
val = *--end;
|
||||
if(detail::is_high_surrogate(val))
|
||||
invalid_code_point(val);
|
||||
}
|
||||
}
|
||||
private:
|
||||
static void invalid_code_point(::boost::uint16_t val)
|
||||
{
|
||||
#ifndef BOOST_NO_STD_LOCALE
|
||||
std::stringstream ss;
|
||||
ss << "Misplaced UTF-16 surrogate U+" << std::showbase << std::hex << val << " encountered while trying to encode UTF-32 sequence";
|
||||
std::out_of_range e(ss.str());
|
||||
#else
|
||||
std::out_of_range e("Misplaced UTF-16 surrogate encountered while trying to encode UTF-32 sequence");
|
||||
#endif
|
||||
boost::throw_exception(e);
|
||||
}
|
||||
void extract_current()const
|
||||
{
|
||||
m_value = static_cast<U32Type>(static_cast< ::boost::uint16_t>(*m_position));
|
||||
// if the last value is a high surrogate then adjust m_position and m_value as needed:
|
||||
if(detail::is_high_surrogate(*m_position))
|
||||
{
|
||||
// precondition; next value must have be a low-surrogate:
|
||||
BaseIterator next(m_position);
|
||||
::boost::uint16_t t = *++next;
|
||||
if((t & 0xFC00u) != 0xDC00u)
|
||||
invalid_code_point(t);
|
||||
m_value = (m_value - detail::high_surrogate_base) << 10;
|
||||
m_value |= (static_cast<U32Type>(static_cast< ::boost::uint16_t>(t)) & detail::ten_bit_mask);
|
||||
}
|
||||
// postcondition; result must not be a surrogate:
|
||||
if(detail::is_surrogate(m_value))
|
||||
invalid_code_point(static_cast< ::boost::uint16_t>(m_value));
|
||||
}
|
||||
BaseIterator m_position;
|
||||
mutable U32Type m_value;
|
||||
};
|
||||
|
||||
template <class BaseIterator, class U8Type = ::boost::uint8_t>
|
||||
class u32_to_u8_iterator
|
||||
{
|
||||
#if !defined(BOOST_NO_STD_ITERATOR_TRAITS)
|
||||
typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
|
||||
|
||||
BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 32);
|
||||
BOOST_STATIC_ASSERT(sizeof(U8Type)*CHAR_BIT == 8);
|
||||
#endif
|
||||
|
||||
public:
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef U8Type value_type;
|
||||
typedef value_type const* pointer;
|
||||
typedef value_type const reference;
|
||||
typedef std::bidirectional_iterator_tag iterator_category;
|
||||
|
||||
reference operator*()const
|
||||
{
|
||||
if(m_current == 4)
|
||||
extract_current();
|
||||
return m_values[m_current];
|
||||
}
|
||||
bool operator==(const u32_to_u8_iterator& that)const
|
||||
{
|
||||
if(m_position == that.m_position)
|
||||
{
|
||||
// either the m_current's must be equal, or one must be 0 and
|
||||
// the other 4: which means neither must have bits 1 or 2 set:
|
||||
return (m_current == that.m_current)
|
||||
|| (((m_current | that.m_current) & 3) == 0);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool operator!=(const u32_to_u8_iterator& that)const
|
||||
{
|
||||
return !(*this == that);
|
||||
}
|
||||
u32_to_u8_iterator& operator++()
|
||||
{
|
||||
// if we have a pending read then read now, so that we know whether
|
||||
// to skip a position, or move to a low-surrogate:
|
||||
if(m_current == 4)
|
||||
{
|
||||
// pending read:
|
||||
extract_current();
|
||||
}
|
||||
// move to the next surrogate position:
|
||||
++m_current;
|
||||
// if we've reached the end skip a position:
|
||||
if(m_values[m_current] == 0)
|
||||
{
|
||||
m_current = 4;
|
||||
++m_position;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
u32_to_u8_iterator operator++(int)
|
||||
{
|
||||
u32_to_u8_iterator r(*this);
|
||||
++(*this);
|
||||
return r;
|
||||
}
|
||||
u32_to_u8_iterator& operator--()
|
||||
{
|
||||
if((m_current & 3) == 0)
|
||||
{
|
||||
--m_position;
|
||||
extract_current();
|
||||
m_current = 3;
|
||||
while(m_current && (m_values[m_current] == 0))
|
||||
--m_current;
|
||||
}
|
||||
else
|
||||
--m_current;
|
||||
return *this;
|
||||
}
|
||||
u32_to_u8_iterator operator--(int)
|
||||
{
|
||||
u32_to_u8_iterator r(*this);
|
||||
--(*this);
|
||||
return r;
|
||||
}
|
||||
BaseIterator base()const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
// construct:
|
||||
u32_to_u8_iterator() : m_position(), m_current(0)
|
||||
{
|
||||
m_values[0] = 0;
|
||||
m_values[1] = 0;
|
||||
m_values[2] = 0;
|
||||
m_values[3] = 0;
|
||||
m_values[4] = 0;
|
||||
}
|
||||
u32_to_u8_iterator(BaseIterator b) : m_position(b), m_current(4)
|
||||
{
|
||||
m_values[0] = 0;
|
||||
m_values[1] = 0;
|
||||
m_values[2] = 0;
|
||||
m_values[3] = 0;
|
||||
m_values[4] = 0;
|
||||
}
|
||||
private:
|
||||
|
||||
void extract_current()const
|
||||
{
|
||||
boost::uint32_t c = *m_position;
|
||||
if(c > 0x10FFFFu)
|
||||
detail::invalid_utf32_code_point(c);
|
||||
if(c < 0x80u)
|
||||
{
|
||||
m_values[0] = static_cast<unsigned char>(c);
|
||||
m_values[1] = static_cast<unsigned char>(0u);
|
||||
m_values[2] = static_cast<unsigned char>(0u);
|
||||
m_values[3] = static_cast<unsigned char>(0u);
|
||||
}
|
||||
else if(c < 0x800u)
|
||||
{
|
||||
m_values[0] = static_cast<unsigned char>(0xC0u + (c >> 6));
|
||||
m_values[1] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
|
||||
m_values[2] = static_cast<unsigned char>(0u);
|
||||
m_values[3] = static_cast<unsigned char>(0u);
|
||||
}
|
||||
else if(c < 0x10000u)
|
||||
{
|
||||
m_values[0] = static_cast<unsigned char>(0xE0u + (c >> 12));
|
||||
m_values[1] = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
|
||||
m_values[2] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
|
||||
m_values[3] = static_cast<unsigned char>(0u);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_values[0] = static_cast<unsigned char>(0xF0u + (c >> 18));
|
||||
m_values[1] = static_cast<unsigned char>(0x80u + ((c >> 12) & 0x3Fu));
|
||||
m_values[2] = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
|
||||
m_values[3] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
|
||||
}
|
||||
m_current= 0;
|
||||
}
|
||||
BaseIterator m_position;
|
||||
mutable U8Type m_values[5];
|
||||
mutable unsigned m_current;
|
||||
};
|
||||
|
||||
template <class BaseIterator, class U32Type = ::boost::uint32_t>
|
||||
class u8_to_u32_iterator
|
||||
{
|
||||
// special values for pending iterator reads:
|
||||
BOOST_STATIC_CONSTANT(U32Type, pending_read = 0xffffffffu);
|
||||
|
||||
#if !defined(BOOST_NO_STD_ITERATOR_TRAITS)
|
||||
typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
|
||||
|
||||
BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 8);
|
||||
BOOST_STATIC_ASSERT(sizeof(U32Type)*CHAR_BIT == 32);
|
||||
#endif
|
||||
|
||||
public:
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef U32Type value_type;
|
||||
typedef value_type const* pointer;
|
||||
typedef value_type const reference;
|
||||
typedef std::bidirectional_iterator_tag iterator_category;
|
||||
|
||||
reference operator*()const
|
||||
{
|
||||
if(m_value == pending_read)
|
||||
extract_current();
|
||||
return m_value;
|
||||
}
|
||||
bool operator==(const u8_to_u32_iterator& that)const
|
||||
{
|
||||
return m_position == that.m_position;
|
||||
}
|
||||
bool operator!=(const u8_to_u32_iterator& that)const
|
||||
{
|
||||
return !(*this == that);
|
||||
}
|
||||
u8_to_u32_iterator& operator++()
|
||||
{
|
||||
// We must not start with a continuation character:
|
||||
if((static_cast<boost::uint8_t>(*m_position) & 0xC0) == 0x80)
|
||||
invalid_sequence();
|
||||
// skip high surrogate first if there is one:
|
||||
unsigned c = detail::utf8_byte_count(*m_position);
|
||||
if(m_value == pending_read)
|
||||
{
|
||||
// Since we haven't read in a value, we need to validate the code points:
|
||||
for(unsigned i = 0; i < c; ++i)
|
||||
{
|
||||
++m_position;
|
||||
// We must have a continuation byte:
|
||||
if((i != c - 1) && ((static_cast<boost::uint8_t>(*m_position) & 0xC0) != 0x80))
|
||||
invalid_sequence();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::advance(m_position, c);
|
||||
}
|
||||
m_value = pending_read;
|
||||
return *this;
|
||||
}
|
||||
u8_to_u32_iterator operator++(int)
|
||||
{
|
||||
u8_to_u32_iterator r(*this);
|
||||
++(*this);
|
||||
return r;
|
||||
}
|
||||
u8_to_u32_iterator& operator--()
|
||||
{
|
||||
// Keep backtracking until we don't have a trailing character:
|
||||
unsigned count = 0;
|
||||
while((*--m_position & 0xC0u) == 0x80u) ++count;
|
||||
// now check that the sequence was valid:
|
||||
if(count != detail::utf8_trailing_byte_count(*m_position))
|
||||
invalid_sequence();
|
||||
m_value = pending_read;
|
||||
return *this;
|
||||
}
|
||||
u8_to_u32_iterator operator--(int)
|
||||
{
|
||||
u8_to_u32_iterator r(*this);
|
||||
--(*this);
|
||||
return r;
|
||||
}
|
||||
BaseIterator base()const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
// construct:
|
||||
u8_to_u32_iterator() : m_position()
|
||||
{
|
||||
m_value = pending_read;
|
||||
}
|
||||
u8_to_u32_iterator(BaseIterator b) : m_position(b)
|
||||
{
|
||||
m_value = pending_read;
|
||||
}
|
||||
//
|
||||
// Checked constructor:
|
||||
//
|
||||
u8_to_u32_iterator(BaseIterator b, BaseIterator start, BaseIterator end) : m_position(b)
|
||||
{
|
||||
m_value = pending_read;
|
||||
//
|
||||
// We must not start with a continuation character, or end with a
|
||||
// truncated UTF-8 sequence otherwise we run the risk of going past
|
||||
// the start/end of the underlying sequence:
|
||||
//
|
||||
if(start != end)
|
||||
{
|
||||
unsigned char v = *start;
|
||||
if((v & 0xC0u) == 0x80u)
|
||||
invalid_sequence();
|
||||
if((b != start) && (b != end) && ((*b & 0xC0u) == 0x80u))
|
||||
invalid_sequence();
|
||||
BaseIterator pos = end;
|
||||
do
|
||||
{
|
||||
v = *--pos;
|
||||
}
|
||||
while((start != pos) && ((v & 0xC0u) == 0x80u));
|
||||
std::ptrdiff_t extra = detail::utf8_byte_count(v);
|
||||
if(std::distance(pos, end) < extra)
|
||||
invalid_sequence();
|
||||
}
|
||||
}
|
||||
private:
|
||||
static void invalid_sequence()
|
||||
{
|
||||
std::out_of_range e("Invalid UTF-8 sequence encountered while trying to encode UTF-32 character");
|
||||
boost::throw_exception(e);
|
||||
}
|
||||
void extract_current()const
|
||||
{
|
||||
m_value = static_cast<U32Type>(static_cast< ::boost::uint8_t>(*m_position));
|
||||
// we must not have a continuation character:
|
||||
if((m_value & 0xC0u) == 0x80u)
|
||||
invalid_sequence();
|
||||
// see how many extra bytes we have:
|
||||
unsigned extra = detail::utf8_trailing_byte_count(*m_position);
|
||||
// extract the extra bits, 6 from each extra byte:
|
||||
BaseIterator next(m_position);
|
||||
for(unsigned c = 0; c < extra; ++c)
|
||||
{
|
||||
++next;
|
||||
m_value <<= 6;
|
||||
// We must have a continuation byte:
|
||||
if((static_cast<boost::uint8_t>(*next) & 0xC0) != 0x80)
|
||||
invalid_sequence();
|
||||
m_value += static_cast<boost::uint8_t>(*next) & 0x3Fu;
|
||||
}
|
||||
// we now need to remove a few of the leftmost bits, but how many depends
|
||||
// upon how many extra bytes we've extracted:
|
||||
static const boost::uint32_t masks[4] =
|
||||
{
|
||||
0x7Fu,
|
||||
0x7FFu,
|
||||
0xFFFFu,
|
||||
0x1FFFFFu,
|
||||
};
|
||||
m_value &= masks[extra];
|
||||
// check the result is in range:
|
||||
if(m_value > static_cast<U32Type>(0x10FFFFu))
|
||||
invalid_sequence();
|
||||
// The result must not be a surrogate:
|
||||
if((m_value >= static_cast<U32Type>(0xD800)) && (m_value <= static_cast<U32Type>(0xDFFF)))
|
||||
invalid_sequence();
|
||||
// We should not have had an invalidly encoded UTF8 sequence:
|
||||
if((extra > 0) && (m_value <= static_cast<U32Type>(masks[extra - 1])))
|
||||
invalid_sequence();
|
||||
}
|
||||
BaseIterator m_position;
|
||||
mutable U32Type m_value;
|
||||
};
|
||||
|
||||
template <class BaseIterator>
|
||||
class utf16_output_iterator
|
||||
{
|
||||
public:
|
||||
typedef void difference_type;
|
||||
typedef void value_type;
|
||||
typedef boost::uint32_t* pointer;
|
||||
typedef boost::uint32_t& reference;
|
||||
typedef std::output_iterator_tag iterator_category;
|
||||
|
||||
utf16_output_iterator(const BaseIterator& b)
|
||||
: m_position(b){}
|
||||
utf16_output_iterator(const utf16_output_iterator& that)
|
||||
: m_position(that.m_position){}
|
||||
utf16_output_iterator& operator=(const utf16_output_iterator& that)
|
||||
{
|
||||
m_position = that.m_position;
|
||||
return *this;
|
||||
}
|
||||
const utf16_output_iterator& operator*()const
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
void operator=(boost::uint32_t val)const
|
||||
{
|
||||
push(val);
|
||||
}
|
||||
utf16_output_iterator& operator++()
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
utf16_output_iterator& operator++(int)
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
BaseIterator base()const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
private:
|
||||
void push(boost::uint32_t v)const
|
||||
{
|
||||
if(v >= 0x10000u)
|
||||
{
|
||||
// begin by checking for a code point out of range:
|
||||
if(v > 0x10FFFFu)
|
||||
detail::invalid_utf32_code_point(v);
|
||||
// split into two surrogates:
|
||||
*m_position++ = static_cast<boost::uint16_t>(v >> 10) + detail::high_surrogate_base;
|
||||
*m_position++ = static_cast<boost::uint16_t>(v & detail::ten_bit_mask) + detail::low_surrogate_base;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 16-bit code point:
|
||||
// value must not be a surrogate:
|
||||
if(detail::is_surrogate(v))
|
||||
detail::invalid_utf32_code_point(v);
|
||||
*m_position++ = static_cast<boost::uint16_t>(v);
|
||||
}
|
||||
}
|
||||
mutable BaseIterator m_position;
|
||||
};
|
||||
|
||||
template <class BaseIterator>
|
||||
class utf8_output_iterator
|
||||
{
|
||||
public:
|
||||
typedef void difference_type;
|
||||
typedef void value_type;
|
||||
typedef boost::uint32_t* pointer;
|
||||
typedef boost::uint32_t& reference;
|
||||
typedef std::output_iterator_tag iterator_category;
|
||||
|
||||
utf8_output_iterator(const BaseIterator& b)
|
||||
: m_position(b){}
|
||||
utf8_output_iterator(const utf8_output_iterator& that)
|
||||
: m_position(that.m_position){}
|
||||
utf8_output_iterator& operator=(const utf8_output_iterator& that)
|
||||
{
|
||||
m_position = that.m_position;
|
||||
return *this;
|
||||
}
|
||||
const utf8_output_iterator& operator*()const
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
void operator=(boost::uint32_t val)const
|
||||
{
|
||||
push(val);
|
||||
}
|
||||
utf8_output_iterator& operator++()
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
utf8_output_iterator& operator++(int)
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
BaseIterator base()const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
private:
|
||||
void push(boost::uint32_t c)const
|
||||
{
|
||||
if(c > 0x10FFFFu)
|
||||
detail::invalid_utf32_code_point(c);
|
||||
if(c < 0x80u)
|
||||
{
|
||||
*m_position++ = static_cast<unsigned char>(c);
|
||||
}
|
||||
else if(c < 0x800u)
|
||||
{
|
||||
*m_position++ = static_cast<unsigned char>(0xC0u + (c >> 6));
|
||||
*m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
|
||||
}
|
||||
else if(c < 0x10000u)
|
||||
{
|
||||
*m_position++ = static_cast<unsigned char>(0xE0u + (c >> 12));
|
||||
*m_position++ = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
|
||||
*m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
|
||||
}
|
||||
else
|
||||
{
|
||||
*m_position++ = static_cast<unsigned char>(0xF0u + (c >> 18));
|
||||
*m_position++ = static_cast<unsigned char>(0x80u + ((c >> 12) & 0x3Fu));
|
||||
*m_position++ = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
|
||||
*m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
|
||||
}
|
||||
}
|
||||
mutable BaseIterator m_position;
|
||||
};
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_REGEX_UNICODE_ITERATOR_HPP
|
||||
|
||||
@@ -34,9 +34,18 @@
|
||||
#include <boost/regex/v4/primary_transform.hpp>
|
||||
#endif
|
||||
#ifndef BOOST_REGEX_OBJECT_CACHE_HPP
|
||||
#include <boost/regex/pending/object_cache.hpp>
|
||||
#include <boost/regex/v4/object_cache.hpp>
|
||||
#endif
|
||||
|
||||
#define VC_EXTRALEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
||||
#if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(UNDER_CE)
|
||||
#pragma comment(lib, "user32.lib")
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
@@ -75,53 +84,35 @@ typedef ::boost::shared_ptr<void> cat_type; // placeholder for dll HANDLE.
|
||||
//
|
||||
// then add wrappers around the actual Win32 API's (ie implementation hiding):
|
||||
//
|
||||
BOOST_REGEX_DECL lcid_type BOOST_REGEX_CALL w32_get_default_locale();
|
||||
BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_lower(char, lcid_type);
|
||||
lcid_type BOOST_REGEX_CALL w32_get_default_locale();
|
||||
bool BOOST_REGEX_CALL w32_is_lower(char, lcid_type);
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_lower(wchar_t, lcid_type);
|
||||
#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
|
||||
BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_lower(unsigned short ca, lcid_type state_id);
|
||||
bool BOOST_REGEX_CALL w32_is_lower(wchar_t, lcid_type);
|
||||
#endif
|
||||
#endif
|
||||
BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_upper(char, lcid_type);
|
||||
bool BOOST_REGEX_CALL w32_is_upper(char, lcid_type);
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_upper(wchar_t, lcid_type);
|
||||
#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
|
||||
BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_upper(unsigned short ca, lcid_type state_id);
|
||||
bool BOOST_REGEX_CALL w32_is_upper(wchar_t, lcid_type);
|
||||
#endif
|
||||
#endif
|
||||
BOOST_REGEX_DECL cat_type BOOST_REGEX_CALL w32_cat_open(const std::string& name);
|
||||
BOOST_REGEX_DECL std::string BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type state_id, int i, const std::string& def);
|
||||
cat_type BOOST_REGEX_CALL w32_cat_open(const std::string& name);
|
||||
std::string BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type state_id, int i, const std::string& def);
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
BOOST_REGEX_DECL std::wstring BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type state_id, int i, const std::wstring& def);
|
||||
#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
|
||||
BOOST_REGEX_DECL std::basic_string<unsigned short> BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type, int i, const std::basic_string<unsigned short>& def);
|
||||
std::wstring BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type state_id, int i, const std::wstring& def);
|
||||
#endif
|
||||
#endif
|
||||
BOOST_REGEX_DECL std::string BOOST_REGEX_CALL w32_transform(lcid_type state_id, const char* p1, const char* p2);
|
||||
std::string BOOST_REGEX_CALL w32_transform(lcid_type state_id, const char* p1, const char* p2);
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
BOOST_REGEX_DECL std::wstring BOOST_REGEX_CALL w32_transform(lcid_type state_id, const wchar_t* p1, const wchar_t* p2);
|
||||
#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
|
||||
BOOST_REGEX_DECL std::basic_string<unsigned short> BOOST_REGEX_CALL w32_transform(lcid_type state_id, const unsigned short* p1, const unsigned short* p2);
|
||||
std::wstring BOOST_REGEX_CALL w32_transform(lcid_type state_id, const wchar_t* p1, const wchar_t* p2);
|
||||
#endif
|
||||
#endif
|
||||
BOOST_REGEX_DECL char BOOST_REGEX_CALL w32_tolower(char c, lcid_type);
|
||||
char BOOST_REGEX_CALL w32_tolower(char c, lcid_type);
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
BOOST_REGEX_DECL wchar_t BOOST_REGEX_CALL w32_tolower(wchar_t c, lcid_type);
|
||||
#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
|
||||
BOOST_REGEX_DECL unsigned short BOOST_REGEX_CALL w32_tolower(unsigned short c, lcid_type state_id);
|
||||
wchar_t BOOST_REGEX_CALL w32_tolower(wchar_t c, lcid_type);
|
||||
#endif
|
||||
#endif
|
||||
BOOST_REGEX_DECL char BOOST_REGEX_CALL w32_toupper(char c, lcid_type);
|
||||
char BOOST_REGEX_CALL w32_toupper(char c, lcid_type);
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
BOOST_REGEX_DECL wchar_t BOOST_REGEX_CALL w32_toupper(wchar_t c, lcid_type);
|
||||
wchar_t BOOST_REGEX_CALL w32_toupper(wchar_t c, lcid_type);
|
||||
#endif
|
||||
BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is(lcid_type, boost::uint32_t mask, char c);
|
||||
bool BOOST_REGEX_CALL w32_is(lcid_type, boost::uint32_t mask, char c);
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is(lcid_type, boost::uint32_t mask, wchar_t c);
|
||||
#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
|
||||
BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is(lcid_type state_id, boost::uint32_t m, unsigned short c);
|
||||
#endif
|
||||
bool BOOST_REGEX_CALL w32_is(lcid_type, boost::uint32_t mask, wchar_t c);
|
||||
#endif
|
||||
//
|
||||
// class w32_regex_traits_base:
|
||||
@@ -253,14 +244,14 @@ typename w32_regex_traits_char_layer<charT>::string_type
|
||||
// specialised version for narrow characters:
|
||||
//
|
||||
template <>
|
||||
class BOOST_REGEX_DECL w32_regex_traits_char_layer<char> : public w32_regex_traits_base<char>
|
||||
class w32_regex_traits_char_layer<char> : public w32_regex_traits_base<char>
|
||||
{
|
||||
typedef std::string string_type;
|
||||
public:
|
||||
w32_regex_traits_char_layer(::boost::BOOST_REGEX_DETAIL_NS::lcid_type l)
|
||||
: w32_regex_traits_base<char>(l)
|
||||
{
|
||||
init();
|
||||
init<char>();
|
||||
}
|
||||
|
||||
regex_constants::syntax_type syntax_type(char c)const
|
||||
@@ -284,6 +275,7 @@ private:
|
||||
regex_constants::syntax_type m_char_map[1u << CHAR_BIT];
|
||||
char m_lower_map[1u << CHAR_BIT];
|
||||
boost::uint16_t m_type_map[1u << CHAR_BIT];
|
||||
template <class U>
|
||||
void init();
|
||||
};
|
||||
|
||||
@@ -403,7 +395,7 @@ typename w32_regex_traits_implementation<charT>::string_type
|
||||
return pos->second;
|
||||
}
|
||||
#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
|
||||
&& !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)
|
||||
&& !BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x0551)
|
||||
std::string name(p1, p2);
|
||||
#else
|
||||
std::string name;
|
||||
@@ -413,7 +405,7 @@ typename w32_regex_traits_implementation<charT>::string_type
|
||||
#endif
|
||||
name = lookup_default_collate_name(name);
|
||||
#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
|
||||
&& !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)
|
||||
&& !BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x0551)
|
||||
if(name.size())
|
||||
return string_type(name.begin(), name.end());
|
||||
#else
|
||||
@@ -546,7 +538,7 @@ typename w32_regex_traits_implementation<charT>::char_class_type
|
||||
if(pos != m_custom_class_names.end())
|
||||
return pos->second;
|
||||
}
|
||||
std::size_t state_id = 1 + BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
|
||||
std::size_t state_id = 1u + (std::size_t)BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
|
||||
if(state_id < sizeof(masks) / sizeof(masks[0]))
|
||||
return masks[state_id];
|
||||
return masks[0];
|
||||
@@ -722,6 +714,498 @@ static_mutex& w32_regex_traits<charT>::get_mutex_inst()
|
||||
}
|
||||
#endif
|
||||
|
||||
namespace BOOST_REGEX_DETAIL_NS {
|
||||
|
||||
#ifdef BOOST_NO_ANSI_APIS
|
||||
inline UINT get_code_page_for_locale_id(lcid_type idx)
|
||||
{
|
||||
WCHAR code_page_string[7];
|
||||
if (::GetLocaleInfoW(idx, LOCALE_IDEFAULTANSICODEPAGE, code_page_string, 7) == 0)
|
||||
return 0;
|
||||
|
||||
return static_cast<UINT>(_wtol(code_page_string));
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class U>
|
||||
inline void w32_regex_traits_char_layer<char>::init()
|
||||
{
|
||||
// we need to start by initialising our syntax map so we know which
|
||||
// character is used for which purpose:
|
||||
std::memset(m_char_map, 0, sizeof(m_char_map));
|
||||
cat_type cat;
|
||||
std::string cat_name(w32_regex_traits<char>::get_catalog_name());
|
||||
if (cat_name.size())
|
||||
{
|
||||
cat = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_open(cat_name);
|
||||
if (!cat)
|
||||
{
|
||||
std::string m("Unable to open message catalog: ");
|
||||
std::runtime_error err(m + cat_name);
|
||||
::boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
|
||||
}
|
||||
}
|
||||
//
|
||||
// if we have a valid catalog then load our messages:
|
||||
//
|
||||
if (cat)
|
||||
{
|
||||
for (regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
|
||||
{
|
||||
string_type mss = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_get(cat, this->m_locale, i, get_default_syntax(i));
|
||||
for (string_type::size_type j = 0; j < mss.size(); ++j)
|
||||
{
|
||||
m_char_map[static_cast<unsigned char>(mss[j])] = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
|
||||
{
|
||||
const char* ptr = get_default_syntax(i);
|
||||
while (ptr && *ptr)
|
||||
{
|
||||
m_char_map[static_cast<unsigned char>(*ptr)] = i;
|
||||
++ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// finish off by calculating our escape types:
|
||||
//
|
||||
unsigned char i = 'A';
|
||||
do
|
||||
{
|
||||
if (m_char_map[i] == 0)
|
||||
{
|
||||
if (::boost::BOOST_REGEX_DETAIL_NS::w32_is(this->m_locale, 0x0002u, (char)i))
|
||||
m_char_map[i] = regex_constants::escape_type_class;
|
||||
else if (::boost::BOOST_REGEX_DETAIL_NS::w32_is(this->m_locale, 0x0001u, (char)i))
|
||||
m_char_map[i] = regex_constants::escape_type_not_class;
|
||||
}
|
||||
} while (0xFF != i++);
|
||||
|
||||
//
|
||||
// fill in lower case map:
|
||||
//
|
||||
char char_map[1 << CHAR_BIT];
|
||||
for (int ii = 0; ii < (1 << CHAR_BIT); ++ii)
|
||||
char_map[ii] = static_cast<char>(ii);
|
||||
#ifndef BOOST_NO_ANSI_APIS
|
||||
int r = ::LCMapStringA(this->m_locale, LCMAP_LOWERCASE, char_map, 1 << CHAR_BIT, this->m_lower_map, 1 << CHAR_BIT);
|
||||
BOOST_REGEX_ASSERT(r != 0);
|
||||
#else
|
||||
UINT code_page = get_code_page_for_locale_id(this->m_locale);
|
||||
BOOST_REGEX_ASSERT(code_page != 0);
|
||||
|
||||
WCHAR wide_char_map[1 << CHAR_BIT];
|
||||
int conv_r = ::MultiByteToWideChar(code_page, 0, char_map, 1 << CHAR_BIT, wide_char_map, 1 << CHAR_BIT);
|
||||
BOOST_REGEX_ASSERT(conv_r != 0);
|
||||
|
||||
WCHAR wide_lower_map[1 << CHAR_BIT];
|
||||
int r = ::LCMapStringW(this->m_locale, LCMAP_LOWERCASE, wide_char_map, 1 << CHAR_BIT, wide_lower_map, 1 << CHAR_BIT);
|
||||
BOOST_REGEX_ASSERT(r != 0);
|
||||
|
||||
conv_r = ::WideCharToMultiByte(code_page, 0, wide_lower_map, r, this->m_lower_map, 1 << CHAR_BIT, NULL, NULL);
|
||||
BOOST_REGEX_ASSERT(conv_r != 0);
|
||||
#endif
|
||||
if (r < (1 << CHAR_BIT))
|
||||
{
|
||||
// if we have multibyte characters then not all may have been given
|
||||
// a lower case mapping:
|
||||
for (int jj = r; jj < (1 << CHAR_BIT); ++jj)
|
||||
this->m_lower_map[jj] = static_cast<char>(jj);
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_ANSI_APIS
|
||||
r = ::GetStringTypeExA(this->m_locale, CT_CTYPE1, char_map, 1 << CHAR_BIT, this->m_type_map);
|
||||
#else
|
||||
r = ::GetStringTypeExW(this->m_locale, CT_CTYPE1, wide_char_map, 1 << CHAR_BIT, this->m_type_map);
|
||||
#endif
|
||||
BOOST_REGEX_ASSERT(0 != r);
|
||||
}
|
||||
|
||||
inline lcid_type BOOST_REGEX_CALL w32_get_default_locale()
|
||||
{
|
||||
return ::GetUserDefaultLCID();
|
||||
}
|
||||
|
||||
inline bool BOOST_REGEX_CALL w32_is_lower(char c, lcid_type idx)
|
||||
{
|
||||
#ifndef BOOST_NO_ANSI_APIS
|
||||
WORD mask;
|
||||
if (::GetStringTypeExA(idx, CT_CTYPE1, &c, 1, &mask) && (mask & C1_LOWER))
|
||||
return true;
|
||||
return false;
|
||||
#else
|
||||
UINT code_page = get_code_page_for_locale_id(idx);
|
||||
if (code_page == 0)
|
||||
return false;
|
||||
|
||||
WCHAR wide_c;
|
||||
if (::MultiByteToWideChar(code_page, 0, &c, 1, &wide_c, 1) == 0)
|
||||
return false;
|
||||
|
||||
WORD mask;
|
||||
if (::GetStringTypeExW(idx, CT_CTYPE1, &wide_c, 1, &mask) && (mask & C1_LOWER))
|
||||
return true;
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline bool BOOST_REGEX_CALL w32_is_lower(wchar_t c, lcid_type idx)
|
||||
{
|
||||
WORD mask;
|
||||
if (::GetStringTypeExW(idx, CT_CTYPE1, &c, 1, &mask) && (mask & C1_LOWER))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool BOOST_REGEX_CALL w32_is_upper(char c, lcid_type idx)
|
||||
{
|
||||
#ifndef BOOST_NO_ANSI_APIS
|
||||
WORD mask;
|
||||
if (::GetStringTypeExA(idx, CT_CTYPE1, &c, 1, &mask) && (mask & C1_UPPER))
|
||||
return true;
|
||||
return false;
|
||||
#else
|
||||
UINT code_page = get_code_page_for_locale_id(idx);
|
||||
if (code_page == 0)
|
||||
return false;
|
||||
|
||||
WCHAR wide_c;
|
||||
if (::MultiByteToWideChar(code_page, 0, &c, 1, &wide_c, 1) == 0)
|
||||
return false;
|
||||
|
||||
WORD mask;
|
||||
if (::GetStringTypeExW(idx, CT_CTYPE1, &wide_c, 1, &mask) && (mask & C1_UPPER))
|
||||
return true;
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline bool BOOST_REGEX_CALL w32_is_upper(wchar_t c, lcid_type idx)
|
||||
{
|
||||
WORD mask;
|
||||
if (::GetStringTypeExW(idx, CT_CTYPE1, &c, 1, &mask) && (mask & C1_UPPER))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
inline void free_module(void* mod)
|
||||
{
|
||||
::FreeLibrary(static_cast<HMODULE>(mod));
|
||||
}
|
||||
|
||||
inline cat_type BOOST_REGEX_CALL w32_cat_open(const std::string& name)
|
||||
{
|
||||
#ifndef BOOST_NO_ANSI_APIS
|
||||
cat_type result(::LoadLibraryA(name.c_str()), &free_module);
|
||||
return result;
|
||||
#else
|
||||
LPWSTR wide_name = (LPWSTR)_alloca((name.size() + 1) * sizeof(WCHAR));
|
||||
if (::MultiByteToWideChar(CP_ACP, 0, name.c_str(), name.size(), wide_name, name.size() + 1) == 0)
|
||||
return cat_type();
|
||||
|
||||
cat_type result(::LoadLibraryW(wide_name), &free_module);
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline std::string BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type, int i, const std::string& def)
|
||||
{
|
||||
#ifndef BOOST_NO_ANSI_APIS
|
||||
char buf[256];
|
||||
if (0 == ::LoadStringA(
|
||||
static_cast<HMODULE>(cat.get()),
|
||||
i,
|
||||
buf,
|
||||
256
|
||||
))
|
||||
{
|
||||
return def;
|
||||
}
|
||||
#else
|
||||
WCHAR wbuf[256];
|
||||
int r = ::LoadStringW(
|
||||
static_cast<HMODULE>(cat.get()),
|
||||
i,
|
||||
wbuf,
|
||||
256
|
||||
);
|
||||
if (r == 0)
|
||||
return def;
|
||||
|
||||
|
||||
int buf_size = 1 + ::WideCharToMultiByte(CP_ACP, 0, wbuf, r, NULL, 0, NULL, NULL);
|
||||
LPSTR buf = (LPSTR)_alloca(buf_size);
|
||||
if (::WideCharToMultiByte(CP_ACP, 0, wbuf, r, buf, buf_size, NULL, NULL) == 0)
|
||||
return def; // failed conversion.
|
||||
#endif
|
||||
return std::string(buf);
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
inline std::wstring BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type, int i, const std::wstring& def)
|
||||
{
|
||||
wchar_t buf[256];
|
||||
if (0 == ::LoadStringW(
|
||||
static_cast<HMODULE>(cat.get()),
|
||||
i,
|
||||
buf,
|
||||
256
|
||||
))
|
||||
{
|
||||
return def;
|
||||
}
|
||||
return std::wstring(buf);
|
||||
}
|
||||
#endif
|
||||
inline std::string BOOST_REGEX_CALL w32_transform(lcid_type idx, const char* p1, const char* p2)
|
||||
{
|
||||
#ifndef BOOST_NO_ANSI_APIS
|
||||
int bytes = ::LCMapStringA(
|
||||
idx, // locale identifier
|
||||
LCMAP_SORTKEY, // mapping transformation type
|
||||
p1, // source string
|
||||
static_cast<int>(p2 - p1), // number of characters in source string
|
||||
0, // destination buffer
|
||||
0 // size of destination buffer
|
||||
);
|
||||
if (!bytes)
|
||||
return std::string(p1, p2);
|
||||
std::string result(++bytes, '\0');
|
||||
bytes = ::LCMapStringA(
|
||||
idx, // locale identifier
|
||||
LCMAP_SORTKEY, // mapping transformation type
|
||||
p1, // source string
|
||||
static_cast<int>(p2 - p1), // number of characters in source string
|
||||
&*result.begin(), // destination buffer
|
||||
bytes // size of destination buffer
|
||||
);
|
||||
#else
|
||||
UINT code_page = get_code_page_for_locale_id(idx);
|
||||
if (code_page == 0)
|
||||
return std::string(p1, p2);
|
||||
|
||||
int src_len = static_cast<int>(p2 - p1);
|
||||
LPWSTR wide_p1 = (LPWSTR)_alloca((src_len + 1) * 2);
|
||||
if (::MultiByteToWideChar(code_page, 0, p1, src_len, wide_p1, src_len + 1) == 0)
|
||||
return std::string(p1, p2);
|
||||
|
||||
int bytes = ::LCMapStringW(
|
||||
idx, // locale identifier
|
||||
LCMAP_SORTKEY, // mapping transformation type
|
||||
wide_p1, // source string
|
||||
src_len, // number of characters in source string
|
||||
0, // destination buffer
|
||||
0 // size of destination buffer
|
||||
);
|
||||
if (!bytes)
|
||||
return std::string(p1, p2);
|
||||
std::string result(++bytes, '\0');
|
||||
bytes = ::LCMapStringW(
|
||||
idx, // locale identifier
|
||||
LCMAP_SORTKEY, // mapping transformation type
|
||||
wide_p1, // source string
|
||||
src_len, // number of characters in source string
|
||||
(LPWSTR) & *result.begin(), // destination buffer
|
||||
bytes // size of destination buffer
|
||||
);
|
||||
#endif
|
||||
if (bytes > static_cast<int>(result.size()))
|
||||
return std::string(p1, p2);
|
||||
while (result.size() && result[result.size() - 1] == '\0')
|
||||
{
|
||||
result.erase(result.size() - 1);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
inline std::wstring BOOST_REGEX_CALL w32_transform(lcid_type idx, const wchar_t* p1, const wchar_t* p2)
|
||||
{
|
||||
int bytes = ::LCMapStringW(
|
||||
idx, // locale identifier
|
||||
LCMAP_SORTKEY, // mapping transformation type
|
||||
p1, // source string
|
||||
static_cast<int>(p2 - p1), // number of characters in source string
|
||||
0, // destination buffer
|
||||
0 // size of destination buffer
|
||||
);
|
||||
if (!bytes)
|
||||
return std::wstring(p1, p2);
|
||||
std::string result(++bytes, '\0');
|
||||
bytes = ::LCMapStringW(
|
||||
idx, // locale identifier
|
||||
LCMAP_SORTKEY, // mapping transformation type
|
||||
p1, // source string
|
||||
static_cast<int>(p2 - p1), // number of characters in source string
|
||||
reinterpret_cast<wchar_t*>(&*result.begin()), // destination buffer *of bytes*
|
||||
bytes // size of destination buffer
|
||||
);
|
||||
if (bytes > static_cast<int>(result.size()))
|
||||
return std::wstring(p1, p2);
|
||||
while (result.size() && result[result.size() - 1] == L'\0')
|
||||
{
|
||||
result.erase(result.size() - 1);
|
||||
}
|
||||
std::wstring r2;
|
||||
for (std::string::size_type i = 0; i < result.size(); ++i)
|
||||
r2.append(1, static_cast<wchar_t>(static_cast<unsigned char>(result[i])));
|
||||
return r2;
|
||||
}
|
||||
#endif
|
||||
inline char BOOST_REGEX_CALL w32_tolower(char c, lcid_type idx)
|
||||
{
|
||||
char result[2];
|
||||
#ifndef BOOST_NO_ANSI_APIS
|
||||
int b = ::LCMapStringA(
|
||||
idx, // locale identifier
|
||||
LCMAP_LOWERCASE, // mapping transformation type
|
||||
&c, // source string
|
||||
1, // number of characters in source string
|
||||
result, // destination buffer
|
||||
1); // size of destination buffer
|
||||
if (b == 0)
|
||||
return c;
|
||||
#else
|
||||
UINT code_page = get_code_page_for_locale_id(idx);
|
||||
if (code_page == 0)
|
||||
return c;
|
||||
|
||||
WCHAR wide_c;
|
||||
if (::MultiByteToWideChar(code_page, 0, &c, 1, &wide_c, 1) == 0)
|
||||
return c;
|
||||
|
||||
WCHAR wide_result;
|
||||
int b = ::LCMapStringW(
|
||||
idx, // locale identifier
|
||||
LCMAP_LOWERCASE, // mapping transformation type
|
||||
&wide_c, // source string
|
||||
1, // number of characters in source string
|
||||
&wide_result, // destination buffer
|
||||
1); // size of destination buffer
|
||||
if (b == 0)
|
||||
return c;
|
||||
|
||||
if (::WideCharToMultiByte(code_page, 0, &wide_result, 1, result, 2, NULL, NULL) == 0)
|
||||
return c; // No single byte lower case equivalent available
|
||||
#endif
|
||||
return result[0];
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
inline wchar_t BOOST_REGEX_CALL w32_tolower(wchar_t c, lcid_type idx)
|
||||
{
|
||||
wchar_t result[2];
|
||||
int b = ::LCMapStringW(
|
||||
idx, // locale identifier
|
||||
LCMAP_LOWERCASE, // mapping transformation type
|
||||
&c, // source string
|
||||
1, // number of characters in source string
|
||||
result, // destination buffer
|
||||
1); // size of destination buffer
|
||||
if (b == 0)
|
||||
return c;
|
||||
return result[0];
|
||||
}
|
||||
#endif
|
||||
inline char BOOST_REGEX_CALL w32_toupper(char c, lcid_type idx)
|
||||
{
|
||||
char result[2];
|
||||
#ifndef BOOST_NO_ANSI_APIS
|
||||
int b = ::LCMapStringA(
|
||||
idx, // locale identifier
|
||||
LCMAP_UPPERCASE, // mapping transformation type
|
||||
&c, // source string
|
||||
1, // number of characters in source string
|
||||
result, // destination buffer
|
||||
1); // size of destination buffer
|
||||
if (b == 0)
|
||||
return c;
|
||||
#else
|
||||
UINT code_page = get_code_page_for_locale_id(idx);
|
||||
if (code_page == 0)
|
||||
return c;
|
||||
|
||||
WCHAR wide_c;
|
||||
if (::MultiByteToWideChar(code_page, 0, &c, 1, &wide_c, 1) == 0)
|
||||
return c;
|
||||
|
||||
WCHAR wide_result;
|
||||
int b = ::LCMapStringW(
|
||||
idx, // locale identifier
|
||||
LCMAP_UPPERCASE, // mapping transformation type
|
||||
&wide_c, // source string
|
||||
1, // number of characters in source string
|
||||
&wide_result, // destination buffer
|
||||
1); // size of destination buffer
|
||||
if (b == 0)
|
||||
return c;
|
||||
|
||||
if (::WideCharToMultiByte(code_page, 0, &wide_result, 1, result, 2, NULL, NULL) == 0)
|
||||
return c; // No single byte upper case equivalent available.
|
||||
#endif
|
||||
return result[0];
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
inline wchar_t BOOST_REGEX_CALL w32_toupper(wchar_t c, lcid_type idx)
|
||||
{
|
||||
wchar_t result[2];
|
||||
int b = ::LCMapStringW(
|
||||
idx, // locale identifier
|
||||
LCMAP_UPPERCASE, // mapping transformation type
|
||||
&c, // source string
|
||||
1, // number of characters in source string
|
||||
result, // destination buffer
|
||||
1); // size of destination buffer
|
||||
if (b == 0)
|
||||
return c;
|
||||
return result[0];
|
||||
}
|
||||
#endif
|
||||
inline bool BOOST_REGEX_CALL w32_is(lcid_type idx, boost::uint32_t m, char c)
|
||||
{
|
||||
WORD mask;
|
||||
#ifndef BOOST_NO_ANSI_APIS
|
||||
if (::GetStringTypeExA(idx, CT_CTYPE1, &c, 1, &mask) && (mask & m & w32_regex_traits_implementation<char>::mask_base))
|
||||
return true;
|
||||
#else
|
||||
UINT code_page = get_code_page_for_locale_id(idx);
|
||||
if (code_page == 0)
|
||||
return false;
|
||||
|
||||
WCHAR wide_c;
|
||||
if (::MultiByteToWideChar(code_page, 0, &c, 1, &wide_c, 1) == 0)
|
||||
return false;
|
||||
|
||||
if (::GetStringTypeExW(idx, CT_CTYPE1, &wide_c, 1, &mask) && (mask & m & w32_regex_traits_implementation<char>::mask_base))
|
||||
return true;
|
||||
#endif
|
||||
if ((m & w32_regex_traits_implementation<char>::mask_word) && (c == '_'))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_WREGEX
|
||||
inline bool BOOST_REGEX_CALL w32_is(lcid_type idx, boost::uint32_t m, wchar_t c)
|
||||
{
|
||||
WORD mask;
|
||||
if (::GetStringTypeExW(idx, CT_CTYPE1, &c, 1, &mask) && (mask & m & w32_regex_traits_implementation<wchar_t>::mask_base))
|
||||
return true;
|
||||
if ((m & w32_regex_traits_implementation<wchar_t>::mask_word) && (c == '_'))
|
||||
return true;
|
||||
if ((m & w32_regex_traits_implementation<wchar_t>::mask_unicode) && (c > 0xff))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
} // BOOST_REGEX_DETAIL_NS
|
||||
|
||||
|
||||
} // boost
|
||||
|
||||
|
||||
Reference in New Issue
Block a user