summaryrefslogtreecommitdiff
path: root/Examples/ruby/hashargs
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/ruby/hashargs')
-rw-r--r--Examples/ruby/hashargs/Makefile20
-rw-r--r--Examples/ruby/hashargs/example.i36
-rwxr-xr-xExamples/ruby/hashargs/runme.rb26
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", {})