diff options
author | K.Kosako <kosako@sofnec.co.jp> | 2020-01-16 13:20:57 +0900 |
---|---|---|
committer | K.Kosako <kosako@sofnec.co.jp> | 2020-01-16 13:20:57 +0900 |
commit | f511f4a8794f665e052577f15353d3115efb08d2 (patch) | |
tree | dcc64e54b4398abd8a459f0f5d736a161dd5e512 | |
parent | ad54286ee90290ee871ba35ca9e3cc24bb0b2d87 (diff) | |
download | oniguruma-f511f4a8794f665e052577f15353d3115efb08d2.zip oniguruma-f511f4a8794f665e052577f15353d3115efb08d2.tar.gz oniguruma-f511f4a8794f665e052577f15353d3115efb08d2.tar.bz2 |
add OP_STEP_BACK_NEXT
-rw-r--r-- | src/regexec.c | 15 | ||||
-rw-r--r-- | src/regint.h | 2 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/regexec.c b/src/regexec.c index 0d64a9a..831bf28 100644 --- a/src/regexec.c +++ b/src/regexec.c @@ -255,6 +255,7 @@ static OpInfoType OpInfo[] = { { OP_LOOK_BEHIND_NOT_START, "look-behind-not-start"}, { OP_LOOK_BEHIND_NOT_END, "look-behind-not-end"}, { OP_STEP_BACK_START, "step-back-start"}, + { OP_STEP_BACK_NEXT, "step-back-next"}, { OP_CUT_TO_MARK, "cut-to-mark"}, { OP_MARK, "mark"}, { OP_SAVE_VAL, "save-val"}, @@ -649,6 +650,7 @@ print_compiled_byte_code(FILE* f, regex_t* reg, int index, case OP_FAIL: case OP_POP: case OP_LOOK_BEHIND_NOT_END: + case OP_STEP_BACK_NEXT: #ifdef USE_CALL case OP_RETURN: #endif @@ -2690,6 +2692,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end, &&L_LOOK_BEHIND_NOT_START, &&L_LOOK_BEHIND_NOT_END, &&L_STEP_BACK_START, + &&L_STEP_BACK_NEXT, &&L_CUT_TO_MARK, &&L_MARK, &&L_SAVE_VAL, @@ -3956,6 +3959,18 @@ match_at(regex_t* reg, const UChar* str, const UChar* end, INC_OP; JUMP_OUT; + CASE_OP(STEP_BACK_NEXT) + tlen = stk->zid; /* remaining count */ + if (! IS_INFINITE_REPEAT(tlen)) tlen--; + s = (UChar* )ONIGENC_STEP_BACK(encode, str, s, 1); + if (IS_NULL(s)) goto fail; + sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s); + if (tlen != 0) { + STACK_PUSH_ALT_WITH_ZID(p, s, sprev, tlen); + } + INC_OP; + JUMP_OUT; + CASE_OP(CUT_TO_MARK) mem = p->cut_to_mark.id; /* mem: mark id */ STACK_TO_VOID_TO_MARK(stkp, mem); diff --git a/src/regint.h b/src/regint.h index 2ff073c..e3d44cb 100644 --- a/src/regint.h +++ b/src/regint.h @@ -592,6 +592,7 @@ enum OpCode { OP_LOOK_BEHIND_NOT_START, /* (?<!...) start */ OP_LOOK_BEHIND_NOT_END, /* (?<!...) end */ OP_STEP_BACK_START, + OP_STEP_BACK_NEXT, OP_CUT_TO_MARK, OP_MARK, OP_SAVE_VAL, @@ -688,6 +689,7 @@ typedef int ModeType; #define OPSIZE_CALL 1 #define OPSIZE_RETURN 1 #define OPSIZE_STEP_BACK_START 1 +#define OPSIZE_STEP_BACK_NEXT 1 #define OPSIZE_CUT_TO_MARK 1 #define OPSIZE_MARK 1 #define OPSIZE_SAVE_VAL 1 |