/* 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