summaryrefslogtreecommitdiff
path: root/Examples/lua/funcptr3/example.i
blob: 319b2274c97977888ecfa388310ac075545289b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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 */
	}
}	

%}