* transcode.c (econv_primitive_convert): add output_size argument.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18548 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
9d4bb3b969
commit
5501d84ceb
@ -1,3 +1,7 @@
|
||||
Wed Aug 13 08:03:02 2008 Tanaka Akira <akr@fsij.org>
|
||||
|
||||
* transcode.c (econv_primitive_convert): add output_size argument.
|
||||
|
||||
Wed Aug 13 07:41:03 2008 Tanaka Akira <akr@fsij.org>
|
||||
|
||||
* transcode.c (rb_trans_conv): report last transcode_obuf_full.
|
||||
|
@ -7,7 +7,7 @@ class TestEncodingConverter < Test::Unit::TestCase
|
||||
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 @@ class TestEncodingConverter < Test::Unit::TestCase
|
||||
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)
|
||||
|
17
transcode.c
17
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);
|
||||
StringValue(output);
|
||||
rb_str_modify(output);
|
||||
output_size = NUM2LONG(output_size_v);
|
||||
flags = NUM2INT(flags_v);
|
||||
StringValue(output);
|
||||
StringValue(input);
|
||||
rb_str_modify(output);
|
||||
|
||||
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));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user