summaryrefslogtreecommitdiffhomepage
path: root/templates.rb
diff options
context:
space:
mode:
authorrealtradam <[email protected]>2022-03-05 05:50:22 -0500
committerrealtradam <[email protected]>2022-03-05 05:50:22 -0500
commit0400fa4829cb884837d06769484a8944761f0626 (patch)
tree016b6f7451f1330c54f77b938bcfc7dfa67a1f76 /templates.rb
parent4dec6210af82ce63585e1bf5c3a3b5bea1fa83e3 (diff)
downloadFelBind-0400fa4829cb884837d06769484a8944761f0626.tar.gz
FelBind-0400fa4829cb884837d06769484a8944761f0626.zip
finished phase one
Diffstat (limited to 'templates.rb')
-rw-r--r--templates.rb70
1 files changed, 70 insertions, 0 deletions
diff --git a/templates.rb b/templates.rb
new file mode 100644
index 0000000..177769d
--- /dev/null
+++ b/templates.rb
@@ -0,0 +1,70 @@
+module Template
+ class << self
+ def base(gem_name, init_body, final_body)
+ %{
+void
+mrb_mruby_#{gem_name}_gem_init(mrb_state* mrb) {
+#{init_body}
+}
+
+void
+mrb_mruby_#{gem_name}_gem_final(mrb_state* mrb) {
+#{final_body}
+}
+ }
+ end
+
+ def init_module_function(module_name, function_name, mrb_function_name, mrb_args)
+ %{
+ mrb_define_module_function(mrb, #{module_name}, "#{function_name}", mrb_#{mrb_function_name}, #{mrb_args});
+ }
+ end
+
+ def function(function_name, body)
+ %{
+static mrb_value
+mrb_#{function_name}(mrb_state* mrb, mrb_value self) {
+#{body}
+}
+ }
+ end
+
+ def init_function(class_name, function_name, mrb_function_name, mrb_args)
+ %{mrb_define_method(mrb, #{class_name}, "#{function_name}", mrb_#{mrb_function_name}, #{mrb_args});
+ }
+ end
+
+ def get_kwargs(kwarg_num, body)
+ %{
+uint32_t kw_num = #{kwarg_num};
+const mrb_sym kw_names[] = {
+#{body}
+};
+mrb_value kw_values[kw_num];
+const mrb_kwargs kwargs = { kw_num, 0, kw_names, kw_values, NULL };
+mrb_get_args(mrb, "|:", &kwargs);
+ }
+ end
+
+ def unwrap_kwarg(kwarg_iter, body_if_defined, body_if_undefined)
+ %{
+if (mrb_undef_p(kw_values[#{kwarg_iter}])) {
+#{body_if_defined}
+} else {
+#{body_if_undefined}
+}
+ }
+ end
+
+ def unwrap_struct(var_name, target, mrb_type, type)
+ %{#{var_name} = DATA_GET_PTR(mrb, #{target}, &#{mrb_type}, #{type})}
+ end
+
+ def define_module(module_name)
+ %{struct RClass *#{module_name.downcase} = mrb_define_module(mrb, "#{module_name}");
+ }
+ end
+
+ end
+end
+