From 81fc1cf2017840d0786cf997b4d2a80f80060001 Mon Sep 17 00:00:00 2001 From: akr Date: Fri, 22 Feb 2008 06:52:54 +0000 Subject: * encoding.c (rb_enc_mbclen): return minlen instead of 1 when a character is not found properly. * string.c (rb_enc_strlen): round up string length with fixed multibyte encoding such as UTF-32. (rb_enc_strlen_cr): ditto. (rb_str_substr): fix substring with fixed multibyte encoding. (rb_str_justify): check number of characters. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15573 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- string.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'string.c') diff --git a/string.c b/string.c index 19e8072462..90ed51b108 100644 --- a/string.c +++ b/string.c @@ -618,7 +618,7 @@ rb_enc_strlen(const char *p, const char *e, rb_encoding *enc) const char *q; if (rb_enc_mbmaxlen(enc) == rb_enc_mbminlen(enc)) { - return (e - p) / rb_enc_mbminlen(enc); + return (e - p + rb_enc_mbminlen(enc) - 1) / rb_enc_mbminlen(enc); } else if (rb_enc_asciicompat(enc)) { c = 0; @@ -651,7 +651,7 @@ rb_enc_strlen_cr(const char *p, const char *e, rb_encoding *enc, int *cr) *cr = 0; if (rb_enc_mbmaxlen(enc) == rb_enc_mbminlen(enc)) { - return (e - p) / rb_enc_mbminlen(enc); + return (e - p + rb_enc_mbminlen(enc) - 1) / rb_enc_mbminlen(enc); } else if (rb_enc_asciicompat(enc)) { c = 0; @@ -1223,10 +1223,9 @@ rb_str_substr(VALUE str, long beg, long len) len = 0; } else if (rb_enc_mbmaxlen(enc) == rb_enc_mbminlen(enc)) { - long rest = (e - p) / rb_enc_mbmaxlen(enc); - if (len > rest) - len = rest; - else + if (len * rb_enc_mbmaxlen(enc) > e - p) + len = e - p; + else len *= rb_enc_mbmaxlen(enc); } else { @@ -5777,7 +5776,7 @@ rb_str_justify(int argc, VALUE *argv, VALUE str, char jflag) flen = RSTRING_LEN(pad); fclen = str_strlen(pad, enc); singlebyte = single_byte_optimizable(pad); - if (flen == 0) { + if (flen == 0 || fclen == 0) { rb_raise(rb_eArgError, "zero width padding"); } } -- cgit v1.2.3