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 /transcode.c | |
| parent | 51c7947bdeac3bb9e80dfd104ab3352fb57ce1b0 (diff) | |
* 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
Diffstat (limited to 'transcode.c')
| -rw-r--r-- | transcode.c | 45 |
1 files changed, 33 insertions, 12 deletions
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; |
