From 397b4a686511cb3fb5fb9a7a82277487f750c86d Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Tue, 15 Aug 2006 19:03:18 +0200 Subject: [PATCH] Added Ogg::Vorbis::Comments#merge!. --- ext/comments.c | 27 +++++++++++++++++++++++++++ test/test_main.rb | 17 +++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/ext/comments.c b/ext/comments.c index a256986..cdaf576 100644 --- a/ext/comments.c +++ b/ext/comments.c @@ -17,6 +17,7 @@ */ #include +#include #include #include #include @@ -331,6 +332,31 @@ c_has_key (VALUE self, VALUE key) return Qfalse; } +static int +merge_cb (VALUE key, VALUE value, VALUE self) +{ + c_aset (self, key, value); + + return ST_CONTINUE; +} + +/* + * call-seq: + * object.merge!(hash) -> object + * + * Adds the key-value pairs from *hash* to *object*, overwriting existing + * values if a key already existed in *object*. + */ +static VALUE +c_merge (VALUE self, VALUE hash) +{ + Check_Type (hash, T_HASH); + + rb_hash_foreach (hash, merge_cb, self); + + return self; +} + /* * call-seq: * object <=> other -> -1, 0 or 1 @@ -463,6 +489,7 @@ Init_Comments (VALUE mVorbis) rb_define_method (c, "empty?", c_get_empty, 0); rb_define_method (c, "keys", c_keys, 0); rb_define_method (c, "values", c_values, 0); + rb_define_method (c, "merge!", c_merge, 1); rb_include_module (c, rb_mComparable); rb_define_method (c, "<=>", c_compare, 1); diff --git a/test/test_main.rb b/test/test_main.rb index 21c4edf..be81bb8 100644 --- a/test/test_main.rb +++ b/test/test_main.rb @@ -213,4 +213,21 @@ EOF end end end + + def test_merge + repl = { + "artist" => "Ballista", + "genre" => "Death Metal", + } + + Ogg::Vorbis::Tagger.open(OGG_FILE) do |t| + t.comments.merge!(repl) + + assert_equal(["artist", "album", "date", "genre"], + t.comments.keys) + assert_equal(["Ballista", "...For Victory", "1994", + "Death Metal"], + t.comments.values) + end + end end -- 2.30.2