Fix recursive expressions where the recursion appears more than once.

Fixes https://github.com/boostorg/regex/issues/87.
Also fix some more msvc warnings.
This commit is contained in:
jzmaddock
2020-01-23 19:24:33 +00:00
parent bc160a58f0
commit afc4229234
5 changed files with 18 additions and 5 deletions

View File

@ -594,7 +594,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)));
}
}
//
@ -1070,9 +1070,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;