mirror of https://github.com/swig/swig
107 lines
2.1 KiB
OpenEdge ABL
107 lines
2.1 KiB
OpenEdge ABL
|
|
%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;
|
|
}
|
|
%}
|