X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=ext%2Fext.c;h=99eefbe9ba5ef6ff6684e45c97a7aea6b5c5790e;hb=f225f3e9dcd1a08b9d0a83d9365602948d4fe77d;hp=d8bcc1271bed1232340be7eacd515216167176f1;hpb=310e91e26bebf168b6081e91da123b4a8cfb9b67;p=ruby-vorbistagger.git diff --git a/ext/ext.c b/ext/ext.c index d8bcc12..99eefbe 100644 --- a/ext/ext.c +++ b/ext/ext.c @@ -29,12 +29,11 @@ typedef struct { vcedit_state *state; VALUE comments; - VALUE io_buf; } RbVorbisTagger; static VALUE c_close (VALUE self); -static VALUE cComments, eVTError; +static VALUE cComments, eVTError, io_buf; static ID id_read, id_write, id_seek, id_length; static size_t @@ -44,9 +43,9 @@ on_read (void *ptr, size_t size, size_t nmemb, RbVorbisTagger *o) size_t total = size * nmemb; VALUE tmp; - rb_str_resize (o->io_buf, size * nmemb); + rb_str_resize (io_buf, size * nmemb); - tmp = rb_funcall (o->io, id_read, 2, LONG2NUM (total), o->io_buf); + tmp = rb_funcall (o->io, id_read, 2, LONG2NUM (total), io_buf); if (NIL_P (tmp)) return 0; @@ -61,10 +60,10 @@ on_write (const void *ptr, size_t size, size_t nmemb, RbVorbisTagger *o) { size_t total = size * nmemb; - rb_str_resize (o->io_buf, total); - memcpy (RSTRING (o->io_buf)->ptr, ptr, total); + rb_str_resize (io_buf, total); + memcpy (RSTRING (io_buf)->ptr, ptr, total); - return NUM2LONG (rb_io_write (o->io, o->io_buf)); + return NUM2LONG (rb_io_write (o->io, io_buf)); } static void @@ -72,7 +71,7 @@ c_mark (RbVorbisTagger *o) { rb_gc_mark (o->io); rb_gc_mark (o->comments); - rb_gc_mark (o->io_buf); + rb_gc_mark (io_buf); } static void @@ -130,7 +129,7 @@ c_init (VALUE self, VALUE io) { RbVorbisTagger *o; vorbis_comment *vc; - int s; + int s, i; Data_Get_Struct (self, RbVorbisTagger, o); @@ -146,7 +145,6 @@ c_init (VALUE self, VALUE io) rb_raise (rb_eArgError, "invalid argument"); o->io = io; - o->io_buf = rb_str_buf_new (BUFSIZ); o->state = vcedit_state_new (); if (!o->state) @@ -165,6 +163,15 @@ c_init (VALUE self, VALUE io) rb_raise (eVTError, "vcedit_comments() failed - %s", vcedit_error (o->state)); + /* check whether all comments are well-formed */ + for (i = 0; i < vc->comments; i++) { + char *ptr, *content = vc->user_comments[i]; + + ptr = strchr (content, '='); + if (!ptr || ptr == content) + rb_raise (eVTError, "malformed comment - %s", content); + } + o->comments = rb_class_new_instance (0, NULL, cComments); comments_init (o->comments, o->state); @@ -269,4 +276,7 @@ Init_vorbistagger_ext (void) id_length = rb_intern ("length"); cComments = Init_Comments (mVorbis); + + io_buf = rb_str_buf_new (BUFSIZ); + rb_global_variable (&io_buf); }