diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-15 00:05:06 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-15 00:05:06 +0000 |
commit | 520cd6d186fd0753e052fd153fc2c5b764cb9aee (patch) | |
tree | b6bff4e98745c435ac57140cab7b930efd5f045c | |
parent | 51c7947bdeac3bb9e80dfd104ab3352fb57ce1b0 (diff) | |
download | ruby-520cd6d186fd0753e052fd153fc2c5b764cb9aee.tar.gz |
* transcode.c (econv_init): don't create dummy encoding if
rb_econv_open is failed.
(make_dummy_encoding): new function extracted from make_encoding.
(make_encoding): removed.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18634 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | test/ruby/test_econv.rb | 13 | ||||
-rw-r--r-- | transcode.c | 45 |
3 files changed, 53 insertions, 12 deletions
@@ -1,3 +1,10 @@ +Fri Aug 15 09:03:54 2008 Tanaka Akira <akr@fsij.org> + + * transcode.c (econv_init): don't create dummy encoding if + rb_econv_open is failed. + (make_dummy_encoding): new function extracted from make_encoding. + (make_encoding): removed. + Fri Aug 15 01:07:16 2008 NARUSE, Yui <naruse@ruby-lang.org> * common.mk ({$(srcdir)}.y.c): escape backslash. diff --git a/test/ruby/test_econv.rb b/test/ruby/test_econv.rb index af846ad45b..738be01e8c 100644 --- a/test/ruby/test_econv.rb +++ b/test/ruby/test_econv.rb @@ -25,6 +25,19 @@ class TestEncodingConverter < Test::Unit::TestCase assert_kind_of(Encoding::Converter, Encoding::Converter.new(Encoding::UTF_8, Encoding::EUC_JP)) end + def test_new_fail + name1 = "encoding-which-is-not-exist-1" + name2 = "encoding-which-is-not-exist-2" + + assert_raise(ArgumentError) { + Encoding::Converter.new(name1, name2) + } + + encoding_list = Encoding.list.map {|e| e.name } + assert(!encoding_list.include?(name1)) + assert(!encoding_list.include?(name2)) + end + def test_get_encoding ec = Encoding::Converter.new("UTF-8", "EUC-JP") assert_equal(Encoding::UTF_8, ec.source_encoding) diff --git a/transcode.c b/transcode.c index 2af60b9a7d..b7f222ad74 100644 --- a/transcode.c +++ b/transcode.c @@ -1413,16 +1413,12 @@ econv_s_allocate(VALUE klass) } static rb_encoding * -make_encoding(VALUE encoding) +make_dummy_encoding(const char *name) { - int idx = rb_to_encoding_index(encoding); rb_encoding *enc; - if (0 <= idx) - enc = rb_enc_from_index(idx); - else { - idx = rb_define_dummy_encoding(StringValueCStr(encoding)); - enc = rb_enc_from_index(idx); - } + int idx; + idx = rb_define_dummy_encoding(name); + enc = rb_enc_from_index(idx); return enc; } @@ -1458,6 +1454,8 @@ static VALUE econv_init(int argc, VALUE *argv, VALUE self) { VALUE source_encoding, destination_encoding, flags_v; + int sidx, didx; + const char *sname, *dname; rb_encoding *senc, *denc; rb_econv_t *ec; int flags; @@ -1469,18 +1467,41 @@ econv_init(int argc, VALUE *argv, VALUE self) else flags = NUM2INT(flags_v); - senc = make_encoding(source_encoding); - denc = make_encoding(destination_encoding); + senc = NULL; + sidx = rb_to_encoding_index(source_encoding); + if (0 <= sidx) { + senc = rb_enc_from_index(sidx); + } + else { + StringValue(source_encoding); + } + + denc = NULL; + didx = rb_to_encoding_index(destination_encoding); + if (0 <= didx) { + denc = rb_enc_from_index(didx); + } + else { + StringValue(destination_encoding); + } + + sname = senc ? senc->name : StringValueCStr(source_encoding); + dname = denc ? denc->name : StringValueCStr(destination_encoding); if (DATA_PTR(self)) { rb_raise(rb_eTypeError, "already initialized"); } - ec = rb_econv_open(senc->name, denc->name, flags); + ec = rb_econv_open(sname, dname, flags); if (!ec) { - rb_raise(rb_eArgError, "encoding convewrter not supported (from %s to %s)", senc->name, denc->name); + rb_raise(rb_eArgError, "encoding convewrter not supported (from %s to %s)", sname, dname); } + if (!senc) + senc = make_dummy_encoding(sname); + if (!denc) + denc = make_dummy_encoding(dname); + ec->source_encoding = senc; ec->destination_encoding = denc; |