summaryrefslogtreecommitdiff
path: root/transcode.c
diff options
context:
space:
mode:
authorknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-09-10 07:51:58 +0000
committerknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-09-10 07:51:58 +0000
commit82abe79b9fa3b5a648f453076a28ed9566d02ec8 (patch)
tree38c67940337c200adc83b83669049492fb4a3534 /transcode.c
parent4f77c495cddcdfcbb15e363ba21d09e5a9ddfd37 (diff)
* class.c (rb_scan_args): Add support for optional keyword
argument hash. * README.EXT, README.EXT.ja: Update documentation accordingly. * dir.c (dir_initialize): Make use of the new rb_scan_args() feature. * io.c (rb_io_s_popen, rb_scan_open_args, rb_io_initialize) (rb_io_s_pipe, open_key_args, io_s_foreach, io_s_readlines) (rb_io_s_read, rb_io_set_encoding): Ditto. * transcode.c (str_transcode, econv_args) (econv_primitive_convert): Ditto. * ext/zlib/zlib.c (rb_gzreader_initialize): Ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29214 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'transcode.c')
-rw-r--r--transcode.c49
1 files changed, 26 insertions, 23 deletions
diff --git a/transcode.c b/transcode.c
index c718182a14..17bad37e27 100644
--- a/transcode.c
+++ b/transcode.c
@@ -2666,12 +2666,9 @@ str_transcode(int argc, VALUE *argv, VALUE *self)
int ecflags = 0;
VALUE ecopts = Qnil;
- if (0 < argc) {
- opt = rb_check_convert_type(argv[argc-1], T_HASH, "Hash", "to_hash");
- if (!NIL_P(opt)) {
- argc--;
- ecflags = rb_econv_prepare_opts(opt, &ecopts);
- }
+ argc = rb_scan_args(argc, argv, "02:", NULL, NULL, &opt);
+ if (!NIL_P(opt)) {
+ ecflags = rb_econv_prepare_opts(opt, &ecopts);
}
return str_transcode0(argc, argv, self, ecflags, ecopts);
}
@@ -2908,25 +2905,28 @@ econv_args(int argc, VALUE *argv,
int *ecflags_p,
VALUE *ecopts_p)
{
- VALUE opt, opthash, flags_v, ecopts;
+ VALUE opt, flags_v, ecopts;
int sidx, didx;
const char *sname, *dname;
rb_encoding *senc, *denc;
int ecflags;
- rb_scan_args(argc, argv, "21", snamev_p, dnamev_p, &opt);
+ argc = rb_scan_args(argc, argv, "21:", snamev_p, dnamev_p, &flags_v, &opt);
- if (NIL_P(opt)) {
- ecflags = 0;
+ if (!NIL_P(flags_v)) {
+ if (!NIL_P(opt)) {
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2..3)",
+ argc + 1);
+ }
+ ecflags = NUM2INT(rb_to_int(flags_v));
ecopts = Qnil;
}
- else if (!NIL_P(flags_v = rb_check_to_integer(opt, "to_int"))) {
- ecflags = NUM2INT(flags_v);
- ecopts = Qnil;
+ else if (!NIL_P(opt)) {
+ ecflags = rb_econv_prepare_opts(opt, &ecopts);
}
else {
- opthash = rb_convert_type(opt, T_HASH, "Hash", "to_hash");
- ecflags = rb_econv_prepare_opts(opthash, &ecopts);
+ ecflags = 0;
+ ecopts = Qnil;
}
senc = NULL;
@@ -3543,7 +3543,7 @@ econv_primitive_convert(int argc, VALUE *argv, VALUE self)
unsigned long output_byteend;
int flags;
- rb_scan_args(argc, argv, "23", &input, &output, &output_byteoffset_v, &output_bytesize_v, &opt);
+ argc = rb_scan_args(argc, argv, "23:", &input, &output, &output_byteoffset_v, &output_bytesize_v, &flags_v, &opt);
if (NIL_P(output_byteoffset_v))
output_byteoffset = 0; /* dummy */
@@ -3555,15 +3555,15 @@ econv_primitive_convert(int argc, VALUE *argv, VALUE self)
else
output_bytesize = NUM2LONG(output_bytesize_v);
- if (NIL_P(opt)) {
- flags = 0;
- }
- else if (!NIL_P(flags_v = rb_check_to_integer(opt, "to_int"))) {
- flags = NUM2INT(flags_v);
+ if (!NIL_P(flags_v)) {
+ if (!NIL_P(opt)) {
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2..5)",
+ argc + 1);
+ }
+ flags = NUM2INT(rb_to_int(flags_v));
}
- else {
+ else if (!NIL_P(opt)) {
VALUE v;
- opt = rb_convert_type(opt, T_HASH, "Hash", "to_hash");
flags = 0;
v = rb_hash_aref(opt, sym_partial_input);
if (RTEST(v))
@@ -3572,6 +3572,9 @@ econv_primitive_convert(int argc, VALUE *argv, VALUE self)
if (RTEST(v))
flags |= ECONV_AFTER_OUTPUT;
}
+ else {
+ flags = 0;
+ }
StringValue(output);
if (!NIL_P(input))