diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-02-15 18:48:27 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-02-15 18:48:27 +0000 |
commit | 0831222a9135e0074b71d8f3890f94fdc78d61dc (patch) | |
tree | e76d7c76d7b7b55a0ac6afd72990e21a789d81cc /string.c | |
parent | 0040ed402063ef2c846bae09027d7ca4ea2215db (diff) | |
download | ruby-0831222a9135e0074b71d8f3890f94fdc78d61dc.tar.gz |
* encoding.c (rb_enc_nth): moved to string.c.
* string.c (rb_enc_nth): moved from string.c. use search_nonascii
for ASCII compatible string.
(str_nth): wrong optimization removed to fix
"a".force_encoding("EUC-JP").slice!(0,10) returns
"a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15492 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 53 |
1 files changed, 45 insertions, 8 deletions
@@ -891,20 +891,57 @@ rb_str_s_try_convert(VALUE dummy, VALUE str) return rb_check_string_type(str); } +char* +rb_enc_nth(const char *p, const char *e, int nth, rb_encoding *enc) +{ + int c; + + if (rb_enc_mbmaxlen(enc) == 1) { + p += nth; + } + else if (rb_enc_mbmaxlen(enc) == rb_enc_mbminlen(enc)) { + p += nth * rb_enc_mbmaxlen(enc); + } + else if (rb_enc_asciicompat(enc)) { + const char *p2, *e2; + int n; + + while (p < e && 0 < nth) { + e2 = p + nth; + if (e < e2) + return (char *)e; + if (ISASCII(*p)) { + p2 = search_nonascii(p, e2); + if (!p2) + return (char *)e2; + nth -= p2 - p; + p = p2; + } + n = rb_enc_mbclen(p, e, enc); + p += n; + nth--; + } + if (nth != 0) + return (char *)e; + return (char *)p; + } + else { + for (c=0; p<e && nth--; c++) { + int n = rb_enc_mbclen(p, e, enc); + + p += n; + } + } + if (p > e) p = e; + return (char*)p; +} + static char* str_nth(const char *p, const char *e, int nth, rb_encoding *enc, int singlebyte) { if (singlebyte) p += nth; else { - if (rb_enc_asciicompat(enc)) { - const char *p2 = search_nonascii(p, e); - - if (!p2 || p + nth < p2) - return (char*)p + nth; - nth -= p2 - p; - p = p2; - } p = rb_enc_nth(p, e, nth, enc); } if (!p) return 0; |