* transcode.c (econv_init): make flags argument optional.

(econv_primitive_convert): ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18562 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2008-08-13 06:08:56 +00:00
parent eb8e0dc10e
commit 4aa251999d
3 changed files with 31 additions and 14 deletions

View File

@ -1,3 +1,8 @@
Wed Aug 13 15:08:04 2008 Tanaka Akira <akr@fsij.org>
* transcode.c (econv_init): make flags argument optional.
(econv_primitive_convert): ditto.
Wed Aug 13 14:55:27 2008 Akinori MUSHA <knu@iDaemons.org> Wed Aug 13 14:55:27 2008 Akinori MUSHA <knu@iDaemons.org>
* common.mk (realclean-local): Remove parse.h as well. * common.mk (realclean-local): Remove parse.h as well.

View File

@ -4,10 +4,10 @@ class TestEncodingConverter < Test::Unit::TestCase
def assert_econv(ret_expected, dst_expected, src_expected, to, from, src, opt={}) def assert_econv(ret_expected, dst_expected, src_expected, to, from, src, opt={})
opt[:obuf_len] ||= 100 opt[:obuf_len] ||= 100
src = src.dup src = src.dup
ec = Encoding::Converter.new(from, to, 0) ec = Encoding::Converter.new(from, to)
dst = '' dst = ''
while true while true
ret = ec.primitive_convert(src, dst2="", opt[:obuf_len], 0) ret = ec.primitive_convert(src, dst2="", opt[:obuf_len])
dst << dst2 dst << dst2
#p [ret, dst, src] #p [ret, dst, src]
break if ret != :obuf_full break if ret != :obuf_full
@ -35,17 +35,17 @@ class TestEncodingConverter < Test::Unit::TestCase
end end
def test_errors def test_errors
ec = Encoding::Converter.new("UTF-16BE", "EUC-JP", 0) ec = Encoding::Converter.new("UTF-16BE", "EUC-JP")
src = "\xFF\xFE\x00A\xDC\x00" src = "\xFF\xFE\x00A\xDC\x00"
ret = ec.primitive_convert(src, dst="", 10, 0) ret = ec.primitive_convert(src, dst="", 10)
assert_equal("", src) assert_equal("", src)
assert_equal("", dst) assert_equal("", dst)
assert_equal(:undefined_conversion, ret) # \xFF\xFE is not representable in EUC-JP assert_equal(:undefined_conversion, ret) # \xFF\xFE is not representable in EUC-JP
ret = ec.primitive_convert(src, dst="", 10, 0) ret = ec.primitive_convert(src, dst="", 10)
assert_equal("", src) assert_equal("", src)
assert_equal("A", dst) assert_equal("A", dst)
assert_equal(:invalid_input, ret) # \xDC\x00 is invalid as UTF-16BE assert_equal(:invalid_input, ret) # \xDC\x00 is invalid as UTF-16BE
ret = ec.primitive_convert(src, dst="", 10, 0) ret = ec.primitive_convert(src, dst="", 10)
assert_equal("", src) assert_equal("", src)
assert_equal("", dst) assert_equal("", dst)
assert_equal(:finished, ret) assert_equal(:finished, ret)
@ -67,13 +67,13 @@ class TestEncodingConverter < Test::Unit::TestCase
def test_crlf_newline def test_crlf_newline
ec = Encoding::Converter.new("UTF-8", "EUC-JP", Encoding::Converter::CRLF_NEWLINE) ec = Encoding::Converter.new("UTF-8", "EUC-JP", Encoding::Converter::CRLF_NEWLINE)
ret = ec.primitive_convert(src="abc\ndef", dst="", 50, 0) ret = ec.primitive_convert(src="abc\ndef", dst="", 50)
assert_equal([:finished, "", "abc\r\ndef"], [ret, src, dst]) assert_equal([:finished, "", "abc\r\ndef"], [ret, src, dst])
end end
def test_cr_newline def test_cr_newline
ec = Encoding::Converter.new("UTF-8", "EUC-JP", Encoding::Converter::CR_NEWLINE) ec = Encoding::Converter.new("UTF-8", "EUC-JP", Encoding::Converter::CR_NEWLINE)
ret = ec.primitive_convert(src="abc\ndef", dst="", 50, 0) ret = ec.primitive_convert(src="abc\ndef", dst="", 50)
assert_equal([:finished, "", "abc\rdef"], [ret, src, dst]) assert_equal([:finished, "", "abc\rdef"], [ret, src, dst])
end end
end end

