summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-08-29 19:16:02 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-08-29 19:16:02 +0000
commit3d7f8c2320d13fcc0c12e8910d70a812dab2f681 (patch)
treef1e5efc85efec12556c8e6a27dda8e550172a9e7 /string.c
parent24385e708ec111dc199c27d937c04656d6f8e6d9 (diff)
* string.c (str_gsub): should not use mbclen2() which has broken API.
* re.c: remove rb_reg_mbclen2(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13308 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/string.c b/string.c
index dc0796b130..e60e5ff4b0 100644
--- a/string.c
+++ b/string.c
@@ -2244,7 +2244,8 @@ str_gsub(int argc, VALUE *argv, VALUE str, int bang)
int iter = 0;
char *buf, *bp, *sp, *cp;
int tainted = 0;
-
+ rb_encoding *enc;
+
switch (argc) {
case 1:
RETURN_ENUMERATOR(str, argc, argv);
@@ -2260,6 +2261,7 @@ str_gsub(int argc, VALUE *argv, VALUE str, int bang)
}
pat = get_pat(argv[0], 1);
+ enc = rb_enc_get(pat);
offset=0; n=0;
beg = rb_reg_search(pat, str, 0, 0);
if (beg < 0) {
@@ -2314,7 +2316,7 @@ str_gsub(int argc, VALUE *argv, VALUE str, int bang)
* in order to prevent infinite loops.
*/
if (RSTRING_LEN(str) <= END(0)) break;
- len = mbclen2(RSTRING_PTR(str)[END(0)], pat);
+ len = rb_enc_mbclen(RSTRING_PTR(str)+END(0), enc);
memcpy(bp, RSTRING_PTR(str)+END(0), len);
bp += len;
offset = END(0) + len;