From 7ce11f57edb0ced7e192e6926a4fe991e331e776 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 6 Sep 2013 02:45:50 +0000 Subject: transcode.c: add rb_econv_append * transcode.c (rb_econv_append): new function to append a string data with converting its encoding. split from rb_econv_substr_append. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42853 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- transcode.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'transcode.c') diff --git a/transcode.c b/transcode.c index 4a810a1b42..95ef566b45 100644 --- a/transcode.c +++ b/transcode.c @@ -1810,9 +1810,9 @@ rb_econv_asciicompat_encoding(const char *ascii_incompat_name) } VALUE -rb_econv_substr_append(rb_econv_t *ec, VALUE src, long off, long len, VALUE dst, int flags) +rb_econv_append(rb_econv_t *ec, const char *ss, long len, VALUE dst, int flags) { - unsigned const char *ss, *sp, *se; + unsigned const char *sp, *se; unsigned char *ds, *dp, *de; rb_econv_result_t res; int max_output; @@ -1837,18 +1837,26 @@ rb_econv_substr_append(rb_econv_t *ec, VALUE src, long off, long len, VALUE dst, rb_str_resize(dst, new_capa); rb_str_set_len(dst, dlen); } - ss = sp = (const unsigned char *)RSTRING_PTR(src) + off; - se = ss + len; + sp = (const unsigned char *)ss; + se = sp + len; ds = (unsigned char *)RSTRING_PTR(dst); de = ds + rb_str_capacity(dst); dp = ds += dlen; res = rb_econv_convert(ec, &sp, se, &dp, de, flags); - off += sp - ss; - len -= sp - ss; + len -= (const char *)sp - ss; + ss = (const char *)sp; rb_str_set_len(dst, dlen + (dp - ds)); rb_econv_check_error(ec); } while (res == econv_destination_buffer_full); + return dst; +} + +VALUE +rb_econv_substr_append(rb_econv_t *ec, VALUE src, long off, long len, VALUE dst, int flags) +{ + src = rb_str_new_frozen(src); + dst = rb_econv_append(ec, RSTRING_PTR(src) + off, len, dst, flags); RB_GC_GUARD(src); return dst; } -- cgit v1.2.3