return 0;
ambig = NODE_STRING_IS_AMBIG(node);
+ if (ambig != 0) {
+ return 1;
+ }
p = prev = sn->s;
prev_len = enclen(enc, p);
reg, 0);
}
+static int
+compile_ambig_string_node(Node* node, regex_t* reg)
+{
+ int r;
+ int len;
+ int byte_len;
+ UChar* p;
+ StrNode* sn;
+ OnigEncoding enc = reg->enc;
+
+ sn = STR_(node);
+ len = enclen(enc, sn->s);
+ byte_len = sn->end - sn->s;
+ if (len == byte_len) {
+ r = add_op(reg, OP_EXACT1_IC);
+ if (r != 0) return r;
+
+ xmemset(COP(reg)->exact.s, 0, sizeof(COP(reg)->exact.s));
+ xmemcpy(COP(reg)->exact.s, sn->s, (size_t )byte_len);
+ }
+ else {
+ r = add_op(reg, OP_EXACTN_IC);
+ if (r != 0) return r;
+
+ p = onigenc_strdup(enc, sn->s, sn->end);
+ CHECK_NULL_RETURN_MEMERR(p);
+
+ COP(reg)->exact_n.s = p;
+ COP(reg)->exact_n.n = byte_len;
+ }
+
+ return 0;
+}
+
static int
compile_string_node(Node* node, regex_t* reg)
{
end = sn->end;
ambig = NODE_STRING_IS_AMBIG(node);
+ if (ambig != 0) {
+ return compile_ambig_string_node(node, reg);
+ }
p = prev = sn->s;
prev_len = enclen(enc, p);
reg->dmax = e->mmd.max;
if (reg->dmin != INFINITE_LEN) {
- reg->threshold_len = reg->dmin + (int )(reg->exact_end - reg->exact);
+ int n;
+ if (e->case_fold != 0 && e->good_case_fold == 0)
+ n = 1;
+ else
+ n = (int )(reg->exact_end - reg->exact);
+
+ reg->threshold_len = reg->dmin + n;
}
return 0;
UChar* target, UChar* target_end,
const UChar* text, const UChar* text_end, UChar* text_range)
{
- UChar *s, *end;
-
- end = (UChar* )text_end;
- end -= target_end - target - 1;
- if (end > text_range)
- end = text_range;
+ UChar *s;
s = (UChar* )text;
- while (s < end) {
+ while (s < text_range) {
if (str_lower_case_match(enc, case_fold_flag, target, target_end,
s, text_end))
return s;