This commit is contained in:
FluorescentCIAAfricanAmerican
2020-04-22 12:56:21 -04:00
commit 3bf9df6b27
15370 changed files with 5489726 additions and 0 deletions
+136
View File
@@ -0,0 +1,136 @@
%insert(mli) %{
type _value = c_obj
%}
%insert(ml) %{
type _value = c_obj
%}
%define %array_tmap_out(type,what,out_f)
%typemap(type) what [ANY] {
int i;
/* $*1_type */
$result = caml_array_new($1_dim0);
for( i = 0; i < $1_dim0; i++ ) {
caml_array_set($result,i,out_f($1[i]));
}
}
%enddef
%define %array_tmap_in(type,what,in_f)
%typemap(type) what [ANY] {
int i;
/* $*1_type */
$1 = ($*1_type *)malloc( $1_size );
for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) {
$1[i] = in_f(caml_array_nth($input,i));
}
}
%typemap(free) what [ANY] {
free( (void *)$1 );
}
%enddef
%define %make_simple_array_typemap(type,out_f,in_f)
%array_tmap_out(out,type,out_f);
%array_tmap_out(varout,type,out_f);
%array_tmap_out(directorin,type,out_f);
%array_tmap_in(in,type,in_f);
%array_tmap_in(varin,type,in_f);
%array_tmap_in(directorout,type,in_f);
%enddef
%make_simple_array_typemap(bool,caml_val_bool,caml_long_val);
%make_simple_array_typemap(short,caml_val_short,caml_long_val);
%make_simple_array_typemap(unsigned short,caml_val_ushort,caml_long_val);
%make_simple_array_typemap(int,caml_val_int,caml_long_val);
%make_simple_array_typemap(unsigned int,caml_val_uint,caml_long_val);
%make_simple_array_typemap(long,caml_val_long,caml_long_val);
%make_simple_array_typemap(unsigned long,caml_val_ulong,caml_long_val);
%make_simple_array_typemap(size_t,caml_val_int,caml_long_val);
%make_simple_array_typemap(float,caml_val_float,caml_double_val);
%make_simple_array_typemap(double,caml_val_double,caml_double_val);
#ifdef __cplusplus
%typemap(in) SWIGTYPE [] {
int i;
/* $*1_type */
$1 = new $*1_type [$1_dim0];
for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) {
$1[i] = *(($*1_ltype *)
caml_ptr_val(caml_array_nth($input,i),
$*1_descriptor)) ;
}
}
#else
%typemap(in) SWIGTYPE [] {
int i;
/* $*1_type */
$1 = ($*1_type *)malloc( $1_size );
for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) {
$1[i] = *(($*1_ltype)
caml_ptr_val(caml_array_nth($input),
$*1_descriptor));
}
}
#endif
%typemap(out) SWIGTYPE [] {
int i;
CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr");
$result = caml_array_new($1_dim0);
for( i = 0; i < $1_dim0; i++ ) {
if( fromval ) {
caml_array_set
($result,
i,
callback(*fromval,caml_val_ptr((void *)&$1[i],$*1_descriptor)));
} else {
caml_array_set
($result,
i,
caml_val_ptr ((void *)&$1[i],$&1_descriptor));
}
}
}
%typemap(in) enum SWIGTYPE [] {
int i;
/* $*1_type */
$1 = ($*1_type *)malloc( $1_size );
for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) {
$1[i] = ($type)
caml_long_val_full(caml_array_nth($input),
"$type_marker");
}
}
%typemap(out) enum SWIGTYPE [] {
int i;
$result = caml_array_new($1_dim0);
for( i = 0; i < $1_dim0; i++ ) {
caml_array_set
($result,
i,
callback2(*caml_named_value(SWIG_MODULE "_int_to_enum"),
*caml_named_value("$type_marker"),
Val_int($1[i])));
}
}
#ifdef __cplusplus
%typemap(freearg) SWIGTYPE [ANY] {
delete [] $1;
}
#else
%typemap(freearg) SWIGTYPE [ANY] {
free( (void *)$1 );
}
#endif
@@ -0,0 +1,66 @@
(*Stream:class_ctors*)
let create_$classname_from_ptr raw_ptr =
C_obj
begin
let h = Hashtbl.create 20 in
List.iter (fun (nm,fn) -> Hashtbl.replace h nm fn)
[ "nop", (fun args -> C_void) ;
$classbody
"&", (fun args -> raw_ptr) ;
":parents",
(fun args ->
C_list
(let out = ref [] in
Hashtbl.iter (fun x y -> out := (x,y) :: !out) h ;
(List.map
(fun (x,y) ->
C_string (String.sub x 2 ((String.length x) - 2)))
(List.filter
(fun (x,y) ->
((String.length x) > 2)
&& x.[0] == ':' && x.[1] == ':') !out)))) ;
":classof", (fun args -> C_string "$realname") ;
":methods", (fun args ->
C_list (let out = ref [] in
Hashtbl.iter (fun x y -> out := (C_string x) :: !out) h ; !out))
] ;
let rec invoke_inner raw_ptr mth arg =
begin
try
let application = Hashtbl.find h mth in
application
(match arg with
C_list l -> (C_list (raw_ptr :: l))
| C_void -> (C_list [ raw_ptr ])
| v -> (C_list [ raw_ptr ; v ]))
with Not_found ->
(* Try parent classes *)
begin
let parent_classes = [
$baselist
] in
let rec try_parent plist raw_ptr =
match plist with
p :: tl ->
begin
try
(invoke (p raw_ptr)) mth arg
with (BadMethodName (p,m,s)) ->
try_parent tl raw_ptr
end
| [] ->
raise (BadMethodName (raw_ptr,mth,"$realname"))
in try_parent parent_classes raw_ptr
end
end in
(fun mth arg -> invoke_inner raw_ptr mth arg)
end
let _ = Callback.register
"create_$normalized_from_ptr"
create_$classname_from_ptr
(*Stream:mli*)
val create_$classname_from_ptr : c_obj -> c_obj
+271
View File
@@ -0,0 +1,271 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* cstring.i
*
* This file provides typemaps and macros for dealing with various forms
* of C character string handling. The primary use of this module
* is in returning character data that has been allocated or changed in
* some way.
* ----------------------------------------------------------------------------- */
/* %cstring_input_binary(TYPEMAP, SIZE)
*
* Macro makes a function accept binary string data along with
* a size.
*/
%define %cstring_input_binary(TYPEMAP, SIZE)
%apply (char *STRING, int LENGTH) { (TYPEMAP, SIZE) };
%enddef
/*
* %cstring_bounded_output(TYPEMAP, MAX)
*
* This macro is used to return a NULL-terminated output string of
* some maximum length. For example:
*
* %cstring_bounded_output(char *outx, 512);
* void foo(char *outx) {
* sprintf(outx,"blah blah\n");
* }
*
*/
%define %cstring_bounded_output(TYPEMAP,MAX)
%typemap(ignore) TYPEMAP(char temp[MAX+1]) {
$1 = ($1_ltype) temp;
}
%typemap(argout) TYPEMAP {
$1[MAX] = 0;
$result = caml_list_append($result,caml_val_string(str));
}
%enddef
/*
* %cstring_chunk_output(TYPEMAP, SIZE)
*
* This macro is used to return a chunk of binary string data.
* Embedded NULLs are okay. For example:
*
* %cstring_chunk_output(char *outx, 512);
* void foo(char *outx) {
* memmove(outx, somedata, 512);
* }
*
*/
%define %cstring_chunk_output(TYPEMAP,SIZE)
%typemap(ignore) TYPEMAP(char temp[SIZE]) {
$1 = ($1_ltype) temp;
}
%typemap(argout) TYPEMAP {
$result = caml_list_append($result,caml_val_string_len($1,SIZE));
}
%enddef
/*
* %cstring_bounded_mutable(TYPEMAP, SIZE)
*
* This macro is used to wrap a string that's going to mutate.
*
* %cstring_bounded_mutable(char *in, 512);
* void foo(in *x) {
* while (*x) {
* *x = toupper(*x);
* x++;
* }
* }
*
*/
%define %cstring_bounded_mutable(TYPEMAP,MAX)
%typemap(in) TYPEMAP(char temp[MAX+1]) {
char *t = (char *)caml_ptr_val($input);
strncpy(temp,t,MAX);
$1 = ($1_ltype) temp;
}
%typemap(argout) TYPEMAP {
$result = caml_list_append($result,caml_val_string_len($1,MAX));
}
%enddef
/*
* %cstring_mutable(TYPEMAP [, expansion])
*
* This macro is used to wrap a string that will mutate in place.
* It may change size up to a user-defined expansion.
*
* %cstring_mutable(char *in);
* void foo(in *x) {
* while (*x) {
* *x = toupper(*x);
* x++;
* }
* }
*
*/
%define %cstring_mutable(TYPEMAP,...)
%typemap(in) TYPEMAP {
char *t = String_val($input);
int n = string_length($input);
$1 = ($1_ltype) t;
#if #__VA_ARGS__ == ""
#ifdef __cplusplus
$1 = ($1_ltype) new char[n+1];
#else
$1 = ($1_ltype) malloc(n+1);
#endif
#else
#ifdef __cplusplus
$1 = ($1_ltype) new char[n+1+__VA_ARGS__];
#else
$1 = ($1_ltype) malloc(n+1+__VA_ARGS__);
#endif
#endif
memmove($1,t,n);
$1[n] = 0;
}
%typemap(argout) TYPEMAP {
$result = caml_list_append($result,caml_val_string($1));
#ifdef __cplusplus
delete[] $1;
#else
free($1);
#endif
}
%enddef
/*
* %cstring_output_maxsize(TYPEMAP, SIZE)
*
* This macro returns data in a string of some user-defined size.
*
* %cstring_output_maxsize(char *outx, int max) {
* void foo(char *outx, int max) {
* sprintf(outx,"blah blah\n");
* }
*/
%define %cstring_output_maxsize(TYPEMAP, SIZE)
%typemap(in) (TYPEMAP, SIZE) {
$2 = caml_val_long($input);
#ifdef __cplusplus
$1 = ($1_ltype) new char[$2+1];
#else
$1 = ($1_ltype) malloc($2+1);
#endif
}
%typemap(argout) (TYPEMAP,SIZE) {
$result = caml_list_append($result,caml_val_string($1));
#ifdef __cplusplus
delete [] $1;
#else
free($1);
#endif
}
%enddef
/*
* %cstring_output_withsize(TYPEMAP, SIZE)
*
* This macro is used to return character data along with a size
* parameter.
*
* %cstring_output_maxsize(char *outx, int *max) {
* void foo(char *outx, int *max) {
* sprintf(outx,"blah blah\n");
* *max = strlen(outx);
* }
*/
%define %cstring_output_withsize(TYPEMAP, SIZE)
%typemap(in) (TYPEMAP, SIZE) {
int n = caml_val_long($input);
#ifdef __cplusplus
$1 = ($1_ltype) new char[n+1];
$2 = ($2_ltype) new $*1_ltype;
#else
$1 = ($1_ltype) malloc(n+1);
$2 = ($2_ltype) malloc(sizeof($*1_ltype));
#endif
*$2 = n;
}
%typemap(argout) (TYPEMAP,SIZE) {
$result = caml_list_append($result,caml_val_string_len($1,$2));
#ifdef __cplusplus
delete [] $1;
delete $2;
#else
free($1);
free($2);
#endif
}
%enddef
/*
* %cstring_output_allocate(TYPEMAP, RELEASE)
*
* This macro is used to return character data that was
* allocated with new or malloc.
*
* %cstring_output_allocated(char **outx, free($1));
* void foo(char **outx) {
* *outx = (char *) malloc(512);
* sprintf(outx,"blah blah\n");
* }
*/
%define %cstring_output_allocate(TYPEMAP, RELEASE)
%typemap(ignore) TYPEMAP($*1_ltype temp = 0) {
$1 = &temp;
}
%typemap(argout) TYPEMAP {
if (*$1) {
$result = caml_list_append($result,caml_val_string($1));
RELEASE;
} else {
$result = caml_list_append($result,caml_val_ptr($1));
}
}
%enddef
/*
* %cstring_output_allocate_size(TYPEMAP, SIZE, RELEASE)
*
* This macro is used to return character data that was
* allocated with new or malloc.
*
* %cstring_output_allocated(char **outx, int *sz, free($1));
* void foo(char **outx, int *sz) {
* *outx = (char *) malloc(512);
* sprintf(outx,"blah blah\n");
* *sz = strlen(outx);
* }
*/
%define %cstring_output_allocate_size(TYPEMAP, SIZE, RELEASE)
%typemap(ignore) (TYPEMAP, SIZE) ($*1_ltype temp = 0, $*2_ltype tempn) {
$1 = &temp;
$2 = &tempn;
}
%typemap(argout)(TYPEMAP,SIZE) {
if (*$1) {
$result = caml_list_append($result,caml_val_string_len($1,$2));
RELEASE;
} else
$result = caml_list_append($result,caml_val_ptr($1));
}
%enddef
@@ -0,0 +1,103 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* director.swg
*
* This file contains support for director classes that proxy
* method calls from C++ to Ocaml extensions.
*
* ----------------------------------------------------------------------------- */
#ifdef __cplusplus
#include <string>
namespace Swig {
/* base class for director exceptions */
class DirectorException {
protected:
std::string swig_msg;
public:
DirectorException(const char* msg="") {
}
const char *getMessage() const {
return swig_msg.c_str();
}
virtual ~DirectorException() {}
};
/* type mismatch in the return value from a python method call */
class DirectorTypeMismatchException : public Swig::DirectorException {
public:
DirectorTypeMismatchException(const char* msg="") {
}
};
/* any python exception that occurs during a director method call */
class DirectorMethodException : public Swig::DirectorException {};
/* attempt to call a pure virtual method via a director method */
class DirectorPureVirtualException : public Swig::DirectorException {
public:
DirectorPureVirtualException(const char* msg="") {
}
static void raise(const char *msg) {
throw DirectorPureVirtualException(msg);
}
};
/* simple thread abstraction for pthreads on win32 */
#ifdef __THREAD__
#define __PTHREAD__
#if defined(_WIN32) || defined(__WIN32__)
#define pthread_mutex_lock EnterCriticalSection
#define pthread_mutex_unlock LeaveCriticalSection
#define pthread_mutex_t CRITICAL_SECTION
#define MUTEX_INIT(var) CRITICAL_SECTION var
#else
#include <pthread.h>
#define MUTEX_INIT(var) pthread_mutex_t var = PTHREAD_MUTEX_INITIALIZER
#endif
#endif
/* director base class */
class Director {
private:
/* pointer to the wrapped ocaml object */
CAML_VALUE swig_self;
/* flag indicating whether the object is owned by ocaml or c++ */
mutable bool swig_disown_flag;
public:
/* wrap a ocaml object, optionally taking ownership */
Director(CAML_VALUE self) : swig_self(self), swig_disown_flag(false) {
register_global_root(&swig_self);
}
/* discard our reference at destruction */
virtual ~Director() {
remove_global_root(&swig_self);
swig_disown();
// Disown is safe here because we're just divorcing a reference that
// points to us.
}
/* return a pointer to the wrapped ocaml object */
CAML_VALUE swig_get_self() const {
return swig_self;
}
/* acquire ownership of the wrapped ocaml object (the sense of "disown"
* is from ocaml) */
void swig_disown() const {
if (!swig_disown_flag) {
swig_disown_flag=true;
callback(*caml_named_value("caml_obj_disown"),swig_self);
}
}
};
}
#endif /* __cplusplus */
@@ -0,0 +1,5 @@
# see top-level Makefile.in
# libswigocaml is not needed anymore.
swigp4.ml
swig.mli
swig.ml
@@ -0,0 +1,20 @@
/* Ocaml runtime support */
#ifdef __cplusplus
extern "C" {
#endif
typedef int oc_bool;
extern void *nullptr;
extern oc_bool isnull( void *v );
extern void *get_char_ptr( char *str );
extern void *make_ptr_array( int size );
extern void *get_ptr( void *arrayptr, int elt );
extern void set_ptr( void *arrayptr, int elt, void *elt_v );
extern void *offset_ptr( void *ptr, int n );
#ifdef __cplusplus
};
#endif
+61
View File
@@ -0,0 +1,61 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* ocaml.i
*
* SWIG Configuration File for Ocaml
* ----------------------------------------------------------------------------- */
%runtime %{
#define SWIGSTATIC static
%}
/* Insert common stuff */
%insert(runtime) "swigrun.swg"
/* Include headers */
%insert(runtime) "ocamldec.swg"
/* Type registration */
%insert(init) "swiginit.swg"
%insert(init) "typeregister.swg"
%insert(mlitail) %{
val swig_val : c_enum_type -> c_obj -> Swig.c_obj
%}
%insert(mltail) %{
let rec swig_val t v =
match v with
C_enum e -> enum_to_int t v
| C_list l -> Swig.C_list (List.map (swig_val t) l)
| C_array a -> Swig.C_array (Array.map (swig_val t) a)
| _ -> Obj.magic v
%}
/*#ifndef SWIG_NOINCLUDE*/
%insert(runtime) "ocaml.swg"
/*#endif*/
%insert(classtemplate) "class.swg"
/* Definitions */
#define SWIG_malloc(size) swig_malloc(size, FUNC_NAME)
#define SWIG_free(mem) free(mem)
/* Read in standard typemaps. */
%include <swig.swg>
%include <typemaps.i>
%include <typecheck.i>
%include <exception.i>
%include <preamble.swg>
/* ocaml keywords */
/* There's no need to use this, because of my rewriting machinery. C++
* words never collide with ocaml keywords */
/* still we include the file, but the warning says that the offending
name will be properly renamed. Just to let the user to know about
it. */
%include <ocamlkw.swg>
+602
View File
@@ -0,0 +1,602 @@
/* -*-c-*- */
/* SWIG pointer structure */
#include <string.h>
#include <assert.h>
#ifdef __cplusplus
extern "C" {
#endif
#define C_bool 0
#define C_char 1
#define C_uchar 2
#define C_short 3
#define C_ushort 4
#define C_int 5
#define C_uint 6
#define C_int32 7
#define C_int64 8
#define C_float 9
#define C_double 10
#define C_ptr 11
#define C_array 12
#define C_list 13
#define C_obj 14
#define C_string 15
#define C_enum 16
#define C_director_core 17
/* Cast a pointer if possible; returns 1 if successful */
SWIGSTATIC int
SWIG_Cast (void *source, swig_type_info *source_type,
void **ptr, swig_type_info *dest_type)
{
if( !source ) { // Special case for NULL. This is a popular question
// for other modules on the list, so I want an easy way out...
*ptr = 0;
return 0;
}
#ifdef TYPE_CAST_VERBOSE
fprintf( stderr, "Trying to cast %s to %s\n",
source_type ? source_type->str : "<none>",
dest_type ? dest_type->str : "<none>" );
#endif
if (dest_type != source_type) {
/* We have a type mismatch. Will have to look through our type
mapping table to figure out whether or not we can accept this
datatype.
--
Ignore typechecks for void *. Allow any conversion. */
if( !dest_type || !source_type ||
!strcmp(dest_type->name,"_p_void") ||
!strcmp(source_type->name,"_p_void") ) {
*ptr = source;
return 0;
} else {
swig_cast_info *tc =
SWIG_TypeCheckStruct(source_type, dest_type );
#ifdef TYPE_CAST_VERBOSE
fprintf( stderr, "Typecheck -> %s\n",
tc ? tc->str : "<none>" );
#endif
if( tc ) {
int newmemory = 0;
*ptr = SWIG_TypeCast(tc, source, &newmemory);
assert(!newmemory); /* newmemory handling not yet implemented */
return 0;
} else
return -1;
}
} else {
*ptr = source;
return 0;
}
}
/* Return 0 if successful. */
SWIGSTATIC int
SWIG_GetPtr(void *inptr, void **outptr,
swig_type_info *intype, swig_type_info *outtype) {
if (intype) {
return SWIG_Cast(inptr, intype,
outptr, outtype) == -1;
} else {
*outptr = inptr;
return 0;
}
}
SWIGSTATIC void caml_print_list( CAML_VALUE v );
SWIGSTATIC void caml_print_val( CAML_VALUE v ) {
switch( SWIG_Tag_val(v) ) {
case C_bool:
if( Bool_val(SWIG_Field(v,0)) ) fprintf( stderr, "true " );
else fprintf( stderr, "false " );
break;
case C_char:
case C_uchar:
fprintf( stderr, "'%c' (\\%03d) ",
(Int_val(SWIG_Field(v,0)) >= ' ' &&
Int_val(SWIG_Field(v,0)) < 127) ? Int_val(SWIG_Field(v,0)) : '.',
Int_val(SWIG_Field(v,0)) );
break;
case C_short:
case C_ushort:
case C_int:
fprintf( stderr, "%d ", (int)caml_long_val(v) );
break;
case C_uint:
case C_int32:
fprintf( stderr, "%ud ", (unsigned int)caml_long_val(v) );
break;
case C_int64:
fprintf( stderr, "%ld ", caml_long_val(v) );
break;
case C_float:
case C_double:
fprintf( stderr, "%f ", caml_double_val(v) );
break;
case C_ptr:
{
void *vout = 0;
swig_type_info *ty = (swig_type_info *)(long)SWIG_Int64_val(SWIG_Field(v,1));
caml_ptr_val_internal(v,&vout,0);
fprintf( stderr, "PTR(%p,%s) ",
vout,
ty ? ty->name : "(null)" );
}
break;
case C_array:
{
unsigned int i;
for( i = 0; i < Wosize_val( SWIG_Field(v,0) ); i++ )
caml_print_val( SWIG_Field(SWIG_Field(v,0),i) );
}
break;
case C_list:
caml_print_list( SWIG_Field(v,0) );
break;
case C_obj:
fprintf( stderr, "OBJ(%p) ", (void *)SWIG_Field(v,0) );
break;
case C_string:
{
void *cout;
caml_ptr_val_internal(v,&cout,0);
fprintf( stderr, "'%s' ", (char *)cout );
}
break;
}
}
SWIGSTATIC void caml_print_list( CAML_VALUE v ) {
CAMLparam1(v);
while( v && Is_block(v) ) {
fprintf( stderr, "[ " );
caml_print_val( SWIG_Field(v,0) );
fprintf( stderr, "]\n" );
v = SWIG_Field(v,1);
}
CAMLreturn0;
}
SWIGSTATIC CAML_VALUE caml_list_nth( CAML_VALUE lst, int n ) {
CAMLparam1(lst);
int i = 0;
while( i < n && lst && Is_block(lst) ) {
i++; lst = SWIG_Field(lst,1);
}
if( lst == Val_unit ) CAMLreturn(Val_unit);
else CAMLreturn(SWIG_Field(lst,0));
}
SWIGSTATIC CAML_VALUE caml_list_append( CAML_VALUE lst, CAML_VALUE elt ) {
CAMLparam2(lst,elt);
SWIG_CAMLlocal3(v,vt,lh);
lh = Val_unit;
v = Val_unit;
/* Appending C_void should have no effect */
if( !Is_block(elt) ) return lst;
while( lst && Is_block(lst) ) {
if( v && v != Val_unit ) {
vt = alloc_tuple(2);
SWIG_Store_field(v,1,vt);
v = vt;
} else {
v = lh = alloc_tuple(2);
}
SWIG_Store_field(v,0,SWIG_Field(lst,0));
lst = SWIG_Field(lst,1);
}
if( v && Is_block(v) ) {
vt = alloc_tuple(2);
SWIG_Store_field(v,1,vt);
v = vt;
} else {
v = lh = alloc_tuple(2);
}
SWIG_Store_field(v,0,elt);
SWIG_Store_field(v,1,Val_unit);
CAMLreturn(lh);
}
SWIGSTATIC int caml_list_length( CAML_VALUE lst ) {
CAMLparam1(lst);
int i = 0;
while( lst && Is_block(lst) ) { i++; lst = SWIG_Field(lst,1); }
CAMLreturn(i);
}
SWIGSTATIC void caml_array_set( CAML_VALUE arr, int n, CAML_VALUE item ) {
CAMLparam2(arr,item);
SWIG_Store_field(SWIG_Field(arr,0),n,item);
CAMLreturn0;
}
SWIGSTATIC value caml_array_nth( CAML_VALUE arr, int n ) {
CAMLparam1(arr);
if( SWIG_Tag_val(arr) == C_array )
CAMLreturn(SWIG_Field(SWIG_Field(arr,0),n));
else if( SWIG_Tag_val(arr) == C_list )
CAMLreturn(caml_list_nth(arr,0));
else
failwith("Need array or list");
}
SWIGSTATIC int caml_array_len( CAML_VALUE arr ) {
CAMLparam1(arr);
if( SWIG_Tag_val(arr) == C_array )
CAMLreturn(Wosize_val(SWIG_Field(arr,0)));
else if( SWIG_Tag_val(arr) == C_list )
CAMLreturn(caml_list_length(arr));
else
failwith("Need array or list");
}
SWIGSTATIC CAML_VALUE caml_swig_alloc(int x,int y) {
return caml_alloc(x,y);
}
SWIGSTATIC value caml_array_new( int n ) {
CAMLparam0();
SWIG_CAMLlocal1(vv);
vv = caml_swig_alloc(1,C_array);
SWIG_Store_field(vv,0,alloc_tuple(n));
CAMLreturn(vv);
}
SWIGSTATIC CAML_VALUE caml_val_bool( int b ) {
CAMLparam0();
SWIG_CAMLlocal1(bv);
bv = caml_swig_alloc(1,C_bool);
SWIG_Store_field(bv,0,Val_bool(b));
CAMLreturn(bv);
}
SWIGSTATIC CAML_VALUE caml_val_char( char c ) {
CAMLparam0();
SWIG_CAMLlocal1(cv);
cv = caml_swig_alloc(1,C_char);
SWIG_Store_field(cv,0,Val_int(c));
CAMLreturn(cv);
}
SWIGSTATIC CAML_VALUE caml_val_uchar( unsigned char uc ) {
CAMLparam0();
SWIG_CAMLlocal1(ucv);
ucv = caml_swig_alloc(1,C_uchar);
SWIG_Store_field(ucv,0,Val_int(uc));
CAMLreturn(ucv);
}
SWIGSTATIC CAML_VALUE caml_val_short( short s ) {
CAMLparam0();
SWIG_CAMLlocal1(sv);
sv = caml_swig_alloc(1,C_short);
SWIG_Store_field(sv,0,Val_int(s));
CAMLreturn(sv);
}
SWIGSTATIC CAML_VALUE caml_val_ushort( unsigned short us ) {
CAMLparam0();
SWIG_CAMLlocal1(usv);
usv = caml_swig_alloc(1,C_ushort);
SWIG_Store_field(usv,0,Val_int(us));
CAMLreturn(usv);
}
SWIGSTATIC CAML_VALUE caml_val_int( int i ) {
CAMLparam0();
SWIG_CAMLlocal1(iv);
iv = caml_swig_alloc(1,C_int);
SWIG_Store_field(iv,0,Val_int(i));
CAMLreturn(iv);
}
SWIGSTATIC CAML_VALUE caml_val_uint( unsigned int ui ) {
CAMLparam0();
SWIG_CAMLlocal1(uiv);
uiv = caml_swig_alloc(1,C_int);
SWIG_Store_field(uiv,0,Val_int(ui));
CAMLreturn(uiv);
}
SWIGSTATIC CAML_VALUE caml_val_long( long l ) {
CAMLparam0();
SWIG_CAMLlocal1(lv);
lv = caml_swig_alloc(1,C_int64);
SWIG_Store_field(lv,0,copy_int64(l));
CAMLreturn(lv);
}
SWIGSTATIC CAML_VALUE caml_val_ulong( unsigned long ul ) {
CAMLparam0();
SWIG_CAMLlocal1(ulv);
ulv = caml_swig_alloc(1,C_int64);
SWIG_Store_field(ulv,0,copy_int64(ul));
CAMLreturn(ulv);
}
SWIGSTATIC CAML_VALUE caml_val_float( float f ) {
CAMLparam0();
SWIG_CAMLlocal1(fv);
fv = caml_swig_alloc(1,C_float);
SWIG_Store_field(fv,0,copy_double((double)f));
CAMLreturn(fv);
}
SWIGSTATIC CAML_VALUE caml_val_double( double d ) {
CAMLparam0();
SWIG_CAMLlocal1(fv);
fv = caml_swig_alloc(1,C_double);
SWIG_Store_field(fv,0,copy_double(d));
CAMLreturn(fv);
}
SWIGSTATIC CAML_VALUE caml_val_ptr( void *p, swig_type_info *info ) {
CAMLparam0();
SWIG_CAMLlocal1(vv);
vv = caml_swig_alloc(2,C_ptr);
SWIG_Store_field(vv,0,copy_int64((long)p));
SWIG_Store_field(vv,1,copy_int64((long)info));
CAMLreturn(vv);
}
SWIGSTATIC CAML_VALUE caml_val_string( const char *p ) {
CAMLparam0();
SWIG_CAMLlocal1(vv);
if( !p ) CAMLreturn(caml_val_ptr( (void *)p, 0 ));
vv = caml_swig_alloc(1,C_string);
SWIG_Store_field(vv,0,copy_string(p));
CAMLreturn(vv);
}
SWIGSTATIC CAML_VALUE caml_val_string_len( const char *p, int len ) {
CAMLparam0();
SWIG_CAMLlocal1(vv);
if( !p || len < 0 ) CAMLreturn(caml_val_ptr( (void *)p, 0 ));
vv = caml_swig_alloc(1,C_string);
SWIG_Store_field(vv,0,alloc_string(len));
memcpy(String_val(SWIG_Field(vv,0)),p,len);
CAMLreturn(vv);
}
#define caml_val_obj(v, name) caml_val_obj_helper(v, SWIG_TypeQuery((name)), name)
SWIGSTATIC CAML_VALUE caml_val_obj_helper( void *v, swig_type_info *type, char *name) {
CAMLparam0();
CAMLreturn(callback2(*caml_named_value("caml_create_object_fn"),
caml_val_ptr(v,type),
copy_string(name)));
}
SWIGSTATIC long caml_long_val_full( CAML_VALUE v, char *name ) {
CAMLparam1(v);
if( !Is_block(v) ) return 0;
switch( SWIG_Tag_val(v) ) {
case C_bool:
case C_char:
case C_uchar:
case C_short:
case C_ushort:
case C_int:
CAMLreturn(Int_val(SWIG_Field(v,0)));
case C_uint:
case C_int32:
CAMLreturn(Int32_val(SWIG_Field(v,0)));
case C_int64:
CAMLreturn((long)SWIG_Int64_val(SWIG_Field(v,0)));
case C_float:
case C_double:
CAMLreturn((long)Double_val(SWIG_Field(v,0)));
case C_string:
CAMLreturn((long)String_val(SWIG_Field(v,0)));
case C_ptr:
CAMLreturn((long)SWIG_Int64_val(SWIG_Field(SWIG_Field(v,0),0)));
case C_enum: {
SWIG_CAMLlocal1(ret);
CAML_VALUE *enum_to_int = caml_named_value(SWIG_MODULE "_enum_to_int");
if( !name ) failwith( "Not an enum conversion" );
ret = callback2(*enum_to_int,*caml_named_value(name),v);
CAMLreturn(caml_long_val(ret));
}
default:
failwith("No conversion to int");
}
}
SWIGSTATIC long caml_long_val( CAML_VALUE v ) {
return caml_long_val_full(v,0);
}
SWIGSTATIC double caml_double_val( CAML_VALUE v ) {
CAMLparam1(v);
if( !Is_block(v) ) return 0.0;
switch( SWIG_Tag_val(v) ) {
case C_bool:
case C_char:
case C_uchar:
case C_short:
case C_ushort:
case C_int:
CAMLreturn_type(Int_val(SWIG_Field(v,0)));
case C_uint:
case C_int32:
CAMLreturn_type(Int32_val(SWIG_Field(v,0)));
case C_int64:
CAMLreturn_type(SWIG_Int64_val(SWIG_Field(v,0)));
case C_float:
case C_double:
CAMLreturn_type(Double_val(SWIG_Field(v,0)));
default:
fprintf( stderr, "Unknown block tag %d\n", SWIG_Tag_val(v) );
failwith("No conversion to double");
}
}
SWIGSTATIC int caml_ptr_val_internal( CAML_VALUE v, void **out,
swig_type_info *descriptor ) {
CAMLparam1(v);
void *outptr = NULL;
swig_type_info *outdescr = NULL;
if( v == Val_unit ) {
*out = 0;
CAMLreturn(0);
}
if( !Is_block(v) ) return -1;
switch( SWIG_Tag_val(v) ) {
case C_int:
if( !caml_long_val( v ) ) {
*out = 0;
CAMLreturn(0);
} else {
*out = 0;
CAMLreturn(1);
}
break;
case C_obj:
CAMLreturn
(caml_ptr_val_internal
(callback(*caml_named_value("caml_obj_ptr"),v),
out,descriptor));
case C_string:
outptr = (void *)String_val(SWIG_Field(v,0));
break;
case C_ptr:
outptr = (void *)(long)SWIG_Int64_val(SWIG_Field(v,0));
outdescr = (swig_type_info *)(long)SWIG_Int64_val(SWIG_Field(v,1));
break;
default:
*out = 0;
CAMLreturn(1);
break;
}
CAMLreturn(SWIG_GetPtr(outptr,out,outdescr,descriptor));
}
SWIGSTATIC void *caml_ptr_val( CAML_VALUE v, swig_type_info *descriptor ) {
CAMLparam0();
#ifdef TYPE_CAST_VERBOSE
caml_print_val( v );
#endif
void *out = NULL;
if( !caml_ptr_val_internal( v, &out, descriptor ) )
CAMLreturn_type(out);
else
failwith( "No appropriate conversion found." );
}
SWIGSTATIC char *caml_string_val( CAML_VALUE v ) {
return (char *)caml_ptr_val( v, 0 );
}
SWIGSTATIC int caml_string_len( CAML_VALUE v ) {
switch( SWIG_Tag_val(v) ) {
case C_string:
return string_length(SWIG_Field(v,0));
default:
return strlen((char *)caml_ptr_val(v,0));
}
}
SWIGSTATIC int caml_bool_check( CAML_VALUE v ) {
CAMLparam1(v);
if( !Is_block(v) ) return 0;
switch( SWIG_Tag_val(v) ) {
case C_bool:
case C_ptr:
case C_string:
CAMLreturn(1);
default:
CAMLreturn(0);
}
}
SWIGSTATIC int caml_int_check( CAML_VALUE v ) {
CAMLparam1(v);
if( !Is_block(v) ) return 0;
switch( SWIG_Tag_val(v) ) {
case C_char:
case C_uchar:
case C_short:
case C_ushort:
case C_int:
case C_uint:
case C_int32:
case C_int64:
CAMLreturn(1);
default:
CAMLreturn(0);
}
}
SWIGSTATIC int caml_float_check( CAML_VALUE v ) {
CAMLparam1(v);
if( !Is_block(v) ) return 0;
switch( SWIG_Tag_val(v) ) {
case C_float:
case C_double:
CAMLreturn(1);
default:
CAMLreturn(0);
}
}
SWIGSTATIC int caml_ptr_check( CAML_VALUE v ) {
CAMLparam1(v);
if( !Is_block(v) ) return 0;
switch( SWIG_Tag_val(v) ) {
case C_string:
case C_ptr:
case C_int64:
CAMLreturn(1);
default:
CAMLreturn(0);
}
}
static swig_module_info *SWIG_Ocaml_GetModule() {
CAML_VALUE pointer;
pointer = callback(*caml_named_value("swig_find_type_info"), caml_val_int(0));
if (Is_block(pointer) && SWIG_Tag_val(pointer) == C_ptr) {
return (swig_module_info *)(void *)(long)SWIG_Int64_val(SWIG_Field(pointer,0));
}
return 0;
}
static void SWIG_Ocaml_SetModule(swig_module_info *pointer) {
CAML_VALUE mod_pointer;
mod_pointer = caml_val_ptr(pointer, NULL);
callback(*caml_named_value("swig_set_type_info"), mod_pointer);
}
#ifdef __cplusplus
}
#endif
#undef value
@@ -0,0 +1,172 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* ocamldec.swg
*
* Ocaml runtime code -- declarations
* ----------------------------------------------------------------------------- */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef __cplusplus
#define SWIGEXT extern "C"
SWIGEXT {
#else
#define SWIGEXT
#endif
#define value caml_value_t
#define CAML_VALUE caml_value_t
#include <caml/alloc.h>
#include <caml/custom.h>
#include <caml/mlvalues.h>
#include <caml/memory.h>
#include <caml/callback.h>
#include <caml/fail.h>
#include <caml/misc.h>
#define caml_array_set swig_caml_array_set
// Adapted from memory.h and mlvalues.h
#define SWIG_CAMLlocal1(x) \
caml_value_t x = 0; \
CAMLxparam1 (x)
#define SWIG_CAMLlocal2(x, y) \
caml_value_t x = 0, y = 0; \
CAMLxparam2 (x, y)
#define SWIG_CAMLlocal3(x, y, z) \
caml_value_t x = 0, y = 0, z = 0; \
CAMLxparam3 (x, y, z)
#define SWIG_CAMLlocal4(x, y, z, t) \
caml_value_t x = 0, y = 0, z = 0, t = 0; \
CAMLxparam4 (x, y, z, t)
#define SWIG_CAMLlocal5(x, y, z, t, u) \
caml_value_t x = 0, y = 0, z = 0, t = 0, u = 0; \
CAMLxparam5 (x, y, z, t, u)
#define SWIG_CAMLlocalN(x, size) \
caml_value_t x [(size)] = { 0, /* 0, 0, ... */ }; \
CAMLxparamN (x, (size))
#define SWIG_Field(x, i) (((caml_value_t *)(x)) [i]) /* Also an l-value. */
#define SWIG_Store_field(block, offset, val) do{ \
mlsize_t caml__temp_offset = (offset); \
caml_value_t caml__temp_val = (val); \
modify (&SWIG_Field ((block), caml__temp_offset), caml__temp_val); \
}while(0)
#define SWIG_Data_custom_val(v) ((void *) &SWIG_Field((v), 1))
#ifdef ARCH_BIG_ENDIAN
#define SWIG_Tag_val(val) (((unsigned char *) (val)) [-1])
/* Also an l-value. */
#define SWIG_Tag_hp(hp) (((unsigned char *) (hp)) [sizeof(caml_value_t)-1])
/* Also an l-value. */
#else
#define SWIG_Tag_val(val) (((unsigned char *) (val)) [-sizeof(caml_value_t)])
/* Also an l-value. */
#define SWIG_Tag_hp(hp) (((unsigned char *) (hp)) [0])
/* Also an l-value. */
#endif
#ifdef CAMLreturn0
#undef CAMLreturn0
#endif
#define CAMLreturn0 do{ \
caml_local_roots = caml__frame; \
return; \
}while (0)
#ifdef CAMLreturn
#undef CAMLreturn
#endif
#define CAMLreturn(result) do{ \
caml_value_t caml__temp_result = (result); \
caml_local_roots = caml__frame; \
return (caml__temp_result); \
}while(0)
#define CAMLreturn_type(result) do{ \
caml_local_roots = caml__frame; \
return result; \
}while(0)
#ifdef CAMLnoreturn
#undef CAMLnoreturn
#endif
#define CAMLnoreturn ((void) caml__frame)
#ifndef ARCH_ALIGN_INT64
#define SWIG_Int64_val(v) (*((int64 *) SWIG_Data_custom_val(v)))
#else
CAMLextern int64 Int64_val(caml_value_t v);
#define SWIG_Int64_val(v) Int64_val(v)
#endif
#define SWIG_NewPointerObj(p,type,flags) caml_val_ptr(p,type)
#define SWIG_GetModule(clientdata) SWIG_Ocaml_GetModule()
#define SWIG_SetModule(clientdata, pointer) SWIG_Ocaml_SetModule(pointer)
#define SWIG_contract_assert(expr, msg) if(!(expr)) {failwith(msg);} else
SWIGSTATIC int
SWIG_GetPtr(void *source, void **result, swig_type_info *type, swig_type_info *result_type);
SWIGSTATIC void *
SWIG_MustGetPtr (CAML_VALUE v, swig_type_info *type);
SWIGSTATIC CAML_VALUE _wrap_delete_void( CAML_VALUE );
SWIGSTATIC int enum_to_int( char *name, CAML_VALUE v );
SWIGSTATIC CAML_VALUE int_to_enum( char *name, int v );
SWIGSTATIC CAML_VALUE caml_list_nth( CAML_VALUE lst, int n );
SWIGSTATIC CAML_VALUE caml_list_append( CAML_VALUE lst, CAML_VALUE elt );
SWIGSTATIC int caml_list_length( CAML_VALUE lst );
SWIGSTATIC CAML_VALUE caml_array_new( int n );
SWIGSTATIC void caml_array_set( CAML_VALUE arr, int n, CAML_VALUE item );
SWIGSTATIC CAML_VALUE caml_array_nth( CAML_VALUE arr, int n );
SWIGSTATIC int caml_array_length( CAML_VALUE arr );
SWIGSTATIC CAML_VALUE caml_val_char( char c );
SWIGSTATIC CAML_VALUE caml_val_uchar( unsigned char c );
SWIGSTATIC CAML_VALUE caml_val_short( short s );
SWIGSTATIC CAML_VALUE caml_val_ushort( unsigned short s );
SWIGSTATIC CAML_VALUE caml_val_int( int x );
SWIGSTATIC CAML_VALUE caml_val_uint( unsigned int x );
SWIGSTATIC CAML_VALUE caml_val_long( long x );
SWIGSTATIC CAML_VALUE caml_val_ulong( unsigned long x );
SWIGSTATIC CAML_VALUE caml_val_float( float f );
SWIGSTATIC CAML_VALUE caml_val_double( double d );
SWIGSTATIC CAML_VALUE caml_val_ptr( void *p, swig_type_info *descriptor );
SWIGSTATIC CAML_VALUE caml_val_string( const char *str );
SWIGSTATIC CAML_VALUE caml_val_string_len( const char *str, int len );
SWIGSTATIC long caml_long_val( CAML_VALUE v );
SWIGSTATIC double caml_double_val( CAML_VALUE v );
SWIGSTATIC int caml_ptr_val_internal( CAML_VALUE v, void **out,
swig_type_info *descriptor );
SWIGSTATIC void *caml_ptr_val( CAML_VALUE v, swig_type_info *descriptor );
SWIGSTATIC char *caml_string_val( CAML_VALUE v );
SWIGSTATIC int caml_string_len( CAML_VALUE v );
#ifdef __cplusplus
}
#endif
/* mzschemedec.swg ends here */
@@ -0,0 +1,64 @@
#ifndef OCAML_OCAMLKW_SWG_
#define OCAML_OCAMLKW_SWG_
/* Warnings for Ocaml keywords */
#define OCAMLKW(x) %namewarn("314:" #x " is a ocaml keyword and it will properly renamed") #x
/*
from
http://caml.inria.fr/ocaml/htmlman/manual044.html
*/
OCAMLKW(and);
OCAMLKW(as);
OCAMLKW(assert);
OCAMLKW(begin);
OCAMLKW(class);
OCAMLKW(constraint);
OCAMLKW(do);
OCAMLKW(done);
OCAMLKW(downto);
OCAMLKW(else);
OCAMLKW(end);
OCAMLKW(exception);
OCAMLKW(external);
OCAMLKW(false);
OCAMLKW(for);
OCAMLKW(fun);
OCAMLKW(function);
OCAMLKW(functor);
OCAMLKW(if);
OCAMLKW(in);
OCAMLKW(include);
OCAMLKW(inherit);
OCAMLKW(initializer);
OCAMLKW(lazy);
OCAMLKW(let);
OCAMLKW(match);
OCAMLKW(method);
OCAMLKW(module);
OCAMLKW(mutable);
OCAMLKW(new);
OCAMLKW(object);
OCAMLKW(of);
OCAMLKW(open);
OCAMLKW(or);
OCAMLKW(private);
OCAMLKW(rec);
OCAMLKW(sig);
OCAMLKW(struct);
OCAMLKW(then);
OCAMLKW(to);
OCAMLKW(true);
OCAMLKW(try);
OCAMLKW(type);
OCAMLKW(val);
OCAMLKW(virtual);
OCAMLKW(when);
OCAMLKW(while);
OCAMLKW(with);
#undef OCAMLKW
#endif //OCAML_OCAMLKW_SWG_
@@ -0,0 +1,17 @@
%insert(mli) %{
exception BadArgs of string
exception BadMethodName of c_obj * string * string
exception NotObject of c_obj
exception NotEnumType of c_obj
exception LabelNotFromThisEnum of c_obj
exception InvalidDirectorCall of c_obj
%}
%insert(ml) %{
exception BadArgs of string
exception BadMethodName of c_obj * string * string
exception NotObject of c_obj
exception NotEnumType of c_obj
exception LabelNotFromThisEnum of c_obj
exception InvalidDirectorCall of c_obj
%}
@@ -0,0 +1,22 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* std_common.i
*
* SWIG typemaps for STL - common utilities
* ----------------------------------------------------------------------------- */
%include <std/std_except.i>
%apply size_t { std::size_t };
%{
#include <string>
CAML_VALUE SwigString_FromString(const std::string& s) {
return caml_val_string((char *)s.c_str());
}
std::string SwigString_AsString(CAML_VALUE o) {
return std::string((char *)caml_ptr_val(o,0));
}
%}
@@ -0,0 +1,65 @@
// -*- C++ -*-
#ifndef SWIG_STD_COMPLEX_I_
#define SWIG_STD_COMPLEX_I_
#ifdef SWIG
%{
#include <complex>
%}
namespace std
{
template <class T> class complex;
%define specialize_std_complex(T)
%typemap(in) complex<T> {
if (PyComplex_Check($input)) {
$1 = std::complex<T>(PyComplex_RealAsDouble($input),
PyComplex_ImagAsDouble($input));
} else if (PyFloat_Check($input)) {
$1 = std::complex<T>(PyFloat_AsDouble($input), 0);
} else if (PyInt_Check($input)) {
$1 = std::complex<T>(PyInt_AsLong($input), 0);
}
else {
PyErr_SetString(PyExc_TypeError,"Expected a complex");
SWIG_fail;
}
}
%typemap(in) const complex<T>& (std::complex<T> temp) {
if (PyComplex_Check($input)) {
temp = std::complex<T>(PyComplex_RealAsDouble($input),
PyComplex_ImagAsDouble($input));
$1 = &temp;
} else if (PyFloat_Check($input)) {
temp = std::complex<T>(PyFloat_AsDouble($input), 0);
$1 = &temp;
} else if (PyInt_Check($input)) {
temp = std::complex<T>(PyInt_AsLong($input), 0);
$1 = &temp;
} else {
PyErr_SetString(PyExc_TypeError,"Expected a complex");
SWIG_fail;
}
}
%typemap(out) complex<T> {
$result = PyComplex_FromDoubles($1.real(), $1.imag());
}
%typemap(out) const complex<T> & {
$result = PyComplex_FromDoubles($1->real(), $1->imag());
}
%enddef
specialize_std_complex(double);
specialize_std_complex(float);
}
#endif // SWIG
#endif //SWIG_STD_COMPLEX_I_
@@ -0,0 +1,31 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* std_deque.i
*
* Default std_deque wrapper
* ----------------------------------------------------------------------------- */
%module std_deque
%rename(__getitem__) std::deque::getitem;
%rename(__setitem__) std::deque::setitem;
%rename(__delitem__) std::deque::delitem;
%rename(__getslice__) std::deque::getslice;
%rename(__setslice__) std::deque::setslice;
%rename(__delslice__) std::deque::delslice;
%extend std::deque {
int __len__() {
return (int) self->size();
}
int __nonzero__() {
return ! self->empty();
}
void append(const T &x) {
self->push_back(x);
}
};
%include <_std_deque.i>
@@ -0,0 +1,222 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* std_list.i
*
* SWIG typemaps for std::list types
* ----------------------------------------------------------------------------- */
%include <std_common.i>
%module std_list
%{
#include <list>
#include <stdexcept>
%}
namespace std{
template<class T> class list
{
public:
typedef T &reference;
typedef const T& const_reference;
typedef T &iterator;
typedef const T& const_iterator;
list();
list(unsigned int size, const T& value = T());
list(const list<T> &);
~list();
void assign(unsigned int n, const T& value);
void swap(list<T> &x);
const_reference front();
const_reference back();
const_iterator begin();
const_iterator end();
void resize(unsigned int n, T c = T());
bool empty() const;
void push_front(const T& x);
void push_back(const T& x);
void pop_front();
void pop_back();
void clear();
unsigned int size() const;
unsigned int max_size() const;
void resize(unsigned int n, const T& value);
void remove(const T& value);
void unique();
void reverse();
void sort();
%extend
{
const_reference __getitem__(int i) throw (std::out_of_range)
{
std::list<T>::iterator first = self->begin();
int size = int(self->size());
if (i<0) i += size;
if (i>=0 && i<size)
{
for (int k=0;k<i;k++)
{
first++;
}
return *first;
}
else throw std::out_of_range("list index out of range");
}
void __setitem__(int i, const T& x) throw (std::out_of_range)
{
std::list<T>::iterator first = self->begin();
int size = int(self->size());
if (i<0) i += size;
if (i>=0 && i<size)
{
for (int k=0;k<i;k++)
{
first++;
}
*first = x;
}
else throw std::out_of_range("list index out of range");
}
void __delitem__(int i) throw (std::out_of_range)
{
std::list<T>::iterator first = self->begin();
int size = int(self->size());
if (i<0) i += size;
if (i>=0 && i<size)
{
for (int k=0;k<i;k++)
{
first++;
}
self->erase(first);
}
else throw std::out_of_range("list index out of range");
}
std::list<T> __getslice__(int i,int j)
{
std::list<T>::iterator first = self->begin();
std::list<T>::iterator end = self->end();
int size = int(self->size());
if (i<0) i += size;
if (j<0) j += size;
if (i<0) i = 0;
if (j>size) j = size;
if (i>=j) i=j;
if (i>=0 && i<size && j>=0)
{
for (int k=0;k<i;k++)
{
first++;
}
for (int m=0;m<j;m++)
{
end++;
}
std::list<T> tmp(j-i);
if (j>i) std::copy(first,end,tmp.begin());
return tmp;
}
else throw std::out_of_range("list index out of range");
}
void __delslice__(int i,int j)
{
std::list<T>::iterator first = self->begin();
std::list<T>::iterator end = self->end();
int size = int(self->size());
if (i<0) i += size;
if (j<0) j += size;
if (i<0) i = 0;
if (j>size) j = size;
for (int k=0;k<i;k++)
{
first++;
}
for (int m=0;m<=j;m++)
{
end++;
}
self->erase(first,end);
}
void __setslice__(int i,int j, const std::list<T>& v)
{
std::list<T>::iterator first = self->begin();
std::list<T>::iterator end = self->end();
int size = int(self->size());
if (i<0) i += size;
if (j<0) j += size;
if (i<0) i = 0;
if (j>size) j = size;
for (int k=0;k<i;k++)
{
first++;
}
for (int m=0;m<=j;m++)
{
end++;
}
if (int(v.size()) == j-i)
{
std::copy(v.begin(),v.end(),first);
}
else {
self->erase(first,end);
if (i+1 <= int(self->size()))
{
first = self->begin();
for (int k=0;k<i;k++)
{
first++;
}
self->insert(first,v.begin(),v.end());
}
else self->insert(self->end(),v.begin(),v.end());
}
}
unsigned int __len__()
{
return self->size();
}
bool __nonzero__()
{
return !(self->empty());
}
void append(const T& x)
{
self->push_back(x);
}
void pop()
{
self->pop_back();
}
};
};
}
+173
View File
@@ -0,0 +1,173 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* std_map.i
*
* SWIG typemaps for std::map
* ----------------------------------------------------------------------------- */
%include <std_common.i>
// ------------------------------------------------------------------------
// std::map
// ------------------------------------------------------------------------
%{
#include <map>
#include <algorithm>
#include <stdexcept>
%}
// exported class
namespace std {
template<class K, class T> class map {
// add typemaps here
public:
map();
map(const map<K,T> &);
unsigned int size() const;
bool empty() const;
void clear();
%extend {
T& get(const K& key) throw (std::out_of_range) {
std::map<K,T >::iterator i = self->find(key);
if (i != self->end())
return i->second;
else
throw std::out_of_range("key not found");
}
void set(const K& key, const T& x) {
(*self)[key] = x;
}
void del(const K& key) throw (std::out_of_range) {
std::map<K,T >::iterator i = self->find(key);
if (i != self->end())
self->erase(i);
else
throw std::out_of_range("key not found");
}
bool has_key(const K& key) {
std::map<K,T >::iterator i = self->find(key);
return i != self->end();
}
}
};
// specializations for built-ins
%define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO)
template<class T> class map<K,T> {
// add typemaps here
public:
map();
map(const map<K,T> &);
unsigned int size() const;
bool empty() const;
void clear();
%extend {
T& get(K key) throw (std::out_of_range) {
std::map<K,T >::iterator i = self->find(key);
if (i != self->end())
return i->second;
else
throw std::out_of_range("key not found");
}
void set(K key, const T& x) {
(*self)[key] = x;
}
void del(K key) throw (std::out_of_range) {
std::map<K,T >::iterator i = self->find(key);
if (i != self->end())
self->erase(i);
else
throw std::out_of_range("key not found");
}
bool has_key(K key) {
std::map<K,T >::iterator i = self->find(key);
return i != self->end();
}
}
};
%enddef
%define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO)
template<class K> class map<K,T> {
// add typemaps here
public:
map();
map(const map<K,T> &);
unsigned int size() const;
bool empty() const;
void clear();
%extend {
T get(const K& key) throw (std::out_of_range) {
std::map<K,T >::iterator i = self->find(key);
if (i != self->end())
return i->second;
else
throw std::out_of_range("key not found");
}
void set(const K& key, T x) {
(*self)[key] = x;
}
void del(const K& key) throw (std::out_of_range) {
std::map<K,T >::iterator i = self->find(key);
if (i != self->end())
self->erase(i);
else
throw std::out_of_range("key not found");
}
bool has_key(const K& key) {
std::map<K,T >::iterator i = self->find(key);
return i != self->end();
}
}
};
%enddef
%define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO,
T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO)
template<> class map<K,T> {
// add typemaps here
public:
map();
map(const map<K,T> &);
unsigned int size() const;
bool empty() const;
void clear();
%extend {
T get(K key) throw (std::out_of_range) {
std::map<K,T >::iterator i = self->find(key);
if (i != self->end())
return i->second;
else
throw std::out_of_range("key not found");
}
void set(K key, T x) {
(*self)[key] = x;
}
void del(K key) throw (std::out_of_range) {
std::map<K,T >::iterator i = self->find(key);
if (i != self->end())
self->erase(i);
else
throw std::out_of_range("key not found");
}
bool has_key(K key) {
std::map<K,T >::iterator i = self->find(key);
return i != self->end();
}
}
};
%enddef
// add specializations here
}
@@ -0,0 +1,37 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* std_pair.i
*
* SWIG typemaps for std::pair
* ----------------------------------------------------------------------------- */
%include <std_common.i>
%include <exception.i>
// ------------------------------------------------------------------------
// std::pair
// ------------------------------------------------------------------------
%{
#include <utility>
%}
namespace std {
template<class T, class U> struct pair {
pair();
pair(T first, U second);
pair(const pair& p);
template <class U1, class U2> pair(const pair<U1, U2> &p);
T first;
U second;
};
// add specializations here
}
@@ -0,0 +1,179 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* std_string.i
*
* SWIG typemaps for std::string
* ----------------------------------------------------------------------------- */
// ------------------------------------------------------------------------
// std::string is typemapped by value
// This can prevent exporting methods which return a string
// in order for the user to modify it.
// However, I think I'll wait until someone asks for it...
// ------------------------------------------------------------------------
%include <exception.i>
%{
#include <string>
#include <vector>
using std::string;
using std::vector;
%}
%include <std_vector.i>
%naturalvar std::string;
%naturalvar std::wstring;
namespace std {
template <class charT> class basic_string {
public:
typedef charT *pointer;
typedef charT &reference;
typedef const charT &const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
basic_string();
basic_string( charT *str );
size_t size();
charT operator []( int pos ) const;
charT *c_str() const;
basic_string<charT> &operator = ( const basic_string &ws );
basic_string<charT> &operator = ( const charT *str );
basic_string<charT> &append( const basic_string<charT> &other );
basic_string<charT> &append( const charT *str );
void push_back( charT c );
void clear();
void reserve( size_type t );
void resize( size_type n, charT c = charT() );
int compare( const basic_string<charT> &other ) const;
int compare( const charT *str ) const;
basic_string<charT> &insert( size_type pos,
const basic_string<charT> &str );
size_type find( const basic_string<charT> &other, int pos = 0 ) const;
size_type find( charT c, int pos = 0 ) const;
%extend {
bool operator == ( const basic_string<charT> &other ) const {
return self->compare( other ) == 0;
}
bool operator != ( const basic_string<charT> &other ) const {
return self->compare( other ) != 0;
}
bool operator < ( const basic_string<charT> &other ) const {
return self->compare( other ) == -1;
}
bool operator > ( const basic_string<charT> &other ) const {
return self->compare( other ) == 1;
}
bool operator <= ( const basic_string<charT> &other ) const {
return self->compare( other ) != 1;
}
bool operator >= ( const basic_string<charT> &other ) const {
return self->compare( other ) != -1;
}
}
};
%template(string) basic_string<char>;
%template(wstring) basic_string<wchar_t>;
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;
/* Overloading check */
%typemap(in) string {
if (caml_ptr_check($input))
$1.assign((char *)caml_ptr_val($input,0),
caml_string_len($input));
else
SWIG_exception(SWIG_TypeError, "string expected");
}
%typemap(in) const string & (std::string temp) {
if (caml_ptr_check($input)) {
temp.assign((char *)caml_ptr_val($input,0),
caml_string_len($input));
$1 = &temp;
} else {
SWIG_exception(SWIG_TypeError, "string expected");
}
}
%typemap(in) string & (std::string temp) {
if (caml_ptr_check($input)) {
temp.assign((char *)caml_ptr_val($input,0),
caml_string_len($input));
$1 = &temp;
} else {
SWIG_exception(SWIG_TypeError, "string expected");
}
}
%typemap(in) string * (std::string *temp) {
if (caml_ptr_check($input)) {
temp = new std::string((char *)caml_ptr_val($input,0),
caml_string_len($input));
$1 = temp;
} else {
SWIG_exception(SWIG_TypeError, "string expected");
}
}
%typemap(free) string * (std::string *temp) {
delete temp;
}
%typemap(argout) string & {
caml_list_append(swig_result,caml_val_string_len((*$1).c_str(),
(*$1).size()));
}
%typemap(directorout) string {
$result.assign((char *)caml_ptr_val($input,0),
caml_string_len($input));
}
%typemap(out) string {
$result = caml_val_string_len($1.c_str(),$1.size());
}
%typemap(out) string * {
$result = caml_val_string_len((*$1).c_str(),(*$1).size());
}
}
#ifdef ENABLE_CHARPTR_ARRAY
char **c_charptr_array( const std::vector <string > &str_v );
%{
SWIGEXT char **c_charptr_array( const std::vector <string > &str_v ) {
char **out = new char *[str_v.size() + 1];
out[str_v.size()] = 0;
for( int i = 0; i < str_v.size(); i++ ) {
out[i] = (char *)str_v[i].c_str();
}
return out;
}
%}
#endif
#ifdef ENABLE_STRING_VECTOR
%template (StringVector) std::vector<string >;
%insert(ml) %{
(* Some STL convenience items *)
let string_array_to_vector sa =
let nv = _new_StringVector C_void in
array_to_vector nv (fun x -> C_string x) sa ; nv
let c_string_array ar =
_c_charptr_array (string_array_to_vector ar)
%}
%insert(mli) %{
val c_string_array: string array -> c_obj
%}
#endif
@@ -0,0 +1,92 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* std_vector.i
*
* SWIG typemaps for std::vector types
* ----------------------------------------------------------------------------- */
%include <std_common.i>
// ------------------------------------------------------------------------
// std::vector
//
// The aim of all that follows would be to integrate std::vector with
// Python as much as possible, namely, to allow the user to pass and
// be returned Python tuples or lists.
// const declarations are used to guess the intent of the function being
// exported; therefore, the following rationale is applied:
//
// -- f(std::vector<T>), f(const std::vector<T>&), f(const std::vector<T>*):
// the parameter being read-only, either a Python sequence or a
// previously wrapped std::vector<T> can be passed.
// -- f(std::vector<T>&), f(std::vector<T>*):
// the parameter must be modified; therefore, only a wrapped std::vector
// can be passed.
// -- std::vector<T> f():
// the vector is returned by copy; therefore, a Python sequence of T:s
// is returned which is most easily used in other Python functions
// -- std::vector<T>& f(), std::vector<T>* f(), const std::vector<T>& f(),
// const std::vector<T>* f():
// the vector is returned by reference; therefore, a wrapped std::vector
// is returned
// ------------------------------------------------------------------------
%{
#include <vector>
#include <algorithm>
#include <stdexcept>
%}
// exported class
namespace std {
template <class T> class vector {
public:
vector(unsigned int size = 0);
vector(unsigned int size, const T& value);
vector(const vector<T>&);
unsigned int size() const;
bool empty() const;
void clear();
void push_back(const T& x);
T operator [] ( int f );
vector <T> &operator = ( vector <T> &other );
%extend {
void set( int i, const T &x ) {
self->resize(i+1);
(*self)[i] = x;
}
};
%extend {
T *to_array() {
T *array = new T[self->size() + 1];
for( int i = 0; i < self->size(); i++ )
array[i] = (*self)[i];
return array;
}
};
};
};
%insert(ml) %{
let array_to_vector v argcons array =
for i = 0 to (Array.length array) - 1 do
(invoke v) "set" (C_list [ C_int i ; (argcons array.(i)) ])
done ;
v
let vector_to_array v argcons array =
for i = 0; to (get_int ((invoke v) "size" C_void)) - 1 do
array.(i) <- argcons ((invoke v) "[]" (C_int i))
done ;
v
%}
%insert(mli) %{
val array_to_vector : c_obj -> ('a -> c_obj) -> 'a array -> c_obj
val vector_to_array : c_obj -> (c_obj -> 'a) -> 'a array -> c_obj
%}
+15
View File
@@ -0,0 +1,15 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* stl.i
*
* Initial STL definition. extended as needed in each language
* ----------------------------------------------------------------------------- */
%include <std_common.i>
%include <std_string.i>
%include <std_vector.i>
%include <std_map.i>
%include <std_pair.i>
+159
View File
@@ -0,0 +1,159 @@
(* -*- tuareg -*- *)
open Int32
open Int64
type enum = [ `Int of int ]
type 'a c_obj_t =
C_void
| C_bool of bool
| C_char of char
| C_uchar of char
| C_short of int
| C_ushort of int
| C_int of int
| C_uint of int32
| C_int32 of int32
| C_int64 of int64
| C_float of float
| C_double of float
| C_ptr of int64 * int64
| C_array of 'a c_obj_t array
| C_list of 'a c_obj_t list
| C_obj of (string -> 'a c_obj_t -> 'a c_obj_t)
| C_string of string
| C_enum of 'a
| C_director_core of 'a c_obj_t * 'a c_obj_t option ref
type c_obj = enum c_obj_t
exception BadArgs of string
exception BadMethodName of string * string
exception NotObject of c_obj
exception NotEnumType of c_obj
exception LabelNotFromThisEnum of c_obj
exception InvalidDirectorCall of c_obj
exception NoSuchClass of string
let rec invoke obj =
match obj with
C_obj o -> o
| C_director_core (o,r) -> invoke o
| _ -> raise (NotObject (Obj.magic obj))
let _ = Callback.register "swig_runmethod" invoke
let fnhelper arg =
match arg with C_list l -> l | C_void -> [] | _ -> [ arg ]
let rec get_int x =
match x with
C_bool b -> if b then 1 else 0
| C_char c
| C_uchar c -> (int_of_char c)
| C_short s
| C_ushort s
| C_int s -> s
| C_uint u
| C_int32 u -> (Int32.to_int u)
| C_int64 u -> (Int64.to_int u)
| C_float f -> (int_of_float f)
| C_double d -> (int_of_float d)
| C_ptr (p,q) -> (Int64.to_int p)
| C_obj o -> (try (get_int (o "int" C_void))
with _ -> (get_int (o "&" C_void)))
| _ -> raise (Failure "Can't convert to int")
let rec get_float x =
match x with
C_char c
| C_uchar c -> (float_of_int (int_of_char c))
| C_short s -> (float_of_int s)
| C_ushort s -> (float_of_int s)
| C_int s -> (float_of_int s)
| C_uint u
| C_int32 u -> (float_of_int (Int32.to_int u))
| C_int64 u -> (float_of_int (Int64.to_int u))
| C_float f -> f
| C_double d -> d
| C_obj o -> (try (get_float (o "float" C_void))
with _ -> (get_float (o "double" C_void)))
| _ -> raise (Failure "Can't convert to float")
let rec get_char x =
(char_of_int (get_int x))
let rec get_string x =
match x with
C_string str -> str
| _ -> raise (Failure "Can't convert to string")
let rec get_bool x =
match x with
C_bool b -> b
| _ ->
(try if get_int x != 0 then true else false
with _ -> raise (Failure "Can't convert to bool"))
let disown_object obj =
match obj with
C_director_core (o,r) -> r := None
| _ -> raise (Failure "Not a director core object")
let _ = Callback.register "caml_obj_disown" disown_object
let addr_of obj =
match obj with
C_obj _ -> (invoke obj) "&" C_void
| C_director_core (self,r) -> (invoke self) "&" C_void
| C_ptr _ -> obj
| _ -> raise (Failure "Not a pointer.")
let _ = Callback.register "caml_obj_ptr" addr_of
let make_float f = C_float f
let make_double f = C_double f
let make_string s = C_string s
let make_bool b = C_bool b
let make_char c = C_char c
let make_char_i c = C_char (char_of_int c)
let make_uchar c = C_uchar c
let make_uchar_i c = C_uchar (char_of_int c)
let make_short i = C_short i
let make_ushort i = C_ushort i
let make_int i = C_int i
let make_uint i = C_uint (Int32.of_int i)
let make_int32 i = C_int32 (Int32.of_int i)
let make_int64 i = C_int64 (Int64.of_int i)
let new_derived_object cfun x_class args =
begin
let get_object ob =
match !ob with
None ->
raise (NotObject C_void)
| Some o -> o in
let ob_ref = ref None in
let class_fun class_f ob_r =
(fun meth args -> class_f (get_object ob_r) meth args) in
let new_class = class_fun x_class ob_ref in
let dircore = C_director_core (C_obj new_class,ob_ref) in
let obj =
cfun (match args with
C_list argl -> (C_list ((dircore :: argl)))
| C_void -> (C_list [ dircore ])
| a -> (C_list [ dircore ; a ])) in
ob_ref := Some obj ;
obj
end
let swig_current_type_info = ref C_void
let find_type_info obj = !swig_current_type_info
let _ = Callback.register "swig_find_type_info" find_type_info
let set_type_info obj =
match obj with
C_ptr _ -> swig_current_type_info := obj ;
obj
| _ -> raise (Failure "Internal error: passed non pointer to set_type_info")
let _ = Callback.register "swig_set_type_info" set_type_info
let class_master_list = Hashtbl.create 20
let register_class_byname nm co =
Hashtbl.replace class_master_list nm (Obj.magic co)
let create_class nm arg =
try (Obj.magic (Hashtbl.find class_master_list nm)) arg with _ -> raise (NoSuchClass nm)
@@ -0,0 +1,61 @@
(* -*- tuareg -*- *)
type enum = [ `Int of int ]
type 'a c_obj_t =
C_void
| C_bool of bool
| C_char of char
| C_uchar of char
| C_short of int
| C_ushort of int
| C_int of int
| C_uint of int32
| C_int32 of int32
| C_int64 of int64
| C_float of float
| C_double of float
| C_ptr of int64 * int64
| C_array of 'a c_obj_t array
| C_list of 'a c_obj_t list
| C_obj of (string -> 'a c_obj_t -> 'a c_obj_t)
| C_string of string
| C_enum of 'a
| C_director_core of 'a c_obj_t * 'a c_obj_t option ref
type c_obj = enum c_obj_t
exception InvalidDirectorCall of c_obj
exception NoSuchClass of string
val invoke : ('a c_obj_t) -> (string -> 'a c_obj_t -> 'a c_obj_t)
val fnhelper : 'a c_obj_t -> 'a c_obj_t list
val get_int : 'a c_obj_t -> int
val get_float : 'a c_obj_t -> float
val get_string : 'a c_obj_t -> string
val get_char : 'a c_obj_t -> char
val get_bool : 'a c_obj_t -> bool
val make_float : float -> 'a c_obj_t
val make_double : float -> 'a c_obj_t
val make_string : string -> 'a c_obj_t
val make_bool : bool -> 'a c_obj_t
val make_char : char -> 'a c_obj_t
val make_char_i : int -> 'a c_obj_t
val make_uchar : char -> 'a c_obj_t
val make_uchar_i : int -> 'a c_obj_t
val make_short : int -> 'a c_obj_t
val make_ushort : int -> 'a c_obj_t
val make_int : int -> 'a c_obj_t
val make_uint : int -> 'a c_obj_t
val make_int32 : int -> 'a c_obj_t
val make_int64 : int -> 'a c_obj_t
val new_derived_object:
('a c_obj_t -> 'a c_obj_t) ->
('a c_obj_t -> string -> 'a c_obj_t -> 'a c_obj_t) ->
'a c_obj_t -> 'a c_obj_t
val register_class_byname : string -> ('a c_obj_t -> 'a c_obj_t) -> unit
val create_class : string -> 'a c_obj_t -> 'a c_obj_t
@@ -0,0 +1,118 @@
open Pcaml ;;
let lap x y = x :: y
let c_ify e @OCAMLLOC@ =
match e with
<:expr< $int:_$ >> -> <:expr< (C_int $e$) >>
| <:expr< $str:_$ >> -> <:expr< (C_string $e$) >>
| <:expr< $chr:_$ >> -> <:expr< (C_char $e$) >>
| <:expr< $flo:_$ >> -> <:expr< (C_double $e$) >>
| <:expr< True >> -> <:expr< (C_bool $e$) >>
| <:expr< False >> -> <:expr< (C_bool $e$) >>
| _ -> <:expr< $e$ >>
let mk_list args @OCAMLLOC@ f =
let rec mk_list_inner args @OCAMLLOC@ f =
match args with
[] -> <:expr< [] >>
| x :: xs ->
(let @OCAMLLOC@ = MLast.loc_of_expr x in
<:expr< [ ($f x @OCAMLLOC@$) ] @ ($mk_list_inner xs @OCAMLLOC@ f$) >>) in
match args with
[] -> <:expr< (Obj.magic C_void) >>
| [ a ] -> <:expr< (Obj.magic $f a @OCAMLLOC@$) >>
| _ -> <:expr< (Obj.magic (C_list ($mk_list_inner args @OCAMLLOC@ f$))) >>
EXTEND
expr:
[ [ e1 = expr ; "'" ; "[" ; e2 = expr ; "]" ->
<:expr< (invoke $e1$) "[]" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
<:expr< (invoke $e1$) $str:l$ ($mk_list args @OCAMLLOC@ c_ify$) >>
| e1 = expr ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
<:expr< (invoke $e1$) $str:u$ ($mk_list args @OCAMLLOC@ c_ify$) >>
| e1 = expr ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
<:expr< (invoke $e1$) $s$ ($mk_list args @OCAMLLOC@ c_ify$) >>
| e1 = expr ; "'" ; "." ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
<:expr< (invoke $e1$) "()" ($mk_list args @OCAMLLOC@ c_ify$) >>
| e1 = expr ; "'" ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
<:expr< (invoke ((invoke $e1$) "->" C_void)) $str:l$ ($mk_list args @OCAMLLOC@ c_ify$) >>
| e1 = expr ; "'" ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
<:expr< (invoke ((invoke $e1$) "->" C_void)) $str:u$ ($mk_list args @OCAMLLOC@ c_ify$) >>
| e1 = expr ; "'" ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
<:expr< (invoke ((invoke $e1$) "->" C_void)) $s$ ($mk_list args @OCAMLLOC@ c_ify$) >>
| e1 = expr ; "'" ; "++" ->
<:expr< (invoke $e1$) "++" C_void >>
| e1 = expr ; "'" ; "--" ->
<:expr< (invoke $e1$) "--" C_void >>
| e1 = expr ; "'" ; "-" ; e2 = expr ->
<:expr< (invoke $e1$) "-" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "+" ; e2 = expr -> <:expr< (invoke $e1$) "+" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "*" ; e2 = expr -> <:expr< (invoke $e1$) "*" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| "'" ; "&" ; e1 = expr ->
<:expr< (invoke $e1$) "&" C_void >>
| "'" ; "!" ; e1 = expr ->
<:expr< (invoke $e1$) "!" C_void >>
| "'" ; "~" ; e1 = expr ->
<:expr< (invoke $e1$) "~" C_void >>
| e1 = expr ; "'" ; "/" ; e2 = expr ->
<:expr< (invoke $e1$) "/" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "%" ; e2 = expr ->
<:expr< (invoke $e1$) "%" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "lsl" ; e2 = expr ->
<:expr< (invoke $e1$) ("<" ^ "<") (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "lsr" ; e2 = expr ->
<:expr< (invoke $e1$) (">" ^ ">") (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "<" ; e2 = expr ->
<:expr< (invoke $e1$) "<" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "<=" ; e2 = expr ->
<:expr< (invoke $e1$) "<=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; ">" ; e2 = expr ->
<:expr< (invoke $e1$) ">" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; ">=" ; e2 = expr ->
<:expr< (invoke $e1$) ">=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "==" ; e2 = expr ->
<:expr< (invoke $e1$) "==" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "!=" ; e2 = expr ->
<:expr< (invoke $e1$) "!=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "&" ; e2 = expr ->
<:expr< (invoke $e1$) "&" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "^" ; e2 = expr ->
<:expr< (invoke $e1$) "^" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "|" ; e2 = expr ->
<:expr< (invoke $e1$) "|" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "&&" ; e2 = expr ->
<:expr< (invoke $e1$) "&&" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "||" ; e2 = expr ->
<:expr< (invoke $e1$) "||" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "=" ; e2 = expr ->
<:expr< (invoke $e1$) "=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "+=" ; e2 = expr ->
<:expr< (invoke $e1$) "+=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "-=" ; e2 = expr ->
<:expr< (invoke $e1$) "-=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "*=" ; e2 = expr ->
<:expr< (invoke $e1$) "*=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "/=" ; e2 = expr ->
<:expr< (invoke $e1$) "/=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "%=" ; e2 = expr ->
<:expr< (invoke $e1$) "%=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "lsl" ; "=" ; e2 = expr ->
<:expr< (invoke $e1$) ("<" ^ "<=") (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "lsr" ; "=" ; e2 = expr ->
<:expr< (invoke $e1$) (">" ^ ">=") (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "&=" ; e2 = expr ->
<:expr< (invoke $e1$) "&=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "^=" ; e2 = expr ->
<:expr< (invoke $e1$) "^=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| e1 = expr ; "'" ; "|=" ; e2 = expr ->
<:expr< (invoke $e1$) "|=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >>
| "'" ; e = expr -> c_ify e @OCAMLLOC@
| c = expr ; "as" ; id = LIDENT -> <:expr< $lid:"get_" ^ id$ $c$ >>
| c = expr ; "to" ; id = LIDENT -> <:expr< $uid:"C_" ^ id$ $c$ >>
| "`" ; "`" ; l = LIDENT -> <:expr< C_enum `$lid:l$ >>
| "`" ; "`" ; u = UIDENT -> <:expr< C_enum `$uid:u$ >>
| f = expr ; "'" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
<:expr< $f$ ($mk_list args @OCAMLLOC@ c_ify$) >>
] ] ;
END ;;
@@ -0,0 +1,179 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* typecheck.i
*
* Typechecking rules
* ----------------------------------------------------------------------------- */
%typecheck(SWIG_TYPECHECK_INTEGER) char, signed char, const char &, const signed char & {
if( !Is_block($input) ) $1 = 0;
else {
switch( SWIG_Tag_val($input) ) {
case C_char: $1 = 1; break;
default: $1 = 0; break;
}
}
}
%typecheck(SWIG_TYPECHECK_INTEGER) unsigned char, const unsigned char & {
if( !Is_block($input) ) $1 = 0;
else {
switch( SWIG_Tag_val($input) ) {
case C_uchar: $1 = 1; break;
default: $1 = 0; break;
}
}
}
%typecheck(SWIG_TYPECHECK_INTEGER) short, signed short, const short &, const signed short &, wchar_t {
if( !Is_block($input) ) $1 = 0;
else {
switch( SWIG_Tag_val($input) ) {
case C_short: $1 = 1; break;
default: $1 = 0; break;
}
}
}
%typecheck(SWIG_TYPECHECK_INTEGER) unsigned short, const unsigned short & {
if( !Is_block($input) ) $1 = 0;
else {
switch( SWIG_Tag_val($input) ) {
case C_ushort: $1 = 1; break;
default: $1 = 0; break;
}
}
}
// XXX arty
// Will move enum SWIGTYPE later when I figure out what to do with it...
%typecheck(SWIG_TYPECHECK_INTEGER) int, signed int, const int &, const signed int &, enum SWIGTYPE {
if( !Is_block($input) ) $1 = 0;
else {
switch( SWIG_Tag_val($input) ) {
case C_int: $1 = 1; break;
default: $1 = 0; break;
}
}
}
%typecheck(SWIG_TYPECHECK_INTEGER) unsigned int, const unsigned int & {
if( !Is_block($input) ) $1 = 0;
else {
switch( SWIG_Tag_val($input) ) {
case C_uint: $1 = 1; break;
case C_int32: $1 = 1; break;
default: $1 = 0; break;
}
}
}
%typecheck(SWIG_TYPECHECK_INTEGER) long, signed long, unsigned long, long long, signed long long, unsigned long long, const long &, const signed long &, const unsigned long &, const long long &, const signed long long &, const unsigned long long & {
if( !Is_block($input) ) $1 = 0;
else {
switch( SWIG_Tag_val($input) ) {
case C_int64: $1 = 1; break;
default: $1 = 0; break;
}
}
}
%typecheck(SWIG_TYPECHECK_INTEGER) bool, oc_bool, BOOL, const bool &, const oc_bool &, const BOOL & {
if( !Is_block($input) ) $1 = 0;
else {
switch( SWIG_Tag_val($input) ) {
case C_bool: $1 = 1; break;
default: $1 = 0; break;
}
}
}
%typecheck(SWIG_TYPECHECK_DOUBLE) float, const float & {
if( !Is_block($input) ) $1 = 0;
else {
switch( SWIG_Tag_val($input) ) {
case C_float: $1 = 1; break;
default: $1 = 0; break;
}
}
}
%typecheck(SWIG_TYPECHECK_DOUBLE) double, const double & {
if( !Is_block($input) ) $1 = 0;
else {
switch( SWIG_Tag_val($input) ) {
case C_double: $1 = 1; break;
default: $1 = 0; break;
}
}
}
%typecheck(SWIG_TYPECHECK_STRING) char * {
if( !Is_block($input) ) $1 = 0;
else {
switch( SWIG_Tag_val($input) ) {
case C_string: $1 = 1; break;
case C_ptr: {
swig_type_info *typeinfo =
(swig_type_info *)(long)SWIG_Int64_val(SWIG_Field($input,1));
$1 = SWIG_TypeCheck("char *",typeinfo) ||
SWIG_TypeCheck("signed char *",typeinfo) ||
SWIG_TypeCheck("unsigned char *",typeinfo) ||
SWIG_TypeCheck("const char *",typeinfo) ||
SWIG_TypeCheck("const signed char *",typeinfo) ||
SWIG_TypeCheck("const unsigned char *",typeinfo) ||
SWIG_TypeCheck("std::string",typeinfo);
} break;
default: $1 = 0; break;
}
}
}
%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] {
void *ptr;
$1 = !caml_ptr_val_internal($input, &ptr,$descriptor);
}
#if 0
%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE {
void *ptr;
$1 = !caml_ptr_val_internal($input, &ptr, $&1_descriptor);
}
#endif
%typecheck(SWIG_TYPECHECK_VOIDPTR) void * {
void *ptr;
$1 = !caml_ptr_val_internal($input, &ptr, 0);
}
/* ------------------------------------------------------------
* Exception handling
* ------------------------------------------------------------ */
%typemap(throws) int,
long,
short,
unsigned int,
unsigned long,
unsigned short {
SWIG_exception($1,"Thrown exception from C++ (int)");
}
%typemap(throws) SWIGTYPE CLASS {
$&1_ltype temp = new $1_ltype($1);
SWIG_exception((int)temp,"Thrown exception from C++ (object)");
}
%typemap(throws) SWIGTYPE {
(void)$1;
SWIG_exception(0,"Thrown exception from C++ (unknown)");
}
%typemap(throws) char * {
SWIG_exception(0,$1);
}
@@ -0,0 +1,319 @@
/* -----------------------------------------------------------------------------
* See the LICENSE file for information on copyright, usage and redistribution
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
*
* typemaps.i
*
* The Ocaml module handles all types uniformly via typemaps. Here
* are the definitions.
* ----------------------------------------------------------------------------- */
/* Pointers */
%typemap(in) void ""
%typemap(out) void "$result = Val_int(0);"
%typemap(in) void * {
$1 = caml_ptr_val($input,$descriptor);
}
%typemap(varin) void * {
$1 = ($ltype)caml_ptr_val($input,$descriptor);
}
%typemap(out) void * {
$result = caml_val_ptr($1,$descriptor);
}
%typemap(varout) void * {
$result = caml_val_ptr($1,$descriptor);
}
#ifdef __cplusplus
%typemap(in) SWIGTYPE & {
/* %typemap(in) SWIGTYPE & */
$1 = ($ltype) caml_ptr_val($input,$1_descriptor);
}
%typemap(varin) SWIGTYPE & {
/* %typemap(varin) SWIGTYPE & */
$1 = *(($ltype) caml_ptr_val($input,$1_descriptor));
}
%typemap(out) SWIGTYPE & {
/* %typemap(out) SWIGTYPE & */
CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr");
if( fromval ) {
$result = callback(*fromval,caml_val_ptr((void *) &$1,$1_descriptor));
} else {
$result = caml_val_ptr ((void *) &$1,$1_descriptor);
}
}
#if 0
%typemap(argout) SWIGTYPE & {
CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr");
if( fromval ) {
swig_result =
caml_list_append(swig_result,
callback(*fromval,caml_val_ptr((void *) $1,
$1_descriptor)));
} else {
swig_result =
caml_list_append(swig_result,
caml_val_ptr ((void *) $1,$1_descriptor));
}
}
#endif
%typemap(argout) const SWIGTYPE & { }
%typemap(in) SWIGTYPE {
$1 = *(($&1_ltype) caml_ptr_val($input,$&1_descriptor)) ;
}
%typemap(out) SWIGTYPE {
/* %typemap(out) SWIGTYPE */
$&1_ltype temp = new $ltype(($1_ltype &) $1);
CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr");
if( fromval ) {
$result = callback(*fromval,caml_val_ptr((void *)temp,$&1_descriptor));
} else {
$result = caml_val_ptr ((void *)temp,$&1_descriptor);
}
}
#else
%typemap(in) SWIGTYPE {
$1 = *(($&1_ltype) caml_ptr_val($input,$&1_descriptor)) ;
}
%typemap(out) SWIGTYPE {
/* %typemap(out) SWIGTYPE */
void *temp = calloc(1,sizeof($ltype));
CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr");
memmove( temp, &$1, sizeof( $1_type ) );
if( fromval ) {
$result = callback(*fromval,caml_val_ptr((void *)temp,$&1_descriptor));
} else {
$result = caml_val_ptr ((void *)temp,$&1_descriptor);
}
}
%apply SWIGTYPE { const SWIGTYPE & };
#endif
/* The SIMPLE_MAP macro below defines the whole set of typemaps needed
for simple types. */
%define SIMPLE_MAP(C_NAME, C_TO_MZ, MZ_TO_C)
/* In */
%typemap(in) C_NAME {
$1 = MZ_TO_C($input);
}
%typemap(varin) C_NAME {
$1 = MZ_TO_C($input);
}
%typemap(in) C_NAME & ($*1_ltype temp) {
temp = ($*1_ltype) MZ_TO_C($input);
$1 = &temp;
}
%typemap(varin) C_NAME & {
$1 = MZ_TO_C($input);
}
%typemap(directorout) C_NAME {
$1 = MZ_TO_C($input);
}
%typemap(in) C_NAME *INPUT ($*1_ltype temp) {
temp = ($*1_ltype) MZ_TO_C($input);
$1 = &temp;
}
%typemap(in,numinputs=0) C_NAME *OUTPUT ($*1_ltype temp) {
$1 = &temp;
}
/* Out */
%typemap(out) C_NAME {
$result = C_TO_MZ($1);
}
%typemap(varout) C_NAME {
$result = C_TO_MZ($1);
}
%typemap(varout) C_NAME & {
/* %typemap(varout) C_NAME & (generic) */
$result = C_TO_MZ($1);
}
%typemap(argout) C_NAME *OUTPUT {
swig_result = caml_list_append(swig_result,C_TO_MZ((long)*$1));
}
%typemap(out) C_NAME & {
/* %typemap(out) C_NAME & (generic) */
$result = C_TO_MZ(*$1);
}
%typemap(argout) C_NAME & {
swig_result = caml_list_append(swig_result,C_TO_MZ((long)*$1));
}
%typemap(directorin) C_NAME {
args = caml_list_append(args,C_TO_MZ($1_name));
}
%enddef
SIMPLE_MAP(bool, caml_val_bool, caml_long_val);
SIMPLE_MAP(oc_bool, caml_val_bool, caml_long_val);
SIMPLE_MAP(char, caml_val_char, caml_long_val);
SIMPLE_MAP(signed char, caml_val_char, caml_long_val);
SIMPLE_MAP(unsigned char, caml_val_uchar, caml_long_val);
SIMPLE_MAP(int, caml_val_int, caml_long_val);
SIMPLE_MAP(short, caml_val_short, caml_long_val);
SIMPLE_MAP(wchar_t, caml_val_short, caml_long_val);
SIMPLE_MAP(long, caml_val_long, caml_long_val);
SIMPLE_MAP(ptrdiff_t, caml_val_int, caml_long_val);
SIMPLE_MAP(unsigned int, caml_val_uint, caml_long_val);
SIMPLE_MAP(unsigned short, caml_val_ushort, caml_long_val);
SIMPLE_MAP(unsigned long, caml_val_ulong, caml_long_val);
SIMPLE_MAP(size_t, caml_val_int, caml_long_val);
SIMPLE_MAP(float, caml_val_float, caml_double_val);
SIMPLE_MAP(double, caml_val_double, caml_double_val);
SIMPLE_MAP(long long,caml_val_ulong,caml_long_val);
SIMPLE_MAP(unsigned long long,caml_val_ulong,caml_long_val);
/* Void */
%typemap(out) void "$result = Val_unit;";
/* Pass through value */
%typemap (in) value,caml::value,CAML_VALUE "$1=$input;";
%typemap (out) value,caml::value,CAML_VALUE "$result=$1;";
/* Arrays */
%typemap(in) ArrayCarrier * {
$1 = ($ltype)caml_ptr_val($input,$1_descriptor);
}
%typemap(out) ArrayCarrier * {
CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr");
if( fromval ) {
$result = callback(*fromval,caml_val_ptr((void *)$1,$1_descriptor));
} else {
$result = caml_val_ptr ((void *)$1,$1_descriptor);
}
}
#if 0
%include <carray.i>
#endif
/* Handle char arrays as strings */
%define %char_ptr_in(how)
%typemap(how) char *, signed char *, unsigned char * {
/* %typemap(how) char * ... */
$1 = ($ltype)caml_string_val($input);
}
/* Again work around the empty array bound bug */
%typemap(how) char [ANY], signed char [ANY], unsigned char [ANY] {
/* %typemap(how) char [ANY] ... */
char *temp = caml_string_val($input);
strcpy((char *)$1,temp);
/* strncpy would be better but we might not have an array size */
}
%enddef
%char_ptr_in(in);
%char_ptr_in(varin);
%char_ptr_in(directorout);
%define %char_ptr_out(how)
%typemap(how)
char *, signed char *, unsigned char *,
const char *, const signed char *, const unsigned char * {
$result = caml_val_string((char *)$1);
}
/* I'd like to use the length here but can't because it might be empty */
%typemap(how)
char [ANY], signed char [ANY], unsigned char [ANY],
const char [ANY], const signed char [ANY], const unsigned char [ANY] {
$result = caml_val_string((char *)$1);
}
%enddef
%char_ptr_out(out);
%char_ptr_out(varout);
%char_ptr_out(directorin);
%define %swigtype_ptr_in(how)
%typemap(how) SWIGTYPE * {
/* %typemap(how) SWIGTYPE * */
$1 = ($ltype)caml_ptr_val($input,$1_descriptor);
}
%typemap(how) SWIGTYPE (CLASS::*) {
/* %typemap(how) SWIGTYPE (CLASS::*) */
void *v = caml_ptr_val($input,$1_descriptor);
memcpy(& $1, &v, sizeof(v));
}
%enddef
%define %swigtype_ptr_out(how)
%typemap(out) SWIGTYPE * {
/* %typemap(how) SWIGTYPE *, SWIGTYPE (CLASS::*) */
CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr");
if( fromval ) {
$result = callback(*fromval,caml_val_ptr((void *)$1,$1_descriptor));
} else {
$result = caml_val_ptr ((void *)$1,$1_descriptor);
}
}
%typemap(how) SWIGTYPE (CLASS::*) {
/* %typemap(how) SWIGTYPE *, SWIGTYPE (CLASS::*) */
void *v;
memcpy(&v,& $1, sizeof(void *));
$result = caml_val_ptr (v,$1_descriptor);
}
%enddef
%swigtype_ptr_in(in);
%swigtype_ptr_in(varin);
%swigtype_ptr_in(directorout);
%swigtype_ptr_out(out);
%swigtype_ptr_out(varout);
%swigtype_ptr_out(directorin);
%define %swigtype_array_fail(how,msg)
%typemap(how) SWIGTYPE [] {
failwith(msg);
}
%enddef
%swigtype_array_fail(in,"Array arguments for arbitrary types need a typemap");
%swigtype_array_fail(varin,"Assignment to global arrays for arbitrary types need a typemap");
%swigtype_array_fail(out,"Array arguments for arbitrary types need a typemap");
%swigtype_array_fail(varout,"Array variables need a typemap");
%swigtype_array_fail(directorin,"Array results with arbitrary types need a typemap");
%swigtype_array_fail(directorout,"Array arguments with arbitrary types need a typemap");
/* C++ References */
/* Enums */
%define %swig_enum_in(how)
%typemap(how) enum SWIGTYPE {
$1 = ($type)caml_long_val_full($input,"$type_marker");
}
%enddef
%define %swig_enum_out(how)
%typemap(how) enum SWIGTYPE {
$result = callback2(*caml_named_value(SWIG_MODULE "_int_to_enum"),*caml_named_value("$type_marker"),Val_int((int)$1));
}
%enddef
%swig_enum_in(in)
%swig_enum_in(varin)
%swig_enum_in(directorout)
%swig_enum_out(out)
%swig_enum_out(varout)
%swig_enum_out(directorin)
@@ -0,0 +1,2 @@
SWIGEXT void SWIG_init() {
SWIG_InitializeModule(0);