#include "vcedit.h"
-static ID id_casecmp, id_replace, id_compare;
+static ID id_casecmp, id_replace, id_each, id_compare;
void
comments_init (VALUE self, vcedit_state *state)
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;
char *ptr, *content = vc->user_comments[i];
+ int k_len, v_len;
ptr = strchr (content, '=');
assert (ptr);
- k = rb_str_new (content, ptr - content);
+ k_len = ptr - content;
+ k = rb_str_new (content, k_len);
OBJ_FREEZE (k);
- v = rb_str_new2 (ptr + 1);
+ v_len = vc->comment_lengths[i] - k_len - 1;
+ v = rb_str_new (ptr + 1, v_len);
pair = rb_ary_new3 (2, k, v);
OBJ_FREEZE (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)
+static VALUE
+merge_cb (VALUE ar, VALUE self)
{
- c_aset (self, key, value);
+ struct RArray *pair = RARRAY (ar);
+
+ c_aset (self, pair->ptr[0], pair->ptr[1]);
- return ST_CONTINUE;
+ return Qnil;
}
/*
* call-seq:
- * object.merge!(hash) -> object
+ * object.merge!(arg) -> object
*
- * Adds the key-value pairs from *hash* to *object*, overwriting existing
+ * Adds the key-value pairs from *arg* to *object*, overwriting existing
* values if a key already existed in *object*.
+ *
+ * Note that *arg*'s each method needs to yield key-value pairs for this
+ * to work. This means that e.g. hashes and Ogg::Vorbis::Comments objects
+ * are supported as arguments.
*/
static VALUE
-c_merge (VALUE self, VALUE hash)
+c_merge (VALUE self, VALUE arg)
{
- Check_Type (hash, T_HASH);
+ if (!rb_respond_to (arg, id_each))
+ rb_raise (rb_eArgError, "invalid argument");
- rb_hash_foreach (hash, merge_cb, self);
+ rb_iterate (rb_each, arg, merge_cb, self);
return self;
}
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);
id_casecmp = rb_intern ("casecmp");
id_replace = rb_intern ("replace");
+ id_each = rb_intern ("each");
id_compare = rb_intern ("<=>");
return c;