diff options
Diffstat (limited to 'ext/kconv/kconv.c')
-rw-r--r-- | ext/kconv/kconv.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/ext/kconv/kconv.c b/ext/kconv/kconv.c index 6778afcfe6..5762e3531f 100644 --- a/ext/kconv/kconv.c +++ b/ext/kconv/kconv.c @@ -1780,12 +1780,30 @@ kconv_kconv(argc, argv) VALUE src, dst; VALUE in, out; int in_code, out_code; + char *codename = 0; rb_scan_args(argc, argv, "12", &src, &out, &in); Check_Type(src, T_STRING); if (NIL_P(out)) { - out_code = _JIS; + codename = rb_get_kcode(); + goto codeselect; + } + else if (TYPE(out) == T_STRING) { + codename = RSTRING(out)->ptr; + codeselect: + switch (codename[0]) { + case 'E': case 'e': + out_code = _EUC; + break; + case 'S': case 's': + out_code = _SJIS; + break; + case 'J': case 'j': + default: + out_code = _JIS; + break; + } } else { out_code = NUM2INT(out); @@ -1794,6 +1812,22 @@ kconv_kconv(argc, argv) if (NIL_P(in)) { in_code = _AUTO; } + else if (TYPE(in) == T_STRING) { + switch (RSTRING(in)->ptr[0]) { + case 'E': case 'e': + in_code = _EUC; + break; + case 'S': case 's': + in_code = _SJIS; + break; + case 'J': case 'j': + in_code = _JIS; + break; + default: + in_code = _AUTO; + break; + } + } else { in_code = NUM2INT(in); if (in_code == _NOCONV) return (VALUE)src; |