swig/Examples/guile/multimap/example.i
Geert Janssens b819d2a91e Drop guilegh interface
All of guile's interface files now use the scm interface.
This should not affect any users. Swig generated code
using the scm interface can be mixed with gh interface
using user code.
It does simplify maintenance of the guile swig code though.
2013-04-28 22:06:24 +02:00

87 lines
2 KiB
OpenEdge ABL

/* File : example.i */
%module example
%{
extern int gcd(int x, int y);
extern int gcdmain(int argc, char *argv[]);
extern int count(char *bytes, int len, char c);
extern void capitalize (char *str, int len);
extern void circle (double cx, double cy);
extern int squareCubed (int n, int *OUTPUT);
%}
%include exception.i
%include typemaps.i
extern int gcd(int x, int y);
%typemap(in) (int argc, char *argv[]) {
int i;
SCM *v;
if (!(SCM_NIMP($input) && SCM_VECTORP($input))) {
SWIG_exception(SWIG_ValueError, "Expecting a vector");
return 0;
}
$1 = SCM_LENGTH($input);
if ($1 == 0) {
SWIG_exception(SWIG_ValueError, "Vector must contain at least 1 element");
}
$2 = (char **) malloc(($1+1)*sizeof(char *));
v = SCM_VELTS($input);
for (i = 0; i < $1; i++) {
if (!(SCM_NIMP(v[i]) && SCM_STRINGP(v[i]))) {
free($2);
SWIG_exception(SWIG_ValueError, "Vector items must be strings");
return 0;
}
$2[i] = SCM_CHARS(v[i]);
}
$2[i] = 0;
}
%typemap(freearg) (int argc, char *argv[]) {
free($2);
}
extern int gcdmain(int argc, char *argv[]);
%typemap(in) (char *bytes, int len) {
if (!(SCM_NIMP($input) && SCM_STRINGP($input))) {
SWIG_exception(SWIG_ValueError, "Expecting a string");
}
$1 = SCM_CHARS($input);
$2 = SCM_LENGTH($input);
}
extern int count(char *bytes, int len, char c);
/* This example shows how to wrap a function that mutates a string */
%typemap(in) (char *str, int len) {
size_t temp;
$1 = SWIG_Guile_scm2newstr($input,&temp);
$2 = temp;
}
/* Return the mutated string as a new object. */
%typemap(argout) (char *str, int len) {
SWIG_APPEND_VALUE(scm_mem2string($1,$2));
if ($1) scm_must_free($1);
}
extern void capitalize(char *str, int len);
/* A multi-valued constraint. Force two arguments to lie
inside the unit circle */
%typemap(check) (double cx, double cy) {
double a = $1*$1 + $2*$2;
if (a > 1.0) {
SWIG_exception(SWIG_ValueError,"$1_name and $2_name must be in unit circle");
}
}
extern void circle(double cx, double cy);