projects
/
ruby-vorbistagger.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Prefer rb_funcall2() over rb_funcall().
[ruby-vorbistagger.git]
/
ext
/
comments.c
diff --git
a/ext/comments.c
b/ext/comments.c
index fb3ae82f653d727d751cc9975626caabfb1b5f8c..6e6efd58460b787f541c82a1cbda9ccda9b5a7b9 100644
(file)
--- a/
ext/comments.c
+++ b/
ext/comments.c
@@
-24,7
+24,7
@@
#include "vcedit.h"
#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)
void
comments_init (VALUE self, vcedit_state *state)
@@
-41,14
+41,17
@@
comments_init (VALUE self, vcedit_state *state)
for (i = 0; i < vc->comments; i++) {
VALUE k, v, pair;
char *ptr, *content = vc->user_comments[i];
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);
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);
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);
pair = rb_ary_new3 (2, k, v);
OBJ_FREEZE (pair);
@@
-161,7
+164,7
@@
c_delete (VALUE self, VALUE key)
struct RArray *pair = RARRAY (items->ptr[i]);
VALUE tmp;
struct RArray *pair = RARRAY (items->ptr[i]);
VALUE tmp;
- tmp = rb_funcall
(pair->ptr[0], id_casecmp, 1,
key);
+ tmp = rb_funcall
2 (pair->ptr[0], id_casecmp, 1, &
key);
if (tmp == INT2FIX (0)) {
ret = pair->ptr[1];
pos = i;
if (tmp == INT2FIX (0)) {
ret = pair->ptr[1];
pos = i;
@@
-276,7
+279,7
@@
c_aref (VALUE self, VALUE key)
struct RArray *pair = RARRAY (items->ptr[i]);
VALUE tmp;
struct RArray *pair = RARRAY (items->ptr[i]);
VALUE tmp;
- tmp = rb_funcall
(pair->ptr[0], id_casecmp, 1,
key);
+ tmp = rb_funcall
2 (pair->ptr[0], id_casecmp, 1, &
key);
if (tmp == INT2FIX (0))
return pair->ptr[1];
}
if (tmp == INT2FIX (0))
return pair->ptr[1];
}
@@
-303,9
+306,9
@@
c_aset (VALUE self, VALUE key, VALUE value)
struct RArray *pair = RARRAY (items->ptr[i]);
VALUE tmp;
struct RArray *pair = RARRAY (items->ptr[i]);
VALUE tmp;
- tmp = rb_funcall
(pair->ptr[0], id_casecmp, 1,
key);
+ tmp = rb_funcall
2 (pair->ptr[0], id_casecmp, 1, &
key);
if (tmp == INT2FIX (0)) {
if (tmp == INT2FIX (0)) {
- rb_funcall
(pair->ptr[1], id_replace, 1,
value);
+ rb_funcall
2 (pair->ptr[1], id_replace, 1, &
value);
return pair->ptr[1];
}
}
return pair->ptr[1];
}
}
@@
-337,7
+340,7
@@
c_has_key (VALUE self, VALUE key)
struct RArray *pair = RARRAY (items->ptr[i]);
VALUE tmp;
struct RArray *pair = RARRAY (items->ptr[i]);
VALUE tmp;
- tmp = rb_funcall
(pair->ptr[0], id_casecmp, 1,
key);
+ tmp = rb_funcall
2 (pair->ptr[0], id_casecmp, 1, &
key);
if (tmp == INT2FIX (0))
return Qtrue;
}
if (tmp == INT2FIX (0))
return Qtrue;
}
@@
-345,27
+348,34
@@
c_has_key (VALUE self, VALUE key)
return Qfalse;
}
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:
}
/*
* 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*.
* 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
*/
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;
}
return self;
}
@@
-416,7
+426,7
@@
c_compare (VALUE self, VALUE other)
for (j = 0; j < 2; j++) {
VALUE tmp;
for (j = 0; j < 2; j++) {
VALUE tmp;
- tmp = rb_funcall
(aa->ptr[j], id_compare, 1,
bb->ptr[j]);
+ tmp = rb_funcall
2 (aa->ptr[j], id_compare, 1, &
bb->ptr[j]);
if (FIX2INT (tmp) != 0)
return tmp;
}
if (FIX2INT (tmp) != 0)
return tmp;
}
@@
-536,6
+546,7
@@
Init_Comments (VALUE mVorbis)
id_casecmp = rb_intern ("casecmp");
id_replace = rb_intern ("replace");
id_casecmp = rb_intern ("casecmp");
id_replace = rb_intern ("replace");
+ id_each = rb_intern ("each");
id_compare = rb_intern ("<=>");
return c;
id_compare = rb_intern ("<=>");
return c;