diff options
Diffstat (limited to 'Examples/lua/funcptr3/example.i')
-rw-r--r-- | Examples/lua/funcptr3/example.i | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/Examples/lua/funcptr3/example.i b/Examples/lua/funcptr3/example.i new file mode 100644 index 0000000..319b227 --- /dev/null +++ b/Examples/lua/funcptr3/example.i @@ -0,0 +1,69 @@ +/* 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 */ + } +} + +%} |