dwww Home | Show directory contents | Find package

%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;
    }
%}

Generated by dwww version 1.15 on Tue Jul 2 00:14:39 CEST 2024.