diff options
author | Jari Vetoniemi <jari.vetoniemi@indooratlas.com> | 2020-03-16 18:49:26 +0900 |
---|---|---|
committer | Jari Vetoniemi <jari.vetoniemi@indooratlas.com> | 2020-03-30 00:39:06 +0900 |
commit | fcbf63e62c627deae76c1b8cb8c0876c536ed811 (patch) | |
tree | 64cb17de3f41a2b6fef2368028fbd00349946994 /jni/ruby/ext/-test-/st/update/update.c |
Fresh start
Diffstat (limited to 'jni/ruby/ext/-test-/st/update/update.c')
-rw-r--r-- | jni/ruby/ext/-test-/st/update/update.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/jni/ruby/ext/-test-/st/update/update.c b/jni/ruby/ext/-test-/st/update/update.c new file mode 100644 index 0000000..979ad3e --- /dev/null +++ b/jni/ruby/ext/-test-/st/update/update.c @@ -0,0 +1,34 @@ +#include <ruby.h> +#include <ruby/st.h> + +static int +update_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing) +{ + VALUE ret = rb_yield_values(existing ? 2 : 1, (VALUE)*key, (VALUE)*value); + switch (ret) { + case Qfalse: + return ST_STOP; + case Qnil: + return ST_DELETE; + default: + *value = ret; + return ST_CONTINUE; + } +} + +static VALUE +test_st_update(VALUE self, VALUE key) +{ + if (st_update(RHASH_TBL(self), (st_data_t)key, update_func, 0)) + return Qtrue; + else + return Qfalse; +} + +void +Init_update(void) +{ + VALUE st = rb_define_class_under(rb_define_module("Bug"), "StTable", rb_cHash); + rb_define_method(st, "st_update", test_st_update, 1); +} + |