Reworked Ogg::Vorbis::Comments' vorbis_comment interface.
authorTilman Sauerbeck <tilman@code-monkey.de>
Sat, 12 Aug 2006 22:42:30 +0000 (00:42 +0200)
committerTilman Sauerbeck <tilman@code-monkey.de>
Wed, 23 Aug 2006 17:33:45 +0000 (19:33 +0200)
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
ext/comments.h
ext/ext.c

index a8236a51af5e514873d1ee0c318414ac5f74cdf1..a2569866a62766062a292d9719f0233fd75a1185 100644 (file)
 
 #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);
index 89838f8c61147d78ba4fffb5e9824a00e879ba93..2ff9f6dc66ceadd698d87e0a87845e88d95fc7ab 100644 (file)
@@ -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 */
 
index 583523e745863dde593e7956f9df23566ee8e84c..da2798f579495d9bdf81f0f2a8f84876335b3607 100644 (file)
--- 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));