ruby-changes:7030
From: akr <ko1@a...>
Date: Wed, 13 Aug 2008 08:06:55 +0900 (JST)
Subject: [ruby-changes:7030] Ruby:r18548 (trunk): * transcode.c (econv_primitive_convert): add output_size argument.
akr 2008-08-13 08:03:46 +0900 (Wed, 13 Aug 2008) New Revision: 18548 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18548 Log: * transcode.c (econv_primitive_convert): add output_size argument. Modified files: trunk/ChangeLog trunk/test/ruby/test_econv.rb trunk/transcode.c Index: ChangeLog =================================================================== --- ChangeLog (revision 18547) +++ ChangeLog (revision 18548) @@ -1,3 +1,7 @@ +Wed Aug 13 08:03:02 2008 Tanaka Akira <akr@f...> + + * transcode.c (econv_primitive_convert): add output_size argument. + Wed Aug 13 07:41:03 2008 Tanaka Akira <akr@f...> * transcode.c (rb_trans_conv): report last transcode_obuf_full. Index: test/ruby/test_econv.rb =================================================================== --- test/ruby/test_econv.rb (revision 18547) +++ test/ruby/test_econv.rb (revision 18548) @@ -7,7 +7,7 @@ ec = Encoding::Converter.new(from, to) dst = '' while true - ret = ec.primitive_convert(src, dst2=" "*opt[:obuf_len], 0) + ret = ec.primitive_convert(src, dst2="", opt[:obuf_len], 0) dst << dst2 #p [ret, dst, src] break if ret != :obuf_full @@ -37,15 +37,15 @@ def test_errors ec = Encoding::Converter.new("UTF-16BE", "EUC-JP") src = "\xFF\xFE\x00A\xDC\x00" - ret = ec.primitive_convert(src, dst=" "*10, 0) + ret = ec.primitive_convert(src, dst="", 10, 0) assert_equal("", src) assert_equal("", dst) - assert_equal(:undefined_conversion, ret) - ret = ec.primitive_convert(src, dst=" "*10, 0) + assert_equal(:undefined_conversion, ret) # \xFF\xFE is not representable in EUC-JP + ret = ec.primitive_convert(src, dst="", 10, 0) assert_equal("", src) assert_equal("A", dst) - assert_equal(:invalid_input, ret) - ret = ec.primitive_convert(src, dst=" "*10, 0) + assert_equal(:invalid_input, ret) # \xDC\x00 is invalid as UTF-16BE + ret = ec.primitive_convert(src, dst="", 10, 0) assert_equal("", src) assert_equal("", dst) assert_equal(:finished, ret) Index: transcode.c =================================================================== --- transcode.c (revision 18547) +++ transcode.c (revision 18548) @@ -1263,24 +1263,29 @@ } 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; + output_size = NUM2LONG(output_size_v); + flags = NUM2INT(flags_v); + StringValue(output); StringValue(input); - StringValue(output); 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 @@ 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)); } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/