*/
#include <ruby.h>
+#include <st.h>
#include <stdbool.h>
#include <ctype.h>
#include <assert.h>
vc = vcedit_comments (state);
- items = rb_ary_new2 (vc->comments);
- rb_iv_set (self, "items", items);
+ items = rb_iv_get (self, "items");
+ rb_ary_clear (items);
for (i = 0; i < vc->comments; i++) {
VALUE k, v, pair;
StringValuePtr (pair->ptr[1]));
}
}
+/*
+ * call-seq:
+ * Ogg::Vorbis::Comments.new -> object
+ *
+ * Creates an Ogg::Vorbis::Comments object.
+ */
+static VALUE
+c_init (VALUE self)
+{
+ rb_iv_set (self, "items", rb_ary_new ());
+
+ return self;
+}
/*
* call-seq:
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.shift(hash) -> array or nil
+ *
+ * Removes the first key-value pair from *object* and returns it
+ * as the two-item array [key, value].
+ * If *object* is empty, +nil+ is returned.
+ */
+static VALUE
+c_shift (VALUE self)
+{
+ return rb_ary_shift (rb_iv_get (self, "items"));
+}
+
/*
* call-seq:
* object <=> other -> -1, 0 or 1
c = rb_define_class_under (mVorbis, "Comments", rb_cObject);
+ rb_define_method (c, "initialize", c_init, 0);
rb_define_method (c, "inspect", c_inspect, 0);
rb_define_method (c, "clear", c_clear, 0);
rb_define_method (c, "delete", c_delete, 1);
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_define_method (c, "shift", c_shift, 0);
rb_include_module (c, rb_mComparable);
rb_define_method (c, "<=>", c_compare, 1);