aboutsummaryrefslogtreecommitdiffstats
path: root/transcode.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-14 12:35:19 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-14 12:35:19 +0000
commita6daaf16b063d0a0870d1ef0e42df1d4338b02f4 (patch)
tree37993a6a284f0b845abea31759cada2cfabeba6a /transcode.c
parentd46728ec0e134c47a9cf7b1f63d5a0c88902162e (diff)
downloadruby-a6daaf16b063d0a0870d1ef0e42df1d4338b02f4.tar.gz
* transcode.c (econv_init): accept Encoding object as source_encoding
and destination_encoding. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18623 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'transcode.c')
-rw-r--r--transcode.c40
1 files changed, 28 insertions, 12 deletions
diff --git a/transcode.c b/transcode.c
index e7277be4fd..268363b418 100644
--- a/transcode.c
+++ b/transcode.c
@@ -1412,33 +1412,49 @@ econv_s_allocate(VALUE klass)
static VALUE
econv_init(int argc, VALUE *argv, VALUE self)
{
- VALUE from_encoding, to_encoding, flags_v;
- const char *from_e, *to_e;
- rb_econv_t *ts;
+ VALUE source_encoding, destination_encoding, flags_v;
+ rb_encoding *senc, *denc;
+ const char *sname, *dname;
+ rb_econv_t *ec;
int flags;
- rb_scan_args(argc, argv, "21", &from_encoding, &to_encoding, &flags_v);
+ rb_scan_args(argc, argv, "21", &source_encoding, &destination_encoding, &flags_v);
- StringValue(from_encoding);
- StringValue(to_encoding);
if (flags_v == Qnil)
flags = 0;
else
flags = NUM2INT(flags_v);
- from_e = RSTRING_PTR(from_encoding);
- to_e = RSTRING_PTR(to_encoding);
+ senc = NULL;
+ if (TYPE(source_encoding) != T_STRING) {
+ senc = rb_to_encoding(source_encoding);
+ }
+
+ denc = NULL;
+ if (TYPE(destination_encoding) != T_STRING) {
+ denc = rb_to_encoding(destination_encoding);
+ }
+
+ if (senc)
+ sname = senc->name;
+ else
+ sname = RSTRING_PTR(source_encoding);
+
+ if (denc)
+ dname = denc->name;
+ else
+ dname = RSTRING_PTR(destination_encoding);
if (DATA_PTR(self)) {
rb_raise(rb_eTypeError, "already initialized");
}
- ts = rb_econv_open(from_e, to_e, flags);
- if (!ts) {
- rb_raise(rb_eArgError, "encoding convewrter not supported (from %s to %s)", from_e, to_e);
+ ec = rb_econv_open(sname, dname, flags);
+ if (!ec) {
+ rb_raise(rb_eArgError, "encoding convewrter not supported (from %s to %s)", sname, dname);
}
- DATA_PTR(self) = ts;
+ DATA_PTR(self) = ec;
return self;
}