diff options
| author | realtradam <[email protected]> | 2023-05-26 01:01:44 -0400 |
|---|---|---|
| committer | realtradam <[email protected]> | 2023-05-26 01:01:44 -0400 |
| commit | 85f3e9ed33b3e3cab7e011bae3b1ac99fb4520a7 (patch) | |
| tree | 5f6819bcd93a10c66eb3daf0bd90ec88f194bbb2 /mrb_gems/basic_struct_example | |
| parent | 0e689b72d7fc7afa64508a99948527009712d189 (diff) | |
| download | mruby-playground-85f3e9ed33b3e3cab7e011bae3b1ac99fb4520a7.tar.gz mruby-playground-85f3e9ed33b3e3cab7e011bae3b1ac99fb4520a7.zip | |
some progress
Diffstat (limited to 'mrb_gems/basic_struct_example')
| -rw-r--r-- | mrb_gems/basic_struct_example/autogen.rb | 39 | ||||
| -rw-r--r-- | mrb_gems/basic_struct_example/src/basic_struct_example.c | 177 |
2 files changed, 99 insertions, 117 deletions
diff --git a/mrb_gems/basic_struct_example/autogen.rb b/mrb_gems/basic_struct_example/autogen.rb new file mode 100644 index 0000000..5db0cb8 --- /dev/null +++ b/mrb_gems/basic_struct_example/autogen.rb @@ -0,0 +1,39 @@ +require "FelBind" + +mgem = FelBind::BindGem.new(gem_name: "basic_struct_example") + +mgem.add_class("Color") + +mgem.add_struct(class_name: "Color", cstruct_name: "Color") do |struct| + struct.initializer = true + struct.member( + name: "r", + ctype: "char", + rtype: "int", + accessor: true + ) + struct.member( + name: "g", + ctype: "char", + rtype: "int", + accessor: true + ) + struct.member( + name: "b", + ctype: "char", + rtype: "int", + accessor: true + ) +end + +result = "typedef struct Color +{ + char r; + char g; + char b; +} Color;\n" + +result += mgem.build + +File.write("src/basic_struct_example.c", result) + diff --git a/mrb_gems/basic_struct_example/src/basic_struct_example.c b/mrb_gems/basic_struct_example/src/basic_struct_example.c index ec304a1..9ced661 100644 --- a/mrb_gems/basic_struct_example/src/basic_struct_example.c +++ b/mrb_gems/basic_struct_example/src/basic_struct_example.c @@ -1,129 +1,72 @@ -#include <mruby.h> -#include <mruby/data.h> -#include <mruby/class.h> -#include <mruby/compile.h> -#include <stdio.h> - -// a regular C struct typedef struct Color { char r; char g; char b; } Color; -// we will later be building an interface for it - -// A struct that informs the Ruby VM what function to call -// when garbage collecting our struct wrapper. Here nothing -// special needs to be done so the default "mrb_free" function -// is used. -// Ending the struct name with 'mrb_struct' is a -// convention I like to use for these mruby 'internal' -// structs -static const struct mrb_data_type Color_mrb_struct = { - "Color", // name of the class in ruby - mrb_free // the function we want it to call when garbage collected - // ^ you can customize this, but remember to always call mrb_free - // ^ within whatever customization you make -}; - -static mrb_value -Color_initialize(mrb_state* mrb, mrb_value self) { - //Rectangle *wrapped_value = (Rectangle *) mrb_malloc(mrb, sizeof(Rectangle)); - //MyCustomStruct *wrapped_value = (MyCustomStruct *)mrb_malloc(mrb, sizeof(MyCustomStruct)); - - Color *wrapped_value = (Color *)DATA_PTR(self); - if(wrapped_value) { mrb_free(mrb, wrapped_value); } - mrb_data_init(self, NULL, &Color_mrb_struct); - wrapped_value = (Color *)mrb_malloc(mrb, sizeof(Color)); - - mrb_int parameter_r; // the value that will be recieved from the function call parameter - mrb_int parameter_g; // the value that will be recieved from the function call parameter - mrb_int parameter_b; // the value that will be recieved from the function call parameter - - mrb_get_args(mrb, "iii", ¶meter_r, ¶meter_g, ¶meter_b); // getting the value of the param and storing it. - wrapped_value->r = (char)parameter_r; - wrapped_value->g = (char)parameter_g; - wrapped_value->b = (char)parameter_b; - //mrb_data_init(self, wrapped_value, &mrb_Rectangle_struct); - mrb_data_init(self, wrapped_value, &Color_mrb_struct); +#include <mruby.h> +#include <mruby/data.h> +#include <mruby/class.h> +#include <mruby/compile.h> +#include <stdio.h> +static const struct mrb_data_type felbind_struct_Color = { "Color", mrb_free }; +static mrb_value felbind_struct_init_Color(mrb_state* mrb, mrb_value self) { + Color *felbind_struct_wrapped_Color = (Color *)DATA_PTR(self); + if(felbind_struct_wrapped_Color) { mrb_free(mrb, felbind_struct_wrapped_Color); } + mrb_data_init(self, NULL, &felbind_struct_Color); + felbind_struct_wrapped_Color = (Color *)mrb_malloc(mrb, sizeof(Color)); + mrb_int felbind_param_r; + mrb_int felbind_param_g; + mrb_int felbind_param_b; + mrb_get_args(mrb, "iii", &felbind_param_r, &felbind_param_g, &felbind_param_b); + felbind_struct_wrapped_Color->r = (char)felbind_param_r; + felbind_struct_wrapped_Color->g = (char)felbind_param_g; + felbind_struct_wrapped_Color->b = (char)felbind_param_b; + mrb_data_init(self, felbind_struct_wrapped_Color, &felbind_struct_Color); return self; } - -// defining the function to be later bound to a ruby method -static mrb_value -Color_r_getter(mrb_state *mrb, mrb_value self) -{ - // Unwrap the Ruby object into a C pointer - struct Color *my_struct = DATA_GET_PTR( - mrb, // The Ruby VM - self, // The Ruby object holding the struct - &Color_mrb_struct, // Address to the custom struct tag we declared above - Color // The struct tag we declared at the top - ); - - // Get the x value from the struct and convert it into a Ruby object. Return it - return mrb_fixnum_value(my_struct->r); +static mrb_value felbind_getter_Color_r(mrb_state *mrb, mrb_value self) { + struct Color *felbind_struct_get = DATA_GET_PTR(mrb, self, &felbind_struct_Color, Color); + return mrb_fixnum_value(felbind_struct_get->r); +} +static mrb_value felbind_setter_Color_r(mrb_state *mrb, mrb_value self) { + mrb_int felbind_param_r; + mrb_get_args(mrb, "i", &felbind_param_r); + struct Color *felbind_struct_set = DATA_GET_PTR(mrb, self, &felbind_struct_Color, Color); + felbind_struct_set->r = (char)felbind_param_r; + return mrb_fixnum_value(felbind_struct_set->r); +} +static mrb_value felbind_getter_Color_g(mrb_state *mrb, mrb_value self) { + struct Color *felbind_struct_get = DATA_GET_PTR(mrb, self, &felbind_struct_Color, Color); + return mrb_fixnum_value(felbind_struct_get->g); +} +static mrb_value felbind_setter_Color_g(mrb_state *mrb, mrb_value self) { + mrb_int felbind_param_g; + mrb_get_args(mrb, "i", &felbind_param_g); + struct Color *felbind_struct_set = DATA_GET_PTR(mrb, self, &felbind_struct_Color, Color); + felbind_struct_set->g = (char)felbind_param_g; + return mrb_fixnum_value(felbind_struct_set->g); } - -static mrb_value -Color_r_setter(mrb_state* mrb, mrb_value self) { - mrb_int parameter_r; // the value that will be recieved from the function call parameter - - mrb_get_args(mrb, "i", ¶meter_r); // getting the value of the param and storing it. - - // Unwrap the Ruby object into a C pointer - // same as the function defined above does - Color *my_struct = DATA_GET_PTR(mrb, self, &Color_mrb_struct, Color); - - // Set the value in the struct to the new one - // note: we do not need to rerwap the struct or anything as we - // are using a pointer to change the values inside the wrapped - // struct. - my_struct->r = (char)parameter_r; - - // Ruby convention is to return the value we set so we do that - return mrb_fixnum_value((char)parameter_r); +static mrb_value felbind_getter_Color_b(mrb_state *mrb, mrb_value self) { + struct Color *felbind_struct_get = DATA_GET_PTR(mrb, self, &felbind_struct_Color, Color); + return mrb_fixnum_value(felbind_struct_get->b); } - -// gem initializer -void -mrb_basic_struct_example_gem_init(mrb_state* mrb) { - struct RClass *basic_struct_example_class = mrb_define_module(mrb, "BasicStructExample"); - struct RClass *color_class = mrb_define_class_under( - mrb, - basic_struct_example_class, - "Color", - mrb->object_class - ); - // This macro MUST be called and it must be after the class is defined - MRB_SET_INSTANCE_TT(color_class, MRB_TT_DATA); - - mrb_define_method( - mrb, // Mruby VM state - color_class, // Class we bind method to - "initialize", // Name of method - Color_initialize, // Function we are binding as a method - MRB_ARGS_ANY() // How many arguments are optional/required - ); - mrb_define_method( - mrb, // Mruby VM state - color_class, // Class we bind method to - "r", // Name of method - Color_r_getter, // Function we are binding as a method - MRB_ARGS_NONE() // How many arguments are optional/required - ); - mrb_define_method( - mrb, // Mruby VM state - color_class, // Class we bind method to - "r=", // Name of method - Color_r_setter, // Function we are binding as a method - MRB_ARGS_ANY() // How many arguments are optional/required - ); +static mrb_value felbind_setter_Color_b(mrb_state *mrb, mrb_value self) { + mrb_int felbind_param_b; + mrb_get_args(mrb, "i", &felbind_param_b); + struct Color *felbind_struct_set = DATA_GET_PTR(mrb, self, &felbind_struct_Color, Color); + felbind_struct_set->b = (char)felbind_param_b; + return mrb_fixnum_value(felbind_struct_set->b); } - -// gem finalizer -void -mrb_basic_struct_example_gem_final(mrb_state* mrb) { - +void mrb_basic_struct_example_gem_init(mrb_state* mrb) { + struct RClass *Color_class = mrb_define_module(mrb, "Color"); + MRB_SET_INSTANCE_TT(Color_class, MRB_TT_DATA); + mrb_define_method(mrb, Color_class, "initialize", felbind_struct_init_Color, MRB_ARGS_ANY()); + mrb_define_method(mrb, Color_class, "r", felbind_getter_Color_r, MRB_ARGS_NONE()); + mrb_define_method(mrb, Color_class, "r=", felbind_setter_Color_r, MRB_ARGS_ANY()); + mrb_define_method(mrb, Color_class, "g", felbind_getter_Color_g, MRB_ARGS_NONE()); + mrb_define_method(mrb, Color_class, "g=", felbind_setter_Color_g, MRB_ARGS_ANY()); + mrb_define_method(mrb, Color_class, "b", felbind_getter_Color_b, MRB_ARGS_NONE()); + mrb_define_method(mrb, Color_class, "b=", felbind_setter_Color_b, MRB_ARGS_ANY()); } +void mrb_basic_struct_example_gem_final(mrb_state* mrb) {} |
