diff options
| author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-12 23:03:46 +0000 |
|---|---|---|
| committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-12 23:03:46 +0000 |
| commit | 0e22ee324e4bd92c0dbd3eae554fe12185235579 (patch) | |
| tree | 230b2fe7acd7bff8f01d1fc01a0fb9f168ef6b8d /transcode.c | |
| parent | 11725d704cfb42f429764bccab40e4d43639a5a8 (diff) | |
| download | ruby-0e22ee324e4bd92c0dbd3eae554fe12185235579.tar.gz ruby-0e22ee324e4bd92c0dbd3eae554fe12185235579.tar.xz ruby-0e22ee324e4bd92c0dbd3eae554fe12185235579.zip | |
* transcode.c (econv_primitive_convert): add output_size argument.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@18548 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'transcode.c')
| -rw-r--r-- | transcode.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/transcode.c b/transcode.c index 478b52ae5..ce0a67012 100644 --- a/transcode.c +++ b/transcode.c @@ -1263,24 +1263,29 @@ check_econv(VALUE self) } static VALUE -econv_primitive_convert(VALUE self, VALUE input, VALUE output, VALUE flags_v) +econv_primitive_convert(VALUE self, VALUE input, VALUE output, VALUE output_size_v, VALUE flags_v) { rb_trans_t *ts = check_econv(self); rb_trans_result_t res; const unsigned char *ip, *is; unsigned char *op, *os; + long output_size; int flags; - StringValue(input); + output_size = NUM2LONG(output_size_v); + flags = NUM2INT(flags_v); StringValue(output); + StringValue(input); rb_str_modify(output); - flags = NUM2INT(flags_v); + + if (rb_str_capacity(output) < output_size) + rb_str_resize(output, output_size); ip = (const unsigned char *)RSTRING_PTR(input); is = ip + RSTRING_LEN(input); op = (unsigned char *)RSTRING_PTR(output); - os = op + RSTRING_LEN(output); + os = op + output_size; res = rb_trans_conv(ts, &ip, is, &op, os, flags); rb_str_set_len(output, op-(unsigned char *)RSTRING_PTR(output)); @@ -1325,7 +1330,7 @@ Init_transcode(void) rb_cEncodingConverter = rb_define_class_under(rb_cEncoding, "Converter", rb_cData); rb_define_alloc_func(rb_cEncodingConverter, econv_s_allocate); rb_define_method(rb_cEncodingConverter, "initialize", econv_init, 2); - rb_define_method(rb_cEncodingConverter, "primitive_convert", econv_primitive_convert, 3); + rb_define_method(rb_cEncodingConverter, "primitive_convert", econv_primitive_convert, 4); rb_define_method(rb_cEncodingConverter, "max_output", econv_max_output, 0); rb_define_const(rb_cEncodingConverter, "PARTIAL_INPUT", INT2FIX(PARTIAL_INPUT)); } |
