+fix: sync with current Oniguruma v7.0(ß) dev

This commit is contained in:
METANEOCORTEX\Kotti 2021-11-24 10:48:18 +01:00
parent 6bb5601888
commit 2668ca66e3
2 changed files with 32 additions and 22 deletions

View File

@ -3249,27 +3249,34 @@ enum GetValue {
GET_VALUE_FOUND = 1
};
#define MAX_NEST_LEVEL_GET_TREE_TAIL_LITERAL 16
static int
get_tree_tail_literal(Node* node, Node** rnode, regex_t* reg)
get_tree_tail_literal(Node* node, Node** rnode, regex_t* reg, int nest_level)
{
int r;
nest_level++;
if (nest_level >= MAX_NEST_LEVEL_GET_TREE_TAIL_LITERAL) {
return GET_VALUE_NONE;
}
switch (NODE_TYPE(node)) {
case NODE_LIST:
if (IS_NULL(NODE_CDR(node))) {
r = get_tree_tail_literal(NODE_CAR(node), rnode, reg);
r = get_tree_tail_literal(NODE_CAR(node), rnode, reg, nest_level);
}
else {
r = get_tree_tail_literal(NODE_CDR(node), rnode, reg);
r = get_tree_tail_literal(NODE_CDR(node), rnode, reg, nest_level);
if (r == GET_VALUE_IGNORE) {
r = get_tree_tail_literal(NODE_CAR(node), rnode, reg);
r = get_tree_tail_literal(NODE_CAR(node), rnode, reg, nest_level);
}
}
break;
#ifdef USE_CALL
case NODE_CALL:
r = get_tree_tail_literal(NODE_BODY(node), rnode, reg);
r = get_tree_tail_literal(NODE_BODY(node), rnode, reg, nest_level);
break;
#endif
@ -3307,7 +3314,7 @@ get_tree_tail_literal(Node* node, Node** rnode, regex_t* reg)
{
QuantNode* qn = QUANT_(node);
if (qn->lower != 0) {
r = get_tree_tail_literal(NODE_BODY(node), rnode, reg);
r = get_tree_tail_literal(NODE_BODY(node), rnode, reg, nest_level);
}
else
r = GET_VALUE_NONE;
@ -3323,12 +3330,12 @@ get_tree_tail_literal(Node* node, Node** rnode, regex_t* reg)
r = GET_VALUE_NONE;
else {
NODE_STATUS_ADD(node, MARK1);
r = get_tree_tail_literal(NODE_BODY(node), rnode, reg);
r = get_tree_tail_literal(NODE_BODY(node), rnode, reg, nest_level);
NODE_STATUS_REMOVE(node, MARK1);
}
}
else {
r = get_tree_tail_literal(NODE_BODY(node), rnode, reg);
r = get_tree_tail_literal(NODE_BODY(node), rnode, reg, nest_level);
}
}
break;
@ -4585,7 +4592,7 @@ tune_look_behind(Node* node, regex_t* reg, int state, ParseEnv* env)
if (IS_NULL(an->lead_node)) {
an->char_min_len = ci.min;
an->char_max_len = ci.max;
r = get_tree_tail_literal(body, &tail, reg);
r = get_tree_tail_literal(body, &tail, reg, 0);
if (r == GET_VALUE_FOUND) {
r = onig_node_copy(&(an->lead_node), tail);
if (r != 0) return r;
@ -8079,8 +8086,12 @@ onig_detect_can_be_slow_pattern(const UChar* pattern,
if (count.max_empty_check_nest_level > 2)
n += count.max_empty_check_nest_level - 2;
if (count.heavy_element != 0)
n += count.heavy_element << 8;
if (count.heavy_element != 0) {
if (count.heavy_element < 0x10000)
n += count.heavy_element << 8;
else
n += count.heavy_element;
}
r = n;

View File

@ -50,7 +50,6 @@ const OnigUChar* const _CRLF = "\r\n\0";
#define IS_LF_CODE(enc, s, end) (ONIGENC_MBC_TO_CODE((enc), (s), (end)) == NEWLINE_CODE)
#define IS_CR_CODE(enc, s, end) (ONIGENC_MBC_TO_CODE((enc), (s), (end)) == CARRIAGE_RET)
// ----------------------------------------------------------------------------
#define CHECK_INTERRUPT_IN_MATCH
#define STACK_MEM_START(reg, idx) \
@ -3689,11 +3688,11 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
UChar* sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s);
if (ONIGENC_IS_MBC_NEWLINE(encode, sprev, end)) {
if (!IS_CRLF_NEWLINE(encode) || IS_LF_CODE(encode, sprev, end)) {
INC_OP;
JUMP_OUT;
INC_OP;
JUMP_OUT;
}
}
}
}
goto fail;
CASE_OP(END_LINE)
@ -3711,9 +3710,9 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
}
else if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) {
if (!IS_CRLF_NEWLINE(encode) || IS_CR_CODE(encode, s, end)) {
INC_OP;
JUMP_OUT;
}
INC_OP;
JUMP_OUT;
}
}
#ifdef USE_CRNL_AS_LINE_TERMINATOR
else if (ONIGENC_IS_MBC_CRNL(encode, s, end)) {
@ -5262,7 +5261,7 @@ forward_search(regex_t* reg, const UChar* str, const UChar* end, UChar* start,
prev = onigenc_get_prev_char_head(reg->enc, (pprev ? pprev : str), p);
if (IS_NOT_NULL(prev)) {
if (!ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end)) {
goto retry_gate;
goto retry_gate;
} else if (IS_CRLF_NEWLINE(reg->enc) && !IS_LF_CODE(reg->enc, prev, end)) {
goto retry_gate;
}
@ -5363,14 +5362,14 @@ backward_search(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
prev = onigenc_get_prev_char_head(reg->enc, str, p);
if (IS_NOT_NULL(prev)) {
if (!ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end)) {
p = prev;
goto retry;
p = prev;
goto retry;
} else if (IS_CRLF_NEWLINE(reg->enc) && !IS_LF_CODE(reg->enc, prev, end)) {
p = prev;
goto retry;
}
}
}
}
break;
case ANCR_END_LINE: