aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorK.Kosako <kosako@sofnec.co.jp>2020-01-16 13:20:57 +0900
committerK.Kosako <kosako@sofnec.co.jp>2020-01-16 13:20:57 +0900
commitf511f4a8794f665e052577f15353d3115efb08d2 (patch)
treedcc64e54b4398abd8a459f0f5d736a161dd5e512
parentad54286ee90290ee871ba35ca9e3cc24bb0b2d87 (diff)
downloadoniguruma-f511f4a8794f665e052577f15353d3115efb08d2.zip
oniguruma-f511f4a8794f665e052577f15353d3115efb08d2.tar.gz
oniguruma-f511f4a8794f665e052577f15353d3115efb08d2.tar.bz2
add OP_STEP_BACK_NEXT
-rw-r--r--src/regexec.c15
-rw-r--r--src/regint.h2
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