From: K.Kosako Date: Mon, 11 Feb 2019 05:18:29 +0000 (+0900) Subject: add OP_BACKREF_WITH_LEVEL_IC opcode X-Git-Tag: v6.9.2_rc1~65^2~56 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fbf91cad4b9168387fbb07d9ff2cecc72779aa20;p=onig add OP_BACKREF_WITH_LEVEL_IC opcode --- diff --git a/src/regcomp.c b/src/regcomp.c index 4889833..5878f74 100644 --- a/src/regcomp.c +++ b/src/regcomp.c @@ -205,7 +205,9 @@ ops_free(regex_t* reg) case OP_BACKREF1: case OP_BACKREF2: case OP_BACKREF_N: case OP_BACKREF_N_IC: break; case OP_BACKREF_MULTI: case OP_BACKREF_MULTI_IC: - case OP_BACKREF_WITH_LEVEL: case OP_BACKREF_CHECK: + case OP_BACKREF_WITH_LEVEL: + case OP_BACKREF_WITH_LEVEL_IC: + case OP_BACKREF_CHECK: case OP_BACKREF_CHECK_WITH_LEVEL: if (op->backref_general.num != 1) xfree(op->backref_general.ns); @@ -1796,10 +1798,12 @@ compile_tree(Node* node, regex_t* reg, ScanEnv* env) else { #ifdef USE_BACKREF_WITH_LEVEL if (NODE_IS_NEST_LEVEL(node)) { - r = add_op(reg, OP_BACKREF_WITH_LEVEL); + if ((reg->options & ONIG_OPTION_IGNORECASE) != 0) + r = add_op(reg, OP_BACKREF_WITH_LEVEL_IC); + else + r = add_op(reg, OP_BACKREF_WITH_LEVEL); + if (r != 0) return r; - COP(reg)->backref_general.options = - (reg->options & ONIG_OPTION_IGNORECASE); COP(reg)->backref_general.nest_level = br->nest_level; goto add_bacref_mems; } diff --git a/src/regexec.c b/src/regexec.c index 66de511..7c7a5a9 100644 --- a/src/regexec.c +++ b/src/regexec.c @@ -204,7 +204,8 @@ static OpInfoType OpInfo[] = { { OP_BACKREF_N_IC, "backref-n-ic", ARG_SPECIAL }, { OP_BACKREF_MULTI, "backref_multi", ARG_SPECIAL }, { OP_BACKREF_MULTI_IC, "backref_multi-ic", ARG_SPECIAL }, - { OP_BACKREF_WITH_LEVEL, "backref_with_level", ARG_SPECIAL }, + { OP_BACKREF_WITH_LEVEL, "backref_with_level", ARG_SPECIAL }, + { OP_BACKREF_WITH_LEVEL_IC, "backref_with_level-c", ARG_SPECIAL }, { OP_BACKREF_CHECK, "backref_check", ARG_SPECIAL }, { OP_BACKREF_CHECK_WITH_LEVEL, "backref_check_with_level", ARG_SPECIAL }, { OP_MEMORY_START_PUSH, "mem-start-push", ARG_MEMNUM }, @@ -436,9 +437,7 @@ onig_print_compiled_byte_code(FILE* f, Operation* p, Operation* start, OnigEncod } break; case OP_BACKREF_WITH_LEVEL: - option = p->backref_general.options; - fprintf(f, ":%d", option); - /* fall */ + case OP_BACKREF_WITH_LEVEL_IC: case OP_BACKREF_CHECK_WITH_LEVEL: { LengthType level; @@ -2522,6 +2521,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end, &&L_BACKREF_MULTI, &&L_BACKREF_MULTI_IC, &&L_BACKREF_WITH_LEVEL, + &&L_BACKREF_WITH_LEVEL_IC, &&L_BACKREF_CHECK, &&L_BACKREF_CHECK_WITH_LEVEL, &&L_MEMORY_START, @@ -3566,21 +3566,24 @@ match_at(regex_t* reg, const UChar* str, const UChar* end, JUMP_OUT; #ifdef USE_BACKREF_WITH_LEVEL + CASE_OP(BACKREF_WITH_LEVEL_IC) + n = 1; /* ignore case */ + goto backref_with_level; CASE_OP(BACKREF_WITH_LEVEL) { int len; - OnigOptionType ic; int level; MemNumType* mems; - ic = p->backref_general.options; + n = 0; + backref_with_level: level = p->backref_general.nest_level; tlen = p->backref_general.num; mems = tlen == 1 ? &(p->backref_general.n1) : p->backref_general.ns; sprev = s; - if (backref_match_at_nested_level(reg, stk, stk_base, ic - , case_fold_flag, level, (int )tlen, mems, &s, end)) { + if (backref_match_at_nested_level(reg, stk, stk_base, n, + case_fold_flag, level, (int )tlen, mems, &s, end)) { if (sprev < end) { while (sprev + (len = enclen(encode, sprev)) < s) sprev += len; diff --git a/src/regint.h b/src/regint.h index b10bb4f..802027d 100644 --- a/src/regint.h +++ b/src/regint.h @@ -552,6 +552,7 @@ enum OpCode { OP_BACKREF_MULTI, OP_BACKREF_MULTI_IC, OP_BACKREF_WITH_LEVEL, /* \k, \k */ + OP_BACKREF_WITH_LEVEL_IC, /* \k, \k */ OP_BACKREF_CHECK, /* (?(n)), (?('name')) */ OP_BACKREF_CHECK_WITH_LEVEL, /* (?(n-level)), (?('name-level')) */