summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorrealtradam <[email protected]>2022-03-06 05:20:44 -0500
committerrealtradam <[email protected]>2022-03-06 05:20:44 -0500
commita46b7913f413cc083cc73d67442d70339132cd7b (patch)
treeaa89a36c1ed3aeadba02b473aba25bfa0679186b
parent130abe0f012b955e89c10f2771ecb58ec0d8d1e9 (diff)
downloadFelBind-a46b7913f413cc083cc73d67442d70339132cd7b.tar.gz
FelBind-a46b7913f413cc083cc73d67442d70339132cd7b.zip
partially complete phase 3
-rw-r--r--.gitignore2
-rw-r--r--generate.rb152
-rw-r--r--templates.rb38
3 files changed, 171 insertions, 21 deletions
diff --git a/.gitignore b/.gitignore
index eb84171..5db0d93 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,5 @@ result.txt
output
output/*
glue.json
+temp
+temp.c
diff --git a/generate.rb b/generate.rb
index 9eda393..7a90b43 100644
--- a/generate.rb
+++ b/generate.rb
@@ -73,6 +73,7 @@ glue.first.each do |func, params|
end
end
+# also for display statistics
def debug_mark_binding(func, params)
if $phase1.include? func
$complete_phase1[func] = params
@@ -87,53 +88,173 @@ def debug_mark_binding(func, params)
end
end
+# make a function named like a ruby one would
+def rubify_func_name(function)
+ func = function.underscore
+ if func.start_with? 'is_'
+ func = func.delete_prefix('is_') + '?'
+ end
+ func.delete_prefix('get_')
+end
+
+
+
+# generate a return
+def return_format(function, params)
+ func_rpart = function.rpartition(' ')
+ func_datatype = func_rpart.first
+ func_name = func_rpart.last
+ result = ''
+ if func_datatype == 'void'
+ if params.first == 'void'
+ result = "#{func_name}();\nreturn mrb_nil_value();"
+ else
+ result = "#{func_name}(" #);\nreturn mrb_nil_value();"
+ result += params.first.rpartition(' ').last
+
+ params.drop(1).each do |param|
+ result += ", #{param.rpartition(' ').last}"
+ end
+ result += ");\nreturn mrb_nil_value();"
+ end
+ elsif params.first == 'void'
+ result = Tplt.to_mrb(func_datatype, "#{func_name}()") + ';'
+ #if func_datatype == 'int'
+ # result = "return mrb_fixnum_value(#{func_name}());"
+ #elsif func_datatype == 'float' || func_datatype == 'double'
+ # result = "return mrb_float_value(mrb, #{func_name}());"
+ #elsif func_datatype == 'bool'
+ # result = "return mrb_bool_value(#{func_name}());"
+ #elsif func_datatype == 'const char *' || func_datatype == 'char *'
+ # result = "return mrb_str_new_cstr(mrb, #{func_name}());"
+ #end
+ else
+ temp_params = params.first.rpartition(' ').last
+
+ params.drop(1).each do |param|
+ temp_params += ", #{param.rpartition(' ').last}"
+ end
+ result = Tplt.to_mrb(func_datatype, "#{func_name}(#{temp_params})") + ';'
+ #if func_datatype == 'int'
+ # result = "return mrb_fixnum_value(#{func_name}(" #));"
+ #elsif func_datatype == 'float' || func_datatype == 'double'
+ # result = "return mrb_float_value(mrb, #{func_name}(" #));"
+ #elsif func_datatype == 'bool'
+ # result = "return mrb_bool_value(#{func_name}(" #));"
+ #elsif func_datatype == 'const char *' || func_datatype == 'char *'
+ # result = "return mrb_str_new_cstr(mrb, #{func_name}(" #));"
+ #end
+ end
+ result
+end
+
# generates functions
glue.first.each do |func, params|
- # for now dont worry about params or returns
+ # func = function name with return type
+ # func_datatype = function return type
+ # func_name = function name
+ # params = array of params with their data types(void means none)
rpart = func.rpartition(' ')
func_datatype = rpart.first
func_name = rpart.last
+ # if phase 1
if func_datatype == 'void' && params[0] == 'void'
- body = "#{func_name}();\nreturn mrb_nil_value();"
- defines += Template.function(func_name, body)
- init_body += Template.init_module_function('test', func_name.underscore, func_name, "MRB_ARGS_NONE()")
+ body = return_format(func, params) #"#{func_name}();\nreturn mrb_nil_value();"
+ defines += Tplt.function(func_name, body)
+ init_body += Tplt.init_module_function('test', rubify_func_name(func_name), func_name, "MRB_ARGS_NONE()")
bound[func] = params
debug_mark_binding(func, params)
+ # if phase 2
elsif (standard_types.include? func_datatype) && (params[0] == 'void')
if func_datatype == 'int'
- body = "return mrb_fixnum_value(#{func_name}());"
- defines += Template.function(func_name, body)
- init_body += Template.init_module_function('test', func_name.underscore, func_name, "MRB_ARGS_NONE()")
+ #body = "return mrb_fixnum_value(#{func_name}());"
+ body = return_format(func, params)
+ defines += Tplt.function(func_name, body)
+ init_body += Tplt.init_module_function('test', rubify_func_name(func_name), func_name, "MRB_ARGS_NONE()")
bound[func] = params
debug_mark_binding(func, params)
elsif func_datatype == 'float' || func_datatype == 'double'
- body = "return mrb_float_value(mrb, #{func_name}());"
- defines += Template.function(func_name, body)
- init_body += Template.init_module_function('test', func_name.underscore, func_name, "MRB_ARGS_NONE()")
+ #body = "return mrb_float_value(mrb, #{func_name}());"
+ body = return_format(func, params)
+ defines += Tplt.function(func_name, body)
+ init_body += Tplt.init_module_function('test', rubify_func_name(func_name), func_name, "MRB_ARGS_NONE()")
bound[func] = params
debug_mark_binding(func, params)
elsif func_datatype == 'bool'
- body = "return mrb_bool_value(#{func_name}());"
- defines += Template.function(func_name, body)
- init_body += Template.init_module_function('test', func_name.underscore, func_name, "MRB_ARGS_NONE()")
+ #body = "return mrb_bool_value(#{func_name}());"
+ body = return_format(func, params)
+ defines += Tplt.function(func_name, body)
+ init_body += Tplt.init_module_function('test', rubify_func_name(func_name), func_name, "MRB_ARGS_NONE()")
bound[func] = params
debug_mark_binding(func, params)
+ elsif func_datatype == 'const char *' || func_datatype == 'char *'
+ # mrb_value mrb_str_new_cstr(mrb_state* , const char* )
+ #body = "return mrb_str_new_cstr(mrb, #{func_name}());"
+ body = return_format(func, params)
+ defines += Tplt.function(func_name, body)
+ init_body += Tplt.init_module_function('test', rubify_func_name(func_name), func_name, "MRB_ARGS_NONE()")
+
+ bound[func] = params
+ debug_mark_binding(func, params)
+ end
+ elsif standard_types.include? func_datatype # accept params
+ # detecting if there is no struct param(wont need this in the future)
+ no_struct_param = true
+ params.each do |param|
+ if !(standard_types.include? param.rpartition(' ').first)
+ no_struct_param = false
+ break
+ end
+ end
+ if no_struct_param
+ if standard_types.include? func.rpartition(' ').first
+ #$phase3[func] = params
+ # ---
+ #body = ''
+ body = return_format(func, params)
+ init_var_body = ''
+ init_array_body = ''
+ unwrapped_kwargs = ''
+ params.each_with_index do |param, index|
+ temp = param
+ temp_rpart = temp.rpartition(' ')
+ if temp_rpart.first == 'const char *'
+ temp = 'char *' + temp_rpart.last
+ end
+ init_var_body += temp + ";\n"
+ 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}]")};", '')
+ end
+ body = Tplt.get_kwargs(params.length, init_var_body, init_array_body)
+ body += unwrapped_kwargs
+ body += return_format(func, params)
+ defines += Tplt.function(func_name, body)
+ init_body += Tplt.init_module_function('test', rubify_func_name(func_name), func_name, "MRB_ARGS_OPT(1)") # opt stuff isnt correct, need to look at this again
+ # ---
+ #puts func
+ bound[func] = params
+ debug_mark_binding(func, params)
+ else
+ #$phase4[func] = params
+ end
+ else
+ #$phase5[func] = params
end
end
end
-init_body.prepend(Template.define_module('Test'))
+init_body.prepend(Tplt.define_module('Test'))
result = %{
#{includes}
#{defines}
-#{Template.base('test', init_body, nil)}
+#{Tplt.base('test', init_body, nil)}
}
result += "//Bound Functions: #{$complete_phase1.length + $complete_phase2.length + $complete_phase3.length + $complete_phase4.length + $complete_phase5.length} / #{$phase1.length + $phase2.length + $phase3.length + $phase4.length + $phase5.length}\n//---\n"
@@ -146,4 +267,3 @@ result += "//Phase 5 Functions: #{$complete_phase5.length} / #{$phase5.length}\n
puts result
-
diff --git a/templates.rb b/templates.rb
index 177769d..a4c0659 100644
--- a/templates.rb
+++ b/templates.rb
@@ -1,4 +1,4 @@
-module Template
+module Tplt # Template
class << self
def base(gem_name, init_body, final_body)
%{
@@ -34,11 +34,13 @@ mrb_#{function_name}(mrb_state* mrb, mrb_value self) {
}
end
- def get_kwargs(kwarg_num, body)
+ def get_kwargs(kwarg_num, init_var_body, init_array_body)
%{
+#{init_var_body}
+
uint32_t kw_num = #{kwarg_num};
const mrb_sym kw_names[] = {
-#{body}
+#{init_array_body}
};
mrb_value kw_values[kw_num];
const mrb_kwargs kwargs = { kw_num, 0, kw_names, kw_values, NULL };
@@ -49,9 +51,9 @@ mrb_get_args(mrb, "|:", &kwargs);
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}
+} else {
+#{body_if_defined}
}
}
end
@@ -65,6 +67,32 @@ if (mrb_undef_p(kw_values[#{kwarg_iter}])) {
}
end
+ # for converting mrb to C
+ def to_c(type, variable)
+ if (type == 'int') || (type == 'unsigned int') || (type == 'bool')
+ "mrb_as_int(mrb, #{variable})"
+ elsif (type == 'float') || (type == 'double')
+ "mrb_as_float(mrb, #{variable})"
+ elsif (type == 'const char *') || (type == 'char *')
+ "mrb_str_to_cstr(mrb, #{variable})"
+ end
+ end
+
+ # for converting C to mrb
+ def to_mrb(type, variable)
+ if (type == 'int') || (type == 'unsigned int')
+ "mrb_fixnum_value(#{variable})"
+ elsif (type == 'float') || (type == 'double')
+ "mrb_float_value(mrb, #{variable})"
+ elsif type == 'bool'
+ "mrb_bool_value(#{variable})"
+ elsif (type == 'const char *') || (type == 'char *')
+ "mrb_str_new_cstr(mrb, #{variable})"
+ elsif type == 'NULL'
+ 'mrb_nil_value()'
+ end
+ end
+
end
end