aboutsummaryrefslogtreecommitdiff
path: root/Examples/go/goin/example.i
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/go/goin/example.i')
-rw-r--r--Examples/go/goin/example.i106
1 files changed, 106 insertions, 0 deletions
diff --git a/Examples/go/goin/example.i b/Examples/go/goin/example.i
new file mode 100644
index 000000000..b819b8089
--- /dev/null
+++ b/Examples/go/goin/example.i
@@ -0,0 +1,106 @@
+
+%module(directors="1") example
+
+%inline %{
+// Helper functions for converting string arrays
+#include <stdlib.h>
+void *alloc_ptr_array(unsigned int len)
+{
+ return calloc(len, sizeof(void *));
+}
+void set_ptr_array(void *ain, unsigned int pos, void *val)
+{
+ void **a = (void **) ain;
+ a[pos] = val;
+}
+void *get_ptr_array(void *ain, unsigned int pos)
+{
+ void **a = (void **) ain;
+ return a[pos];
+}
+void free_ptr_array(void *ain)
+{
+ void **a = (void **) ain;
+ unsigned int i;
+
+ if (!a)
+ return;
+ for (i = 0; a[i]; i++) {
+ free(a[i]);
+ }
+ free(a);
+}
+char *uintptr_to_string(void *in)
+{
+ return (char *) in;
+}
+void *string_to_uintptr(char *in)
+{
+ return strdup(in);
+}
+%}
+
+// These typemaps convert between an array of strings in Go and a
+// const char** that is NULL terminated in C++.
+%typemap(gotype) (const char * const *) "[]string"
+%typemap(imtype) (const char * const *) "uintptr"
+%typemap(goin) (const char * const *) {
+ if $input == nil || len($input) == 0 {
+ $result = 0
+ } else {
+ $result = Alloc_ptr_array(uint(len($input) + 1))
+ defer func() {
+ Free_ptr_array($result)
+ }()
+ var i uint
+ for i = 0; i < uint(len($input)); i++ {
+ Set_ptr_array($result, i, String_to_uintptr($input[i]))
+ }
+ }
+}
+%typemap(in) (const char * const *) {
+ $1 = (char **) $input;
+}
+%typemap(godirectorin) (const char * const *) {
+ if ($input == 0) {
+ $result = nil
+ } else {
+ var i uint
+ for i = 0; ; i++ {
+ var v uintptr = Get_ptr_array($input, i)
+ if v == 0 {
+ break
+ }
+ }
+ if i == 0 {
+ $result = nil
+ } else {
+ $result = make([]string, i)
+ for i = 0; ; i++ {
+ var v uintptr = Get_ptr_array($input, i)
+ if v == 0 {
+ break
+ }
+ $result[i] = Uintptr_to_string(v)
+ }
+ }
+ }
+}
+
+%feature("director") callbacks;
+
+%inline %{
+ class callbacks {
+ public:
+ virtual bool call1(int v, const char * const *strarray);
+ virtual ~callbacks() {}
+ };
+
+ bool check1(callbacks *c, int v, const char * const *strarray) {
+ return c->call1(v, strarray);
+ }
+
+ bool callbacks::call1(int v, const char * const *strarray) {
+ return false;
+ }
+%}