Skip to content

Commit

Permalink
* regexec.c (string_cmp_ic): add text_end argument.
Browse files Browse the repository at this point in the history
  (slow_search): call enclen with real string end.
  (map_search): add text_end argument.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19421 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
akr committed Sep 18, 2008
1 parent f0c8c9d commit 478b14e
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 16 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
Fri Sep 19 01:07:36 2008 Tanaka Akira <[email protected]>

* regexec.c (string_cmp_ic): add text_end argument.
(slow_search): call enclen with real string end.
(map_search): add text_end argument.

Thu Sep 18 22:54:39 2008 Yusuke Endoh <[email protected]>

* ext/openssl/ossl_pkey_ec.c (ossl_ec_key_to_string): comment out
Expand Down
31 changes: 15 additions & 16 deletions regexec.c
Original file line number Diff line number Diff line change
Expand Up @@ -977,25 +977,24 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end,
}\
} while(0)

#define STRING_CMP_IC(case_fold_flag,s1,ps2,len) do {\
if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len) == 0) \
#define STRING_CMP_IC(case_fold_flag,s1,ps2,len,text_end) do {\
if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len, text_end) == 0) \
goto fail; \
} while(0)

static int string_cmp_ic(OnigEncoding enc, int case_fold_flag,
UChar* s1, UChar** ps2, int mblen)
UChar* s1, UChar** ps2, int mblen, const UChar* text_end)
{
UChar buf1[ONIGENC_MBC_CASE_FOLD_MAXLEN];
UChar buf2[ONIGENC_MBC_CASE_FOLD_MAXLEN];
UChar *p1, *p2, *end1, *s2, *end2;
UChar *p1, *p2, *end1, *s2;
int len1, len2;

s2 = *ps2;
end1 = s1 + mblen;
end2 = s2 + mblen;
while (s1 < end1) {
len1 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s1, end1, buf1);
len2 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s2, end2, buf2);
len1 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s1, text_end, buf1);
len2 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s2, text_end, buf2);
if (len1 != len2) return 0;
p1 = buf1;
p2 = buf2;
Expand All @@ -1019,8 +1018,8 @@ static int string_cmp_ic(OnigEncoding enc, int case_fold_flag,
}\
} while(0)

#define STRING_CMP_VALUE_IC(case_fold_flag,s1,ps2,len,is_fail) do {\
if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len) == 0) \
#define STRING_CMP_VALUE_IC(case_fold_flag,s1,ps2,len,text_end,is_fail) do {\
if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len, text_end) == 0) \
is_fail = 1; \
else \
is_fail = 0; \
Expand Down Expand Up @@ -1126,7 +1125,7 @@ static int backref_match_at_nested_level(regex_t* reg

if (ignore_case != 0) {
if (string_cmp_ic(reg->enc, case_fold_flag,
pstart, &ss, (int )(pend - pstart)) == 0)
pstart, &ss, (int )(pend - pstart), send) == 0)
return 0; /* or goto next_mem; */
}
else {
Expand Down Expand Up @@ -2199,7 +2198,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
n = pend - pstart;
DATA_ENSURE(n);
sprev = s;
STRING_CMP_IC(case_fold_flag, pstart, &s, n);
STRING_CMP_IC(case_fold_flag, pstart, &s, n, end);
while (sprev + (len = enclen(encode, sprev, end)) < s)
sprev += len;

Expand Down Expand Up @@ -2271,7 +2270,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
DATA_ENSURE(n);
sprev = s;
swork = s;
STRING_CMP_VALUE_IC(case_fold_flag, pstart, &swork, n, is_fail);
STRING_CMP_VALUE_IC(case_fold_flag, pstart, &swork, n, end, is_fail);
if (is_fail) continue;
s = swork;
while (sprev + (len = enclen(encode, sprev, end)) < s)
Expand Down Expand Up @@ -2780,7 +2779,7 @@ slow_search(OnigEncoding enc, UChar* target, UChar* target_end,
if (target_end == t || memcmp(t, p, target_end - t) == 0)
return s;
}
s += enclen(enc, s, end);
s += enclen(enc, s, text_end);
}

return (UChar* )NULL;
Expand Down Expand Up @@ -3038,14 +3037,14 @@ bm_search_backward(regex_t* reg, const UChar* target, const UChar* target_end,

static UChar*
map_search(OnigEncoding enc, UChar map[],
const UChar* text, const UChar* text_range)
const UChar* text, const UChar* text_range, const UChar* text_end)
{
const UChar *s = text;

while (s < text_range) {
if (map[*s]) return (UChar* )s;

s += enclen(enc, s, text_range);
s += enclen(enc, s, text_end);
}
return (UChar* )NULL;
}
Expand Down Expand Up @@ -3171,7 +3170,7 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
break;

case ONIG_OPTIMIZE_MAP:
p = map_search(reg->enc, reg->map, p, range);
p = map_search(reg->enc, reg->map, p, range, end);
break;
}

Expand Down
4 changes: 4 additions & 0 deletions test/ruby/enc/test_euc_jp.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,8 @@ def test_property
assert_no_match(/あ{0}\p{Katakana}{4}/, "漢字漢字")
assert_raise(RegexpError) { Regexp.new('あ{0}\p{foobarbaz}') }
end

def test_charboundary
assert_nil(/\xA2\xA2/ =~ "\xA1\xA2\xA2\xA3")
end
end

0 comments on commit 478b14e

Please sign in to comment.