View File

@ -1290,15 +1290,21 @@ econv_s_allocate(VALUE klass)
} }
static VALUE static VALUE
econv_init(VALUE self, VALUE from_encoding, VALUE to_encoding, VALUE flags_v) econv_init(int argc, VALUE *argv, VALUE self)
{ {
VALUE from_encoding, to_encoding, flags_v;
const char *from_e, *to_e; const char *from_e, *to_e;
rb_trans_t *ts; rb_trans_t *ts;
int flags; int flags;
rb_scan_args(argc, argv, "21", &from_encoding, &to_encoding, &flags_v);
StringValue(from_encoding); StringValue(from_encoding);
StringValue(to_encoding); StringValue(to_encoding);
flags = NUM2INT(flags_v); if (flags_v == Qnil)
flags = 0;
else
flags = NUM2INT(flags_v);
from_e = RSTRING_PTR(from_encoding); from_e = RSTRING_PTR(from_encoding);
to_e = RSTRING_PTR(to_encoding); to_e = RSTRING_PTR(to_encoding);
@ -1331,8 +1337,9 @@ check_econv(VALUE self)
} }
static VALUE static VALUE
econv_primitive_convert(VALUE self, VALUE input, VALUE output, VALUE output_size_v, VALUE flags_v) econv_primitive_convert(int argc, VALUE *argv, VALUE self)
{ {
VALUE input, output, output_size_v, flags_v;
rb_trans_t *ts = check_econv(self); rb_trans_t *ts = check_econv(self);
rb_trans_result_t res; rb_trans_result_t res;
const unsigned char *ip, *is; const unsigned char *ip, *is;
@ -1340,8 +1347,13 @@ econv_primitive_convert(VALUE self, VALUE input, VALUE output, VALUE output_size
long output_size; long output_size;
int flags; int flags;
rb_scan_args(argc, argv, "31", &input, &output, &output_size_v, &flags_v);
output_size = NUM2LONG(output_size_v); output_size = NUM2LONG(output_size_v);
flags = NUM2INT(flags_v); if (flags_v == Qnil)
flags = 0;
else
flags = NUM2INT(flags_v);
StringValue(output); StringValue(output);
StringValue(input); StringValue(input);
rb_str_modify(output); rb_str_modify(output);
@ -1397,8 +1409,8 @@ Init_transcode(void)
rb_cEncodingConverter = rb_define_class_under(rb_cEncoding, "Converter", rb_cData); rb_cEncodingConverter = rb_define_class_under(rb_cEncoding, "Converter", rb_cData);
rb_define_alloc_func(rb_cEncodingConverter, econv_s_allocate); rb_define_alloc_func(rb_cEncodingConverter, econv_s_allocate);
rb_define_method(rb_cEncodingConverter, "initialize", econv_init, 3); rb_define_method(rb_cEncodingConverter, "initialize", econv_init, -1);
rb_define_method(rb_cEncodingConverter, "primitive_convert", econv_primitive_convert, 4); rb_define_method(rb_cEncodingConverter, "primitive_convert", econv_primitive_convert, -1);
rb_define_method(rb_cEncodingConverter, "max_output", econv_max_output, 0); rb_define_method(rb_cEncodingConverter, "max_output", econv_max_output, 0);
rb_define_const(rb_cEncodingConverter, "PARTIAL_INPUT", INT2FIX(PARTIAL_INPUT)); rb_define_const(rb_cEncodingConverter, "PARTIAL_INPUT", INT2FIX(PARTIAL_INPUT));
rb_define_const(rb_cEncodingConverter, "UNIVERSAL_NEWLINE", INT2FIX(UNIVERSAL_NEWLINE)); rb_define_const(rb_cEncodingConverter, "UNIVERSAL_NEWLINE", INT2FIX(UNIVERSAL_NEWLINE));