diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2017-04-09 19:36:05 +0200 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2017-04-09 19:36:05 +0200 | 
| commit | 55597dfc375615c45377aad508db826caf6b0bdf (patch) | |
| tree | 0904320d2b2c844a806217a38efe8d2358bcaeee /src/regcomp.c | |
| parent | dc546147cf8df064e1ea40cc4c339648e7def040 (diff) | |
| parent | f42b61800a1a1b360c5ac915ec1caf34bf1fb86b (diff) | |
Merge tag 'upstream/6.2.0'
Upstream version 6.2.0
Diffstat (limited to 'src/regcomp.c')
| -rw-r--r-- | src/regcomp.c | 33 | 
1 files changed, 30 insertions, 3 deletions
| diff --git a/src/regcomp.c b/src/regcomp.c index 11ba1e7..5c924b5 100644 --- a/src/regcomp.c +++ b/src/regcomp.c @@ -1230,6 +1230,11 @@ compile_length_enclose_node(EncloseNode* node, regex_t* reg)          len += (IS_ENCLOSE_RECURSION(node)                  ? SIZE_OP_MEMORY_END_REC : SIZE_OP_MEMORY_END);      } +    else if (IS_ENCLOSE_RECURSION(node)) { +      len = SIZE_OP_MEMORY_START_PUSH; +      len += tlen + (BIT_STATUS_AT(reg->bt_mem_end, node->regnum) +                     ? SIZE_OP_MEMORY_END_PUSH_REC : SIZE_OP_MEMORY_END_REC); +    }      else  #endif      { @@ -1321,6 +1326,14 @@ compile_enclose_node(EncloseNode* node, regex_t* reg)        if (r) return r;        r = add_opcode(reg, OP_RETURN);      } +    else if (IS_ENCLOSE_RECURSION(node)) { +      if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum)) +        r = add_opcode(reg, OP_MEMORY_END_PUSH_REC); +      else +        r = add_opcode(reg, OP_MEMORY_END_REC); +      if (r) return r; +      r = add_mem_num(reg, node->regnum); +    }      else  #endif      { @@ -2231,6 +2244,7 @@ is_not_included(Node* x, Node* y, regex_t* reg)              return 0;            }            else { +            if (IS_NOT_NULL(xc->mbuf)) return 0;              for (i = 0; i < SINGLE_BYTE_SIZE; i++) {                if (! IS_CODE_SB_WORD(reg->enc, i)) {                  if (!IS_NCCLASS_NOT(xc)) { @@ -3673,6 +3687,8 @@ setup_comb_exp_check(Node* node, int state, ScanEnv* env)  #define IN_NOT        (1<<1)  #define IN_REPEAT     (1<<2)  #define IN_VAR_REPEAT (1<<3) +#define IN_CALL       (1<<4) +#define IN_RECCALL    (1<<5)  /* setup_tree does the following work.   1. check empty loop. (set qn->target_empty_info) @@ -3843,10 +3859,16 @@ setup_tree(Node* node, regex_t* reg, int state, ScanEnv* env)          break;        case ENCLOSE_MEMORY: -        if ((state & (IN_ALT | IN_NOT | IN_VAR_REPEAT)) != 0) { +        if ((state & (IN_ALT | IN_NOT | IN_VAR_REPEAT | IN_CALL)) != 0) {            BIT_STATUS_ON_AT(env->bt_mem_start, en->regnum);            /* SET_ENCLOSE_STATUS(node, NST_MEM_IN_ALT_NOT); */          } +        if (IS_ENCLOSE_CALLED(en)) +          state |= IN_CALL; +        if (IS_ENCLOSE_RECURSION(en)) +          state |= IN_RECCALL; +        else if ((state & IN_RECCALL) != 0) +          SET_CALL_RECURSION(node);          r = setup_tree(en->target, reg, state, env);          break; @@ -4160,6 +4182,9 @@ concat_opt_anc_info(OptAncInfo* to, OptAncInfo* left, OptAncInfo* right,    if (right_len == 0) {      to->right_anchor |= left->right_anchor;    } +  else { +    to->right_anchor |= (left->right_anchor & ANCHOR_PREC_READ_NOT); +  }  }  static int @@ -5003,12 +5028,14 @@ set_optimize_info_from_tree(Node* node, regex_t* reg, ScanEnv* scan_env)    if (r) return r;    reg->anchor = opt.anc.left_anchor & (ANCHOR_BEGIN_BUF | -        ANCHOR_BEGIN_POSITION | ANCHOR_ANYCHAR_STAR | ANCHOR_ANYCHAR_STAR_ML); +        ANCHOR_BEGIN_POSITION | ANCHOR_ANYCHAR_STAR | ANCHOR_ANYCHAR_STAR_ML | +        ANCHOR_LOOK_BEHIND);    if ((opt.anc.left_anchor & (ANCHOR_LOOK_BEHIND | ANCHOR_PREC_READ_NOT)) != 0)      reg->anchor &= ~ANCHOR_ANYCHAR_STAR_ML; -  reg->anchor |= opt.anc.right_anchor & (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF); +  reg->anchor |= opt.anc.right_anchor & (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF | +       ANCHOR_PREC_READ_NOT);    if (reg->anchor & (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF)) {      reg->anchor_dmin = opt.len.min; | 
