diff options
| author | realtradam <[email protected]> | 2022-03-09 01:20:38 -0500 |
|---|---|---|
| committer | realtradam <[email protected]> | 2022-03-09 01:20:38 -0500 |
| commit | c2450b53b7c197332d25a76eceafd7f5f80e8f24 (patch) | |
| tree | d3d59445f53146a9d313328e46d8df0c40177ecc | |
| parent | 9d440b24a50b54b1708123d77679477b14c4b3c0 (diff) | |
| download | FelBind-c2450b53b7c197332d25a76eceafd7f5f80e8f24.tar.gz FelBind-c2450b53b7c197332d25a76eceafd7f5f80e8f24.zip | |
mostly working phase 4
| -rw-r--r-- | generate.rb | 70 | ||||
| -rw-r--r-- | templates.rb | 19 |
2 files changed, 72 insertions, 17 deletions
diff --git a/generate.rb b/generate.rb index 30ab22a..f94e0ec 100644 --- a/generate.rb +++ b/generate.rb @@ -35,6 +35,7 @@ includes = %{ #include <raylib.h> #include <mruby.h> #include <mruby/array.h> +#include <mruby/data.h> #include <mruby/class.h> #include <mruby/numeric.h> #include <mruby/string.h> @@ -44,6 +45,21 @@ includes = %{ defines = "" init_body = "" + +# convert types +# need to make this built in +# functionality(with scanner + generator) +glue.first.keys.each do |k| + rpart = k.rpartition(' ') + + #glue.first[ mappings[k] ] = glue.first.delete(k) if mappings[k] + if 'Texture2D' == rpart.first + glue.first["Texture #{rpart.last}"] = glue.first.delete(k) + elsif 'RenderTexture2D' == rpart.first + glue.first["RenderTexture #{rpart.last}"] = glue.first.delete(k) + end +end + # for displaying statistics glue.first.each do |func, params| if (func.rpartition(' ').first == 'void') && (params[0] == 'void') @@ -85,6 +101,13 @@ def debug_mark_binding(func, params) end end + +# generates structs +glue.last.each do |struct, params| + defines += Tplt.init_struct_wrapper(struct) + init_body += Tplt.init_class(struct, 'test') +end + # generates functions glue.first.each do |func, params| # func = function name with return type @@ -95,18 +118,13 @@ glue.first.each do |func, params| func_datatype = rpart.first func_name = rpart.last - # if phase 1 - if func_datatype == 'void' && params[0] == 'void' - body = Tplt.return_format(func, params) #"#{func_name}();\nreturn mrb_nil_value();" - #defines += 'PHASE 1\n' - defines += Tplt.function(func_name, body) - init_body += Tplt.init_module_function('test', Tplt.rubify_func_name(func_name), func_name, "MRB_ARGS_NONE()") + next if ['long', 'void *'].include? func_datatype - debug_mark_binding(func, params) - # if phase 2 - elsif (Tplt.non_struct_types.include? func_datatype) && (params[0] == 'void') - body = Tplt.return_format(func, params) - #defines += 'PHASE 2\n' + # if phase 1 or 2 + if (func_datatype == 'void' && params[0] == 'void') || ((Tplt.non_struct_types.include? func_datatype) && (params[0] == 'void')) + body = Tplt.return_format(func, params) + #defines += 'PHASE 1\n' + defines += "\n//#{func}" defines += Tplt.function(func_name, body) init_body += Tplt.init_module_function('test', Tplt.rubify_func_name(func_name), func_name, "MRB_ARGS_NONE()") @@ -121,11 +139,11 @@ glue.first.each do |func, params| end end if no_struct_param - if Tplt.non_struct_types.include? func.rpartition(' ').first + if true# Tplt.non_struct_types.include? func.rpartition(' ').first #$phase3[func] = params # --- - #body = '' - body = Tplt.return_format(func, params) + body = '' + #body = Tplt.return_format(func, params) init_var_body = '' init_array_body = '' unwrapped_kwargs = '' @@ -139,9 +157,25 @@ glue.first.each do |func, params| init_array_body += "mrb_intern_lit(mrb, \"#{temp_rpart.last}\"),\n" unwrapped_kwargs += Tplt.unwrap_kwarg(index, "#{temp_rpart.last} = #{Tplt.to_c(temp_rpart.first, "kw_values[#{index}]")};", nil, "#{temp_rpart.last} Argument Missing") end + + # if return isnt regular types, add struct to init + unless Tplt.non_struct_types.include? func_datatype + init_var_body += "#{func_datatype} *return_value = {0};\n" + end + body = Tplt.get_kwargs(params.length, init_var_body, init_array_body) body += unwrapped_kwargs - body += Tplt.return_format(func, params) + + # if return isnt regular types, use struct return format + if Tplt.non_struct_types.include? func_datatype + body += Tplt.return_format(func, params) + else + body += Tplt.get_module('Test') + body += Tplt.get_class(func_datatype, 'test') + body += Tplt.return_format_struct(func) + end + + defines += "\n//#{func}" defines += Tplt.function(func_name, body) init_body += Tplt.init_module_function('test', Tplt.rubify_func_name(func_name), func_name, "MRB_ARGS_OPT(1)") # opt stuff isnt correct, need to look at this again # --- @@ -177,3 +211,9 @@ result += "//Phase 5 Functions: #{$complete_phase5.length} / #{$phase5.length}\n puts result + +#$phase4.reverse_each do |key, elem| +# puts '---' +# puts key +# pp elem +#end diff --git a/templates.rb b/templates.rb index 4378681..4b01897 100644 --- a/templates.rb +++ b/templates.rb @@ -15,13 +15,21 @@ mrb_mruby_#{gem_name}_gem_final(mrb_state* mrb) { end def non_struct_types - @non_struct_types ||= ['bool', 'int', 'float', 'double', 'float', 'const char *', 'unsigned int', 'void'] + @non_struct_types ||= ['bool', 'int', 'float', 'double', 'float', 'char *', 'const char *', 'unsigned int', 'void'] end def init_module(module_name) "struct RClass *#{module_name.downcase}_module = mrb_define_module(mrb, \"#{module_name}\");" end + def get_module(module_name) + "struct RClass *#{module_name.downcase}_mrb_module = mrb_module_get(mrb, \"#{module_name}\");\n" + end + + def get_class(class_name, defined_under) + "struct RClass *#{class_name.downcase}_mrb_class = mrb_class_get_under(mrb, #{defined_under.downcase}_mrb_module, mrb_#{class_name}_struct.struct_name);\n" + 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}); @@ -31,7 +39,7 @@ mrb_mruby_#{gem_name}_gem_final(mrb_state* mrb) { # define under needs the C name, not the ruby name which may be confusing def init_class(class_name, define_under, is_struct_wrapper = true) %{ -struct RClass *#{class_name.downcase}_class = mrb_define_class_under(mrb, #{define_under}, \"#{class_name}\", mrb->object_class);"#{ +struct RClass *#{class_name.downcase}_class = mrb_define_class_under(mrb, #{define_under}, \"#{class_name}\", mrb->object_class);#{ if is_struct_wrapper "\nMRB_SET_INSTANCE_TT(#{class_name.downcase}_class, MRB_TT_DATA);" end @@ -163,6 +171,13 @@ mrb_data_init(#{target}, NULL, &#{mrb_type}); result end + def return_format_struct(function) + func_rpart = function.rpartition(' ') + func_datatype = func_rpart.first.delete_suffix(' *') + func_name = func_rpart.last + "return mrb_obj_value(Data_Wrap_Struct(mrb, #{func_datatype.downcase}_mrb_class, &mrb_#{func_datatype}_struct, return_value));" + end + # wrapping an existing struct to be used by ruby def init_struct_wrapper(struct, free_body = nil) %{ |
