diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-18 05:44:30 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-18 05:44:30 +0000 |
commit | a3a6ba958429dd6baa7916a0dbcbd0865376d07a (patch) | |
tree | 81ceba5023689beff323d380762be296b422023e | |
parent | 874b367bdc09664e209fb163c354bb62168c9317 (diff) | |
download | ruby-a3a6ba958429dd6baa7916a0dbcbd0865376d07a.tar.gz |
* string.c (str_nth): need not to raise out-of-range exception.
* test/ruby/test_m17n.rb (TestM17N::test_str_aref_len): removed
debug print.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14287 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | string.c | 22 | ||||
-rw-r--r-- | test/ruby/test_m17n.rb | 1 |
3 files changed, 17 insertions, 13 deletions
@@ -1,3 +1,10 @@ +Tue Dec 18 14:39:05 2007 Yukihiro Matsumoto <matz@ruby-lang.org> + + * string.c (str_nth): need not to raise out-of-range exception. + + * test/ruby/test_m17n.rb (TestM17N::test_str_aref_len): removed + debug print. + Tue Dec 18 14:05:23 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> * enc/depend: get rid of target expanded as empty for nmake. @@ -746,26 +746,22 @@ rb_str_s_try_convert(VALUE dummy, VALUE str) } static char* -str_nth(const char *p, const char *e, int nth, rb_encoding *enc, int asc) +str_nth(char *p, char *e, int nth, rb_encoding *enc, int asc) { if (asc) p += nth; else p = rb_enc_nth(p, e, nth, enc); - if (!p) { - rb_raise(rb_eArgError, "invalid mbstring sequence"); - } - if (p > e) { - rb_raise(rb_eIndexError, "index out of range"); - } - return (char*)p; + if (!p) return 0; + if (p > e) return e; + return p; } static int -str_offset(const char *p, const char *e, int nth, rb_encoding *enc, int asc) +str_offset(char *p, char *e, int nth, rb_encoding *enc, int asc) { const char *pp = str_nth(p, e, nth, enc, asc); - + if (!pp) return e - p; return pp - p; } @@ -1456,8 +1452,7 @@ rb_str_index(VALUE str, VALUE sub, long offset) if (len - offset < slen) return -1; s = RSTRING_PTR(str); if (offset) { - s = str_nth(s, RSTRING_END(str), offset, enc, IS_7BIT(str)); - offset = s - RSTRING_PTR(str); + offset = str_offset(s, RSTRING_END(str), offset, enc, IS_7BIT(str)); } if (slen == 0) return offset; /* need proceed one character at a time */ @@ -1575,6 +1570,7 @@ rb_str_rindex(VALUE str, VALUE sub, long pos) t = RSTRING_PTR(sub); for (;;) { s = str_nth(sbeg, e, pos, enc, asc); + if (!s) return -1; if (memcmp(s, t, slen) == 0) { return pos; } @@ -2139,7 +2135,9 @@ rb_str_splice(VALUE str, long beg, long len, VALUE val) len = slen - beg; } p = str_nth(RSTRING_PTR(str), RSTRING_END(str), beg, enc, asc); + if (!p) p = RSTRING_END(str); e = str_nth(p, RSTRING_END(str), len, enc, asc); + if (!e) e = RSTRING_END(str); /* error check */ beg = p - RSTRING_PTR(str); /* physical position */ len = e - p; /* physical length */ diff --git a/test/ruby/test_m17n.rb b/test/ruby/test_m17n.rb index df0543018d..cf9df11b8c 100644 --- a/test/ruby/test_m17n.rb +++ b/test/ruby/test_m17n.rb @@ -695,7 +695,6 @@ class TestM17N < Test::Unit::TestCase STRINGS.each {|s| t = '' 0.step(s.length-1, 2) {|i| - p [s,s.encoding,i] t << s[i,2] } assert_equal(t, s) |