summaryrefslogtreecommitdiffhomepage
path: root/templates.rb
diff options
context:
space:
mode:
Diffstat (limited to 'templates.rb')
-rw-r--r--templates.rb46
1 files changed, 41 insertions, 5 deletions
diff --git a/templates.rb b/templates.rb
index 981d79c..b4ca43c 100644
--- a/templates.rb
+++ b/templates.rb
@@ -110,14 +110,42 @@ if (mrb_undef_p(kw_values[#{kwarg_iter}])) {
}
end
+ def get_args(req_arg_hash, opt_arg_hash=nil)
+ raise if opt_arg_hash
+ result = ''
+ tail = ''
+ flags = ''
+ req_arg_hash.each do |var_name, var_datatype|
+ if var_datatype != 'unsigned char'
+ result += "#{var_datatype} #{var_name};\n"
+ else
+ result += "mrb_int #{var_name};\n"
+ end
+ tail += ", &#{var_name}"
+ flags += datatype_to_arg_flag(var_datatype)
+ end
+ result += "mrb_get_args(mrb, \"#{flags}\"#{tail});\n"
+ end
+
+ def datatype_to_arg_flag(datatype)
+ if treated_as_int.include? datatype
+ 'i'
+ elsif treated_as_bool.include? datatype
+ 'b'
+ elsif treated_as_float.include? datatype
+ 'f'
+ elsif treated_as_string.include? datatype
+ 'z'
+ end
+ end
def unwrap_struct(var_name, target, mrb_type, type)
- %{#{var_name} = DATA_GET_PTR(mrb, #{target}, &#{mrb_type}, #{type})}
+ %{#{var_name} = DATA_GET_PTR(mrb, #{target}, &#{mrb_type}, #{type});\n}
end
def wrap_struct(var_name, target, mrb_type, type)
%{
- #{var_name} = (#{type} *)DATA_PTR(#{target})
+ #{var_name} = (#{type} *)DATA_PTR(#{target});
if(#{var_name}) #{'{'} mrb_free(mrb, #{var_name}); #{'}'}
mrb_data_init(#{target}, NULL, &#{mrb_type});
#{var_name} = (#{type} *)mrb_malloc(mrb, sizeof(#{type}));
@@ -196,6 +224,7 @@ mrb_data_init(#{target}, NULL, &#{mrb_type});
result
end
+ # doesnt seem correct?
def return_format_struct(function)
func_rpart = function.rpartition(' ')
func_datatype = func_rpart.first.delete_suffix(' *')
@@ -203,6 +232,13 @@ mrb_data_init(#{target}, NULL, &#{mrb_type});
"return mrb_obj_value(Data_Wrap_Struct(mrb, #{func_datatype.downcase}_mrb_class, &mrb_#{func_datatype}_struct, return_value));"
end
+ def make_mrb_obj_from_struct(mrb_var, func, struct_var)
+ func_rpart = func.rpartition(' ')
+ func_datatype = func_rpart.first.delete_suffix(' *')
+ func_name = func_rpart.last
+ "mrb_data_init(#{mrb_var}, #{struct_var}, &mrb_#{func_rpart.first}_struct);\n"
+ end
+
# wrapping an existing struct to be used by ruby
def init_struct_wrapper(struct, free_body = nil)
%{
@@ -222,9 +258,9 @@ static const struct mrb_data_type mrb_#{struct}_struct = {
if free_body
%{
- void
- mrb_helper_#{struct}_free(mrb_state* mrb, void*ptr) {
-#{struct} *struct_data = (#{struct}*)ptr;
+ void
+ mrb_helper_#{struct}_free(mrb_state* mrb, void*ptr) {
+ #{struct} *struct_data = (#{struct}*)ptr;
#{free_body}
mrb_free(mrb, ptr);
}