[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]