summaryrefslogtreecommitdiff
path: root/src/regexec.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/regexec.c')
-rw-r--r--src/regexec.c76
1 files changed, 47 insertions, 29 deletions
diff --git a/src/regexec.c b/src/regexec.c
index cb8e620..496da3b 100644
--- a/src/regexec.c
+++ b/src/regexec.c
@@ -180,19 +180,7 @@ typedef struct {
} MatchArg;
-#if defined(ONIG_DEBUG_COMPILE) || defined(ONIG_DEBUG_MATCH)
-
-/* arguments type */
-typedef enum {
- ARG_SPECIAL = -1,
- ARG_NON = 0,
- ARG_RELADDR = 1,
- ARG_ABSADDR = 2,
- ARG_LENGTH = 3,
- ARG_MEMNUM = 4,
- ARG_OPTION = 5,
- ARG_MODE = 6
-} OpArgType;
+#if defined(ONIG_DEBUG_COMPILE) || defined(ONIG_DEBUG_MATCH) || defined(ONIG_DEBUG_STATISTICS)
typedef struct {
short int opcode;
@@ -299,6 +287,22 @@ static OpInfoType OpInfo[] = {
{ -1, ""}
};
+#endif
+
+#if defined(ONIG_DEBUG_COMPILE) || defined(ONIG_DEBUG_MATCH)
+
+/* arguments type */
+typedef enum {
+ ARG_SPECIAL = -1,
+ ARG_NON = 0,
+ ARG_RELADDR = 1,
+ ARG_ABSADDR = 2,
+ ARG_LENGTH = 3,
+ ARG_MEMNUM = 4,
+ ARG_OPTION = 5,
+ ARG_MODE = 6
+} OpArgType;
+
static char*
op2name(int opcode)
{
@@ -2808,7 +2812,7 @@ typedef struct {
#define MATCH_COUNTER_OUT(title) do {\
int i;\
- fprintf(DBGFP, "%s (%ld): retry limit: %8lu, subexp_call: %8lu\n", (title), (sstart - str), retry_in_match_counter, msa->subexp_call_in_search_counter); \
+ fprintf(DBGFP, "%s (%ld): retry limit: %8lu/%8lu, subexp_call: %8lu\n", (title), (sstart - str), retry_in_match_counter, retry_limit_in_match, msa->subexp_call_in_search_counter); \
fprintf(DBGFP, " ");\
for (i = 0; i < MAX_SUBEXP_CALL_COUNTERS; i++) {\
fprintf(DBGFP, " %6lu", subexp_call_counters[i]);\
@@ -3038,39 +3042,43 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
BYTECODE_INTERPRETER_START {
CASE_OP(END)
+ if (OPTON_MATCH_WHOLE_STRING(options)) {
+ if (! ON_STR_END(s)) goto fail;
+ }
+
n = (int )(s - sstart);
if (n == 0 && OPTON_FIND_NOT_EMPTY(options)) {
best_len = ONIG_MISMATCH;
goto fail; /* for retry */
}
- if (n > best_len) {
#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
- if (OPTON_FIND_LONGEST(options)) {
+ if (OPTON_FIND_LONGEST(options)) {
+ if (n > best_len) {
if (n > msa->best_len) {
+ best_len = n;
msa->best_len = n;
msa->best_s = (UChar* )sstart;
- if (s >= in_right_range) {
- best_len = msa->best_len; /* end of find */
- }
}
else {
if (s >= in_right_range && msa->best_s == sstart) {
- best_len = msa->best_len; /* end of find */
+ goto op_end_out;
}
else {
- SOP_OUT;
goto fail; /* for retry */
}
}
}
else {
- best_len = n;
+ goto fail; /* for retry */
}
-#else
+ }
+ else {
best_len = n;
-#endif
}
+#else
+ best_len = n;
+#endif
/* set region */
region = msa->region;
@@ -3135,14 +3143,14 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
#endif
} /* if (region) */
- SOP_OUT;
-
if (OPTON_CALLBACK_EACH_MATCH(options) &&
IS_NOT_NULL(CallbackEachMatch)) {
i = CallbackEachMatch(str, end, sstart, region,
msa->mp->callout_user_data);
- if (i < 0) MATCH_AT_ERROR_RETURN(i);
-
+ if (i < 0) {
+ SOP_OUT;
+ MATCH_AT_ERROR_RETURN(i);
+ }
#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
if (! OPTON_FIND_LONGEST(options))
#endif
@@ -3151,7 +3159,13 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
goto fail;
}
+#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
+ if (OPTON_FIND_LONGEST(options)) goto fail;
+#endif
+
+ op_end_out:
/* default behavior: return first-matching result. */
+ SOP_OUT;
goto match_at_end;
CASE_OP(STR_1)
@@ -4398,6 +4412,11 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
#endif
CASE_OP(FINISH)
+#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
+ if (OPTON_FIND_LONGEST(options)) {
+ best_len = ONIG_MISMATCH;
+ }
+#endif
goto match_at_end;
#ifdef ONIG_DEBUG_STATISTICS
@@ -5455,7 +5474,6 @@ search_in_range(regex_t* reg, const UChar* str, const UChar* end,
else goto finish; /* error */ \
}
-
/* anchor optimize: resume search range */
if (reg->anchor != 0 && str < end) {
UChar *min_semi_end, *max_semi_end;