summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--generate.rb98
-rw-r--r--templates.rb49
2 files changed, 91 insertions, 56 deletions
diff --git a/generate.rb b/generate.rb
index f94e0ec..38edd9c 100644
--- a/generate.rb
+++ b/generate.rb
@@ -19,6 +19,9 @@ end.parse!
options[:glue] ||= './glue.json'
glue = JSON.parse(File.read(options[:glue]))
+# configuration
+Tplt.treated_as_int |= ['unsigned char']
+
$phase1 = {}
$phase2 = {}
$phase3 = {}
@@ -47,7 +50,7 @@ init_body = ""
# convert types
-# need to make this built in
+# TODO need to make this built in
# functionality(with scanner + generator)
glue.first.keys.each do |k|
rpart = k.rpartition(' ')
@@ -103,9 +106,16 @@ end
# generates structs
+# TODO
+# Auto generate struct accessors
+#
glue.last.each do |struct, params|
defines += Tplt.init_struct_wrapper(struct)
init_body += Tplt.init_class(struct, 'test')
+
+ params.each do |param|
+ #puts param
+ end
end
# generates functions
@@ -118,7 +128,12 @@ glue.first.each do |func, params|
func_datatype = rpart.first
func_name = rpart.last
- next if ['long', 'void *'].include? func_datatype
+ # TODO: just treat longs and shorts as ints
+ #
+ # since void * can be anything just skip functions
+ # (by default) that use it
+ next if ['void *'].include? func_datatype
+
# if phase 1 or 2
if (func_datatype == 'void' && params[0] == 'void') || ((Tplt.non_struct_types.include? func_datatype) && (params[0] == 'void'))
@@ -139,54 +154,49 @@ glue.first.each do |func, params|
end
end
if no_struct_param
- if true# Tplt.non_struct_types.include? func.rpartition(' ').first
- #$phase3[func] = params
- # ---
- body = ''
- #body = Tplt.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}]")};", 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"
+ #if true# Tplt.non_struct_types.include? func.rpartition(' ').first
+ #$phase3[func] = params
+ # ---
+ body = ''
+ #body = Tplt.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}]")};", nil, "#{temp_rpart.last} Argument Missing")
+ end
- body = Tplt.get_kwargs(params.length, init_var_body, init_array_body)
- body += unwrapped_kwargs
+ # 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
- # 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
+ body = Tplt.get_kwargs(params.length, init_var_body, init_array_body)
+ body += unwrapped_kwargs
- 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
- # ---
- #puts func
- debug_mark_binding(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
- #puts func
- #puts params
- #puts '---'
- #$phase4[func] = params
+ 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
+ # ---
+ #puts func
+ debug_mark_binding(func, params)
+ #end
else
#$phase5[func] = params
end
diff --git a/templates.rb b/templates.rb
index 4b01897..981d79c 100644
--- a/templates.rb
+++ b/templates.rb
@@ -14,8 +14,33 @@ mrb_mruby_#{gem_name}_gem_final(mrb_state* mrb) {
}
end
+ attr_writer :treated_as_int
+ def treated_as_int
+ @treated_as_int ||= ['int', 'unsigned int', 'long', 'short']
+ end
+
+ attr_writer :treated_as_bool
+ def treated_as_bool
+ @treated_as_bool ||= ['bool']
+ end
+
+ attr_writer :treated_as_float
+ def treated_as_float
+ @treated_as_float ||= ['float', 'double']
+ end
+
+ attr_writer :treated_as_string
+ def treated_as_string
+ @treated_as_string ||= ['char *', 'const char *']
+ end
+
+ attr_writer :treated_as_void
+ def treated_as_void
+ @treated_as_void ||= ['void']
+ end
+
def non_struct_types
- @non_struct_types ||= ['bool', 'int', 'float', 'double', 'float', 'char *', 'const char *', 'unsigned int', 'void']
+ treated_as_int | treated_as_bool | treated_as_float | treated_as_string | treated_as_void
end
def init_module(module_name)
@@ -92,8 +117,8 @@ if (mrb_undef_p(kw_values[#{kwarg_iter}])) {
def wrap_struct(var_name, target, mrb_type, type)
%{
-#{var_name} = (#{type} *)DATA_PTR(#{target})
-if(#{var_name}) #{'{'} mrb_free(mrb, #{var_name}); #{'}'}
+ #{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}));
}
@@ -106,26 +131,26 @@ mrb_data_init(#{target}, NULL, &#{mrb_type});
# for converting mrb to C
def to_c(type, variable)
- if (type == 'int') || (type == 'unsigned int') || (type == 'bool')
+ if treated_as_int.include?(type) || treated_as_bool.include?(type)
"mrb_as_int(mrb, #{variable})"
- elsif (type == 'float') || (type == 'double')
+ elsif treated_as_float.include? type
"mrb_as_float(mrb, #{variable})"
- elsif (type == 'const char *') || (type == 'char *')
+ elsif treated_as_string.include? type
"mrb_str_to_cstr(mrb, #{variable})"
end
end
# for converting C to mrb
def to_mrb(type, variable)
- if (type == 'int') || (type == 'unsigned int')
+ if treated_as_int.include? type
"mrb_fixnum_value(#{variable})"
- elsif (type == 'float') || (type == 'double')
+ elsif treated_as_float.include? type
"mrb_float_value(mrb, #{variable})"
- elsif type == 'bool'
+ elsif treated_as_bool.include? type
"mrb_bool_value(#{variable})"
- elsif (type == 'const char *') || (type == 'char *')
+ elsif treated_as_string.include? type
"mrb_str_new_cstr(mrb, #{variable})"
- elsif type == 'NULL'
+ elsif treated_as_void.include? type
'mrb_nil_value()'
end
end
@@ -205,7 +230,7 @@ mrb_free(mrb, ptr);
}
}
end
- }
+ }
}
end