struct OnigRegSetStruct;
typedef struct OnigRegSetStruct OnigRegSet;
+typedef enum {
+ ONIG_REGSET_POSITION_LEAD = 0,
+ ONIG_REGSET_REGEX_LEAD = 1
+} OnigRegsetLead;
typedef struct {
int num_of_elements;
ONIG_EXTERN
OnigRegion* onig_regset_get_region P_((OnigRegSet* set, int at));
ONIG_EXTERN
-int onig_regset_search P_((OnigRegSet* set, const OnigUChar* str, const OnigUChar* end, const OnigUChar* start, const OnigUChar* range, OnigOptionType option, int* rmatch_pos));
+int onig_regset_search P_((OnigRegSet* set, const OnigUChar* str, const OnigUChar* end, const OnigUChar* start, const OnigUChar* range, OnigRegsetLead lead, OnigOptionType option, int* rmatch_pos));
ONIG_EXTERN
-int onig_regset_search_with_param P_((OnigRegSet* set, const OnigUChar* str, const OnigUChar* end, const OnigUChar* start, const OnigUChar* range, OnigOptionType option, OnigMatchParam* mps[], int* rmatch_pos));
+int onig_regset_search_with_param P_((OnigRegSet* set, const OnigUChar* str, const OnigUChar* end, const OnigUChar* start, const OnigUChar* range, OnigRegsetLead lead, OnigOptionType option, OnigMatchParam* mps[], int* rmatch_pos));
ONIG_EXTERN
OnigRegion* onig_region_new P_((void));
}
static inline int
-regset_search_body(OnigRegSet* set,
+regset_search_body_position_lead(OnigRegSet* set,
const UChar* str, const UChar* end,
const UChar* start, const UChar* range,
- const UChar* orig_start, const UChar* orig_range,
+ const UChar* orig_range,
OnigOptionType option, MatchArg* msas, int* rmatch_pos)
{
int r, n, i;
sch_range = (UChar* )range + reg->dmax;
if (sch_range > end) sch_range = (UChar* )end;
- if (forward_search(reg, str, end, s, sch_range,
- &low, &high, &low_prev)) {
+ if (forward_search(reg, str, end, s, sch_range, &low, &high, &low_prev)) {
sr[i].state = SRS_LOW_HIGH;
sr[i].low = low;
sr[i].high = high;
return i;
}
+static inline int
+regset_search_body_regex_lead(OnigRegSet* set,
+ const UChar* str, const UChar* end,
+ const UChar* start, const UChar* orig_range,
+ OnigOptionType option, OnigMatchParam* mps[], int* rmatch_pos)
+{
+ int r;
+ int i;
+ int n;
+ int match_index;
+ const UChar* ep;
+ regex_t* reg;
+ OnigRegion* region;
+
+ n = set->n;
+
+ match_index = ONIG_MISMATCH;
+ ep = orig_range;
+ 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]);
+ if (r >= 0) {
+ if (str + r < ep) {
+ ep = str + r;
+ match_index = i;
+ *rmatch_pos = r;
+ }
+ }
+ }
+
+ return match_index;
+}
+
extern int
onig_regset_search_with_param(OnigRegSet* set,
const UChar* str, const UChar* end,
const UChar* start, const UChar* range,
- OnigOptionType option, OnigMatchParam* mps[], int* rmatch_pos)
+ OnigRegsetLead lead, OnigOptionType option, OnigMatchParam* mps[],
+ int* rmatch_pos)
{
int r;
int i;
orig_start, mps[i]);
}
- r = regset_search_body(set, str, end, start, range, orig_start, orig_range,
- option, msas, rmatch_pos);
+ if (lead == ONIG_REGSET_POSITION_LEAD) {
+ r = regset_search_body_position_lead(set, str, end, start, range,
+ orig_range, option, msas, rmatch_pos);
+ }
+ else {
+ r = regset_search_body_regex_lead(set, str, end, start, orig_range,
+ option, mps, rmatch_pos);
+ }
if (r < 0) goto finish;
else goto match2;
extern int
onig_regset_search(OnigRegSet* set, const UChar* str, const UChar* end,
- const UChar* start, const UChar* range, OnigOptionType option, int* rmatch_pos)
+ const UChar* start, const UChar* range,
+ OnigRegsetLead lead, OnigOptionType option, int* rmatch_pos)
{
int r;
int i;
mps[i] = mp + i;
}
- r = onig_regset_search_with_param(set, str, end, start, range, option, mps,
+ r = onig_regset_search_with_param(set, str, end, start, range, lead, option, mps,
rmatch_pos);
for (i = 0; i < set->n; i++)
onig_free_match_param_content(mp + i);