aboutsummaryrefslogtreecommitdiffstats
path: root/string.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-15 18:48:27 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-15 18:48:27 +0000
commit0831222a9135e0074b71d8f3890f94fdc78d61dc (patch)
treee76d7c76d7b7b55a0ac6afd72990e21a789d81cc /string.c
parent0040ed402063ef2c846bae09027d7ca4ea2215db (diff)
downloadruby-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.c53
1 files changed, 45 insertions, 8 deletions
diff --git a/string.c b/string.c
index 1d94ca29f7..345b59b8f7 100644
--- a/string.c
+++ b/string.c
@@ -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;