mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
string.c: skip invalid char gap
* string.c (enc_succ_alnum_char): try to skip an invalid character gap between GREEK CAPITAL RHO and SIGMA. [ruby-core:74478] [Bug #12204] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54210 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
90c543e483
commit
0f32783976
3 changed files with 22 additions and 5 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
Mon Mar 21 19:09:31 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* string.c (enc_succ_alnum_char): try to skip an invalid character
|
||||||
|
gap between GREEK CAPITAL RHO and SIGMA.
|
||||||
|
[ruby-core:74478] [Bug #12204]
|
||||||
|
|
||||||
Mon Mar 21 18:55:49 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Mon Mar 21 18:55:49 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* node.c (rb_gc_mark_node): NODE_MATCH2 can have nd_args, u3,
|
* node.c (rb_gc_mark_node): NODE_MATCH2 can have nd_args, u3,
|
||||||
|
|
16
string.c
16
string.c
|
@ -3552,6 +3552,10 @@ enc_succ_alnum_char(char *p, long len, rb_encoding *enc, char *carry)
|
||||||
int range;
|
int range;
|
||||||
char save[ONIGENC_CODE_TO_MBC_MAXLEN];
|
char save[ONIGENC_CODE_TO_MBC_MAXLEN];
|
||||||
|
|
||||||
|
/* skip 03A2, invalid char between GREEK CAPITAL LETTERS */
|
||||||
|
int try;
|
||||||
|
const int max_gaps = 1;
|
||||||
|
|
||||||
c = rb_enc_mbc_to_codepoint(p, p+len, enc);
|
c = rb_enc_mbc_to_codepoint(p, p+len, enc);
|
||||||
if (rb_enc_isctype(c, ONIGENC_CTYPE_DIGIT, enc))
|
if (rb_enc_isctype(c, ONIGENC_CTYPE_DIGIT, enc))
|
||||||
ctype = ONIGENC_CTYPE_DIGIT;
|
ctype = ONIGENC_CTYPE_DIGIT;
|
||||||
|
@ -3561,11 +3565,13 @@ enc_succ_alnum_char(char *p, long len, rb_encoding *enc, char *carry)
|
||||||
return NEIGHBOR_NOT_CHAR;
|
return NEIGHBOR_NOT_CHAR;
|
||||||
|
|
||||||
MEMCPY(save, p, char, len);
|
MEMCPY(save, p, char, len);
|
||||||
ret = enc_succ_char(p, len, enc);
|
for (try = 0; try <= max_gaps; ++try) {
|
||||||
if (ret == NEIGHBOR_FOUND) {
|
ret = enc_succ_char(p, len, enc);
|
||||||
c = rb_enc_mbc_to_codepoint(p, p+len, enc);
|
if (ret == NEIGHBOR_FOUND) {
|
||||||
if (rb_enc_isctype(c, ctype, enc))
|
c = rb_enc_mbc_to_codepoint(p, p+len, enc);
|
||||||
return NEIGHBOR_FOUND;
|
if (rb_enc_isctype(c, ctype, enc))
|
||||||
|
return NEIGHBOR_FOUND;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
MEMCPY(p, save, char, len);
|
MEMCPY(p, save, char, len);
|
||||||
range = 1;
|
range = 1;
|
||||||
|
|
|
@ -1678,4 +1678,9 @@ class TestM17N < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
assert_equal(e("[\"\xB4\xC1\xBB\xFA\"]"), s, bug11787)
|
assert_equal(e("[\"\xB4\xC1\xBB\xFA\"]"), s, bug11787)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_greek_capital_gap
|
||||||
|
bug12204 = '[ruby-core:74478] [Bug #12204] GREEK CAPITAL RHO and SIGMA'
|
||||||
|
assert_equal("\u03A3", "\u03A1".succ, bug12204)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue