mirror of https://github.com/swig/swig
70 lines
1.6 KiB
OpenEdge ABL
70 lines
1.6 KiB
OpenEdge ABL
/* File : example.i */
|
|
/*
|
|
This demonstrates how to pass a lua function, into some C code and then call it.
|
|
|
|
There are two examples, the first is as a parameter, the second as a global variable.
|
|
|
|
*/
|
|
%module example
|
|
%{
|
|
#include "example.h"
|
|
%}
|
|
/* the extra wrappers for lua functions, see SWIG/Lib/lua/lua_fnptr.i for more details */
|
|
%include "lua_fnptr.i"
|
|
|
|
/* these are a bunch of C functions which we want to be able to call from lua */
|
|
extern int add(int,int);
|
|
extern int sub(int,int);
|
|
extern int mul(int,int);
|
|
|
|
/* this function takes a lua function as a parameter and calls it.
|
|
As this is takes a lua fn it needs lua code
|
|
*/
|
|
%inline %{
|
|
|
|
int callback(int a, int b, SWIGLUA_FN fn)
|
|
{
|
|
SWIGLUA_FN_GET(fn);
|
|
lua_pushnumber(fn.L,a);
|
|
lua_pushnumber(fn.L,b);
|
|
lua_call(fn.L,2,1); /* 2 in, 1 out */
|
|
return (int)luaL_checknumber(fn.L,-1);
|
|
}
|
|
%}
|
|
|
|
/******************
|
|
Second code uses a stored reference.
|
|
*******************/
|
|
|
|
%inline %{
|
|
/* note: this is not so good to just have it as a raw ref
|
|
people could set anything to this
|
|
a better solution would to be to have a fn which wants a SWIGLUA_FN, then
|
|
checks the type & converts to a SWIGLUA_REF.
|
|
*/
|
|
SWIGLUA_REF the_func={0,0};
|
|
|
|
void call_the_func(int a)
|
|
{
|
|
int i;
|
|
if (the_func.L==0){
|
|
printf("the_func is zero\n");
|
|
return;
|
|
}
|
|
swiglua_ref_get(&the_func);
|
|
if (!lua_isfunction(the_func.L,-1))
|
|
{
|
|
printf("the_func is not a function\n");
|
|
return;
|
|
}
|
|
lua_pop(the_func.L,1); /* tidy stack */
|
|
for(i=0;i<a;i++)
|
|
{
|
|
swiglua_ref_get(&the_func);
|
|
lua_pushnumber(the_func.L,i);
|
|
lua_call(the_func.L,1,0); /* 1 in, 0 out */
|
|
}
|
|
}
|
|
|
|
%}
|