From 0ebbf4f00aa8b375b4a781b0a0397d0fce5466e1 Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Sun, 13 Aug 2006 00:42:30 +0200 Subject: [PATCH] Reworked Ogg::Vorbis::Comments' vorbis_comment interface. Ogg::Vorbis::Comments doesn't need to hold a reference to the vcedit_state structure. Instead, now a pointer to that struct is passed to comments_sync(), too. This means we no longer need to make Ogg::Vorbis::Comments a class of type T_DATA. --- ext/comments.c | 133 +++++++++++-------------------------------------- ext/comments.h | 2 +- ext/ext.c | 2 +- 3 files changed, 31 insertions(+), 106 deletions(-) diff --git a/ext/comments.c b/ext/comments.c index a8236a5..a256986 100644 --- a/ext/comments.c +++ b/ext/comments.c @@ -23,29 +23,19 @@ #include "vcedit.h" -typedef struct { - vcedit_state *state; - - VALUE items; -} RbVorbisComments; - static ID id_casecmp, id_replace, id_compare; void comments_init (VALUE self, vcedit_state *state) { - RbVorbisComments *o; + VALUE items; vorbis_comment *vc; int i; - Data_Get_Struct (self, RbVorbisComments, o); - - o->state = state; - vcedit_state_ref (state); + vc = vcedit_comments (state); - vc = vcedit_comments (o->state); - - o->items = rb_ary_new2 (vc->comments); + items = rb_ary_new2 (vc->comments); + rb_iv_set (self, "items", items); for (i = 0; i < vc->comments; i++) { VALUE k, v, pair; @@ -62,26 +52,23 @@ comments_init (VALUE self, vcedit_state *state) pair = rb_ary_new3 (2, k, v); OBJ_FREEZE (pair); - rb_ary_store (o->items, i, pair); + rb_ary_store (items, i, pair); } } void -comments_sync (VALUE self) +comments_sync (VALUE self, vcedit_state *state) { - RbVorbisComments *o; vorbis_comment *vc; struct RArray *items; int i; - Data_Get_Struct (self, RbVorbisComments, o); - - vc = vcedit_comments (o->state); + vc = vcedit_comments (state); vorbis_comment_clear (vc); vorbis_comment_init (vc); - items = RARRAY (o->items); + items = RARRAY (rb_iv_get (self, "items")); for (i = 0; i < items->len; i++) { struct RArray *pair = RARRAY (items->ptr[i]); @@ -92,28 +79,6 @@ comments_sync (VALUE self) } } -static void -c_mark (RbVorbisComments *o) -{ - rb_gc_mark (o->items); -} - -static void -c_free (RbVorbisComments *o) -{ - vcedit_state_unref (o->state); - - ruby_xfree (o); -} - -static VALUE -c_alloc (VALUE klass) -{ - RbVorbisComments *o; - - return Data_Make_Struct (klass, RbVorbisComments, c_mark, c_free, o); -} - /* * call-seq: * object.inspect -> string @@ -124,13 +89,10 @@ static VALUE c_inspect (VALUE self) { VALUE ret; - RbVorbisComments *o; struct RArray *items; int i; - Data_Get_Struct (self, RbVorbisComments, o); - - items = RARRAY (o->items); + items = RARRAY (rb_iv_get (self, "items")); ret = rb_str_buf_new (128); rb_str_buf_cat (ret, "{", 1); @@ -160,11 +122,7 @@ c_inspect (VALUE self) static VALUE c_clear (VALUE self) { - RbVorbisComments *o; - - Data_Get_Struct (self, RbVorbisComments, o); - - rb_ary_clear (o->items); + rb_ary_clear (rb_iv_get (self, "items")); return self; } @@ -180,13 +138,10 @@ static VALUE c_delete (VALUE self, VALUE key) { VALUE ret = Qnil; - RbVorbisComments *o; struct RArray *items; int i, pos = -1; - Data_Get_Struct (self, RbVorbisComments, o); - - items = RARRAY (o->items); + items = RARRAY (rb_iv_get (self, "items")); for (i = 0; i < items->len; i++) { struct RArray *pair = RARRAY (items->ptr[i]); @@ -201,7 +156,7 @@ c_delete (VALUE self, VALUE key) } if (pos != -1) - rb_ary_delete_at (o->items, pos); + rb_ary_delete_at (rb_iv_get (self, "items"), pos); return ret; } @@ -216,13 +171,10 @@ static VALUE c_keys (VALUE self) { VALUE ret; - RbVorbisComments *o; struct RArray *items; int i; - Data_Get_Struct (self, RbVorbisComments, o); - - items = RARRAY (o->items); + items = RARRAY (rb_iv_get (self, "items")); ret = rb_ary_new2 (items->len); for (i = 0; i < items->len; i++) { @@ -244,13 +196,10 @@ static VALUE c_values (VALUE self) { VALUE ret; - RbVorbisComments *o; struct RArray *items; int i; - Data_Get_Struct (self, RbVorbisComments, o); - - items = RARRAY (o->items); + items = RARRAY (rb_iv_get (self, "items")); ret = rb_ary_new2 (items->len); for (i = 0; i < items->len; i++) { @@ -271,11 +220,11 @@ c_values (VALUE self) static VALUE c_length (VALUE self) { - RbVorbisComments *o; + struct RArray *items; - Data_Get_Struct (self, RbVorbisComments, o); + items = RARRAY (rb_iv_get (self, "items")); - return LONG2NUM (RARRAY (o->items)->len); + return LONG2NUM (items->len); } /* @@ -287,11 +236,11 @@ c_length (VALUE self) static VALUE c_get_empty (VALUE self) { - RbVorbisComments *o; + struct RArray *items; - Data_Get_Struct (self, RbVorbisComments, o); + items = RARRAY (rb_iv_get (self, "items")); - return RARRAY(o->items)->len ? Qfalse : Qtrue; + return items->len ? Qfalse : Qtrue; } /* @@ -304,13 +253,10 @@ c_get_empty (VALUE self) static VALUE c_aref (VALUE self, VALUE key) { - RbVorbisComments *o; struct RArray *items; int i; - Data_Get_Struct (self, RbVorbisComments, o); - - items = RARRAY (o->items); + items = RARRAY (rb_iv_get (self, "items")); for (i = 0; i < items->len; i++) { struct RArray *pair = RARRAY (items->ptr[i]); @@ -334,13 +280,10 @@ static VALUE c_aset (VALUE self, VALUE key, VALUE value) { VALUE tmp; - RbVorbisComments *o; struct RArray *items; int i; - Data_Get_Struct (self, RbVorbisComments, o); - - items = RARRAY (o->items); + items = RARRAY (rb_iv_get (self, "items")); for (i = 0; i < items->len; i++) { struct RArray *pair = RARRAY (items->ptr[i]); @@ -356,7 +299,7 @@ c_aset (VALUE self, VALUE key, VALUE value) tmp = rb_ary_new3 (2, rb_str_dup_frozen (key), value); OBJ_FREEZE (tmp); - rb_ary_push (o->items, tmp); + rb_ary_push (rb_iv_get (self, "items"), tmp); return value; } @@ -371,13 +314,10 @@ c_aset (VALUE self, VALUE key, VALUE value) static VALUE c_has_key (VALUE self, VALUE key) { - RbVorbisComments *o; struct RArray *items; int i; - Data_Get_Struct (self, RbVorbisComments, o); - - items = RARRAY (o->items); + items = RARRAY (rb_iv_get (self, "items")); for (i = 0; i < items->len; i++) { struct RArray *pair = RARRAY (items->ptr[i]); @@ -401,18 +341,14 @@ c_has_key (VALUE self, VALUE key) static VALUE c_compare (VALUE self, VALUE other) { - RbVorbisComments *o, *o2; struct RArray *a, *b; int i, j; if (rb_obj_is_kind_of (other, CLASS_OF (self)) != Qtrue) rb_raise (rb_eArgError, "invalid argument"); - Data_Get_Struct (self, RbVorbisComments, o); - Data_Get_Struct (other, RbVorbisComments, o2); - - a = RARRAY (o->items); - b = RARRAY (o2->items); + a = RARRAY (rb_iv_get (self, "items")); + b = RARRAY (rb_iv_get (other, "items")); if (a->len < b->len) return -1; @@ -447,13 +383,10 @@ c_compare (VALUE self, VALUE other) static VALUE c_each (VALUE self) { - RbVorbisComments *o; struct RArray *items; int i; - Data_Get_Struct (self, RbVorbisComments, o); - - items = RARRAY (o->items); + items = RARRAY (rb_iv_get (self, "items")); for (i = 0; i < items->len; i++) { struct RArray *pair = RARRAY (items->ptr[i]); @@ -475,13 +408,10 @@ c_each (VALUE self) static VALUE c_each_key (VALUE self) { - RbVorbisComments *o; struct RArray *items; int i; - Data_Get_Struct (self, RbVorbisComments, o); - - items = RARRAY (o->items); + items = RARRAY (rb_iv_get (self, "items")); for (i = 0; i < items->len; i++) { struct RArray *pair = RARRAY (items->ptr[i]); @@ -502,13 +432,10 @@ c_each_key (VALUE self) static VALUE c_each_value (VALUE self) { - RbVorbisComments *o; struct RArray *items; int i; - Data_Get_Struct (self, RbVorbisComments, o); - - items = RARRAY (o->items); + items = RARRAY (rb_iv_get (self, "items")); for (i = 0; i < items->len; i++) { struct RArray *pair = RARRAY (items->ptr[i]); @@ -526,8 +453,6 @@ Init_Comments (VALUE mVorbis) c = rb_define_class_under (mVorbis, "Comments", rb_cObject); - rb_define_alloc_func (c, c_alloc); - rb_define_method (c, "inspect", c_inspect, 0); rb_define_method (c, "clear", c_clear, 0); rb_define_method (c, "delete", c_delete, 1); diff --git a/ext/comments.h b/ext/comments.h index 89838f8..2ff9f6d 100644 --- a/ext/comments.h +++ b/ext/comments.h @@ -26,7 +26,7 @@ VALUE Init_Comments (VALUE mVorbis); void comments_init (VALUE self, vcedit_state *state); -void comments_sync (VALUE self); +void comments_sync (VALUE self, vcedit_state *state); #endif /* __COMMENTS_H */ diff --git a/ext/ext.c b/ext/ext.c index 583523e..da2798f 100644 --- a/ext/ext.c +++ b/ext/ext.c @@ -215,7 +215,7 @@ c_write (VALUE self) Data_Get_Struct (self, RbVorbisTagger, o); - comments_sync (o->comments); + comments_sync (o->comments, o->state); /* seek back to BOF */ rb_funcall (o->io, id_seek, 1, INT2FIX (0)); -- 2.30.2