]> granicus.if.org Git - onig/commitdiff
add OP_BACKREF_WITH_LEVEL_IC opcode
authorK.Kosako <kkosako0@gmail.com>
Mon, 11 Feb 2019 05:18:29 +0000 (14:18 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Thu, 28 Feb 2019 05:28:18 +0000 (14:28 +0900)
src/regcomp.c
src/regexec.c
src/regint.h

index 48898336cde3afaf33076388043d5e5292adfeb4..5878f74e3205f1bf8d2807516223b8b79dd952da 100644 (file)
@@ -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;
         }
index 66de511d0e944e8f14e90e558d421a949862364e..7c7a5a9efa62426adc8c02762204b045e3bfa9ef 100644 (file)
@@ -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;
index b10bb4f4f216973d5985b15049aac14d258d7575..802027d6cf140b39c8ef94c28fcd4108b7691684 100644 (file)
@@ -552,6 +552,7 @@ enum OpCode {
   OP_BACKREF_MULTI,
   OP_BACKREF_MULTI_IC,
   OP_BACKREF_WITH_LEVEL,        /* \k<xxx+n>, \k<xxx-n> */
+  OP_BACKREF_WITH_LEVEL_IC,     /* \k<xxx+n>, \k<xxx-n> */
   OP_BACKREF_CHECK,             /* (?(n)), (?('name')) */
   OP_BACKREF_CHECK_WITH_LEVEL,  /* (?(n-level)), (?('name-level')) */