diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-12-20 16:02:21 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-12-20 16:02:21 +0000 |
commit | 8846bee5565541bf865e435df6d787e4847ed064 (patch) | |
tree | 320d57da8e37e7e93f8b6f7ee28e4dd00f201a91 /ext | |
parent | 40e477f05c78f64d22377ee2bac52d146596851d (diff) | |
download | ruby-8846bee5565541bf865e435df6d787e4847ed064.tar.gz |
Zlib.gzip uses kwargs instead of argc [Feature #13020]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r-- | ext/zlib/zlib.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index 4052e49b4b..b08f4296e4 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -4276,6 +4276,10 @@ zlib_gzip_end(struct gzfile *gz) zstream_end(&gz->z); } +#define OPTHASH_GIVEN_P(opts) \ + (argc > 0 && !NIL_P((opts) = rb_check_hash_type(argv[argc-1])) && (--argc, 1)) +static ID id_level, id_strategy; + /* * call-seq: * Zlib.gzip(src, level=nil, strategy=nil) -> String @@ -4305,9 +4309,22 @@ zlib_s_gzip(int argc, VALUE *argv, VALUE klass) struct gzfile *gz = &gz0; long len; int err; - VALUE src, level, strategy; - - rb_scan_args(argc, argv, "12", &src, &level, &strategy); + VALUE src, opts, level=Qnil, strategy=Qnil; + + if (OPTHASH_GIVEN_P(opts)) { + ID keyword_ids[2]; + VALUE kwargs[2]; + keyword_ids[0] = id_level; + keyword_ids[1] = id_strategy; + rb_get_kwargs(opts, keyword_ids, 0, 2, kwargs); + if (kwargs[0] != Qundef) { + level = kwargs[0]; + } + if (kwargs[1] != Qundef) { + strategy = kwargs[1]; + } + } + rb_scan_args(argc, argv, "10", &src); StringValue(src); gzfile_init(gz, &deflate_funcs, zlib_gzip_end); gz->level = ARG_LEVEL(level); @@ -4690,6 +4707,8 @@ Init_zlib(void) /* OS code for unknown hosts */ rb_define_const(mZlib, "OS_UNKNOWN", INT2FIX(OS_UNKNOWN)); + id_level = rb_intern("level"); + id_strategy = rb_intern("strategy"); #endif /* GZIP_SUPPORT */ } |