diff options
Diffstat (limited to 'Examples/ruby/hashargs')
-rw-r--r-- | Examples/ruby/hashargs/Makefile | 20 | ||||
-rw-r--r-- | Examples/ruby/hashargs/example.i | 36 | ||||
-rwxr-xr-x | Examples/ruby/hashargs/runme.rb | 26 |
3 files changed, 82 insertions, 0 deletions
diff --git a/Examples/ruby/hashargs/Makefile b/Examples/ruby/hashargs/Makefile new file mode 100644 index 0000000..a2fbbd3 --- /dev/null +++ b/Examples/ruby/hashargs/Makefile @@ -0,0 +1,20 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +SRCS = +TARGET = example +INTERFACE = example.i +LIBS = -lm +SWIGOPT = + +all:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' ruby + +static:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + TARGET='myruby' INTERFACE='$(INTERFACE)' ruby_static + +clean:: + $(MAKE) -f $(TOP)/Makefile ruby_clean + +check: all diff --git a/Examples/ruby/hashargs/example.i b/Examples/ruby/hashargs/example.i new file mode 100644 index 0000000..159bbd3 --- /dev/null +++ b/Examples/ruby/hashargs/example.i @@ -0,0 +1,36 @@ +%module example + +%typemap(in) (int nattributes, const char **names, const int *values) (VALUE keys_ary, int i, VALUE key, VALUE val) { + Check_Type($input, T_HASH); + $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL)); + $2 = NULL; + $3 = NULL; + if ($1 > 0) { + $2 = (char **) malloc($1*sizeof(char *)); + $3 = (int *) malloc($1*sizeof(int)); + keys_ary = rb_funcall($input, rb_intern("keys"), 0, NULL); + for (i = 0; i < $1; i++) { + key = rb_ary_entry(keys_ary, i); + val = rb_hash_aref($input, key); + Check_Type(key, T_STRING); + Check_Type(val, T_FIXNUM); + $2[i] = STR2CSTR(key); + $3[i] = NUM2INT(val); + } + } +} + +%typemap(freearg) (int nattributes, const char **names, const int *values) { + free((void *) $2); + free((void *) $3); +} + +%inline %{ +void setVitalStats(const char *person, int nattributes, const char **names, const int *values) { + int i; + printf("Name: %s\n", person); + for (i = 0; i < nattributes; i++) { + printf(" %s => %d\n", names[i], values[i]); + } +} +%} diff --git a/Examples/ruby/hashargs/runme.rb b/Examples/ruby/hashargs/runme.rb new file mode 100755 index 0000000..0b06f69 --- /dev/null +++ b/Examples/ruby/hashargs/runme.rb @@ -0,0 +1,26 @@ +require 'example' + +include Example + +# Pass arguments in as one or more key-value pairs +setVitalStats("Fred", + 'age' => 42, + 'weight' => 270 + ) + +# The order doesn't matter +setVitalStats("Sally", + 'age' => 29, + 'weight' => 115, + 'height' => 72 + ) + +# Can also pass a hash directly +params = { + 'ears' => 2, + 'eyes' => 2 +} +setVitalStats("Bob", params) + +# An empty hash is fine too +setVitalStats("Joe", {}) |