summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorrealtradam <[email protected]>2022-03-09 01:20:38 -0500
committerrealtradam <[email protected]>2022-03-09 01:20:38 -0500
commitc2450b53b7c197332d25a76eceafd7f5f80e8f24 (patch)
treed3d59445f53146a9d313328e46d8df0c40177ecc
parent9d440b24a50b54b1708123d77679477b14c4b3c0 (diff)
downloadFelBind-c2450b53b7c197332d25a76eceafd7f5f80e8f24.tar.gz
FelBind-c2450b53b7c197332d25a76eceafd7f5f80e8f24.zip
mostly working phase 4
-rw-r--r--generate.rb70
-rw-r--r--templates.rb19
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)
%{