static int forward_search(regex_t* reg, const UChar* str, const UChar* end, UChar* start, UChar* range, UChar** low, UChar** high, UChar** low_prev);
+static int
+search_in_range(regex_t* reg, const UChar* str, const UChar* end, const UChar* start, const UChar* range, /* match range */ const UChar* data_range, /* subject string range */ OnigRegion* region, OnigOptionType option, OnigMatchParam* mp);
+
#ifdef USE_CALLOUT
typedef struct {
for (i = 0; i < n; i++) {
reg = set->rs[i].reg;
region = set->rs[i].region;
- r = onig_search_with_param(reg, str, end, start, ep, region, option, mps[i]);
+ r = search_in_range(reg, str, end, start, ep, orig_range, region, option, mps[i]);
if (r >= 0) {
if (str + r < ep) {
ep = str + r;
}
-extern int
-onig_search_with_param(regex_t* reg, const UChar* str, const UChar* end,
- const UChar* start, const UChar* range, OnigRegion* region,
- OnigOptionType option, OnigMatchParam* mp)
+static int
+search_in_range(regex_t* reg, const UChar* str, const UChar* end,
+ const UChar* start, const UChar* range, /* match range */
+ const UChar* data_range, /* subject string range */
+ OnigRegion* region,
+ OnigOptionType option, OnigMatchParam* mp)
{
int r;
UChar *s, *prev;
MatchArg msa;
const UChar *orig_start = start;
- const UChar *orig_range = range;
#ifdef ONIG_DEBUG_SEARCH
fprintf(stderr,
prev = low_prev;
}
while (s <= high) {
- MATCH_AND_RETURN_CHECK(orig_range);
+ MATCH_AND_RETURN_CHECK(data_range);
prev = s;
s += enclen(reg->enc, s);
}
if ((reg->anchor & ANCR_ANYCHAR_INF) != 0) {
do {
- MATCH_AND_RETURN_CHECK(orig_range);
+ MATCH_AND_RETURN_CHECK(data_range);
prev = s;
s += enclen(reg->enc, s);
}
do {
- MATCH_AND_RETURN_CHECK(orig_range);
+ MATCH_AND_RETURN_CHECK(data_range);
prev = s;
s += enclen(reg->enc, s);
} while (s < range);
if (s == range) { /* because empty match with /$/. */
- MATCH_AND_RETURN_CHECK(orig_range);
+ MATCH_AND_RETURN_CHECK(data_range);
}
}
else { /* backward search */
return (int )(s - str);
}
+extern int
+onig_search_with_param(regex_t* reg, const UChar* str, const UChar* end,
+ const UChar* start, const UChar* range, OnigRegion* region,
+ OnigOptionType option, OnigMatchParam* mp)
+{
+ const UChar* data_range;
+
+ if (range < start)
+ data_range = end;
+ else
+ data_range = range;
+
+ return search_in_range(reg, str, end, start, range, data_range, region,
+ option, mp);
+}
+
extern int
onig_scan(regex_t* reg, const UChar* str, const UChar* end,
OnigRegion* region, OnigOptionType option,