diff options
author | K.Kosako <kosako@sofnec.co.jp> | 2020-01-17 10:27:41 +0900 |
---|---|---|
committer | K.Kosako <kosako@sofnec.co.jp> | 2020-01-17 10:27:41 +0900 |
commit | 2b52c901562022c4d3404c194d36991c15b07b29 (patch) | |
tree | 809753c412488e85114efa0702abbf5920598398 | |
parent | ad08ed965b6a883b2248b6a7473c4873bed9ef48 (diff) | |
download | oniguruma-2b52c901562022c4d3404c194d36991c15b07b29.zip oniguruma-2b52c901562022c4d3404c194d36991c15b07b29.tar.gz oniguruma-2b52c901562022c4d3404c194d36991c15b07b29.tar.bz2 |
refactoring
-rw-r--r-- | src/regcomp.c | 71 |
1 files changed, 45 insertions, 26 deletions
diff --git a/src/regcomp.c b/src/regcomp.c index 5f98675..2d10253 100644 --- a/src/regcomp.c +++ b/src/regcomp.c @@ -2048,6 +2048,50 @@ compile_anchor_look_behind_node(AnchorNode* node, regex_t* reg, ScanEnv* env) } static int +compile_anchor_look_behind_not_node(AnchorNode* node, regex_t* reg, + ScanEnv* env) +{ + int r; + int len; + + if (node->char_min_len == node->char_max_len) { + MemNumType mid; + + len = compile_length_tree(NODE_ANCHOR_BODY(node), reg); + ID_ENTRY(env, mid); + r = add_op(reg, OP_MARK); + if (r != 0) return r; + COP(reg)->mark.id = mid; + COP(reg)->mark.save_pos = FALSE; + + r = add_op(reg, OP_PUSH); + if (r != 0) return r; + COP(reg)->push.addr = SIZE_INC + OPSIZE_STEP_BACK_START + len + OPSIZE_POP_TO_MARK + OPSIZE_FAIL; + + r = add_op(reg, OP_STEP_BACK_START); + if (r != 0) return r; + COP(reg)->step_back_start.initial = node->char_min_len; + COP(reg)->step_back_start.remaining = 0; + COP(reg)->step_back_start.addr = 1; + + r = compile_tree(NODE_ANCHOR_BODY(node), reg, env); + if (r != 0) return r; + + r = add_op(reg, OP_POP_TO_MARK); + if (r != 0) return r; + COP(reg)->pop_to_mark.id = mid; + r = add_op(reg, OP_FAIL); + if (r != 0) return r; + r = add_op(reg, OP_POP); + } + else { + + } + + return r; +} + +static int compile_anchor_node(AnchorNode* node, regex_t* reg, ScanEnv* env) { int r, len; @@ -2158,32 +2202,7 @@ compile_anchor_node(AnchorNode* node, regex_t* reg, ScanEnv* env) break; case ANCR_LOOK_BEHIND_NOT: - len = compile_length_tree(NODE_ANCHOR_BODY(node), reg); - ID_ENTRY(env, mid); - r = add_op(reg, OP_MARK); - if (r != 0) return r; - COP(reg)->mark.id = mid; - COP(reg)->mark.save_pos = FALSE; - - r = add_op(reg, OP_PUSH); - if (r != 0) return r; - COP(reg)->push.addr = SIZE_INC + OPSIZE_STEP_BACK_START + len + OPSIZE_POP_TO_MARK + OPSIZE_FAIL; - - r = add_op(reg, OP_STEP_BACK_START); - if (r != 0) return r; - COP(reg)->step_back_start.initial = node->char_min_len; - COP(reg)->step_back_start.remaining = 0; - COP(reg)->step_back_start.addr = 1; - - r = compile_tree(NODE_ANCHOR_BODY(node), reg, env); - if (r != 0) return r; - - r = add_op(reg, OP_POP_TO_MARK); - if (r != 0) return r; - COP(reg)->pop_to_mark.id = mid; - r = add_op(reg, OP_FAIL); - if (r != 0) return r; - r = add_op(reg, OP_POP); + r = compile_anchor_look_behind_not_node(node, reg, env); break; default: |