Below is the content
of a small library that simulates the behavior of software that produces
asynchronous data. This library is intended to move that data into the
data space of a Lua script.
If the Lua function
that is called in fnCallback is called directly from Lua it works, if it is
called via fnCallback it fails when the table is declared for storage of the
three parameters. (see the console output near the end of this
email)
Appologies for the
length of this, it could not have been made shorter.
-- Essential code
for the cb.dll -----------------------------------
static lua_State *gpLuaState =
0; // Used by callback function to send status to the
script.
static int cbNewData( lua_State * );
void fnCallback( int, int,
int );
static int cbNewData( lua_State *L
)
{
int a, b, c;
a = luaL_checkint( L, 1 );
b = luaL_checkint( L, 2
);
c = luaL_checkint( L, 3 );
fnCallback( a, b, c );
return 0;
}
void fnCallback( int nEvent, int nParam1, int nParam2
)
{
int stat;
if (gpLuaState != 0)
{
lua_getglobal(
gpLuaState, "cbCallback" );
lua_pushinteger( gpLuaState, nEvent
);
lua_pushinteger( gpLuaState, nParam1
);
lua_pushinteger( gpLuaState, nParam2 );
// do the call ( 3 arguments, no return, no error function
)
if (stat = lua_pcall( gpLuaState, 3, 0, 0 ) != 0
)
{
printf("eipCallback failed, code %d -
%s", stat, lua_tostring(gpLuaState,
-1));
lua_pop(gpLuaState,
1);
}
}
else
{
printf("gpLuaState
was not initialized");
}
}
static const luaL_Reg cblib[] = {
{"write",
cbNewData},
{NULL, NULL}
};
LUALIB_API int luaopen_cb (lua_State *L) {
gpLuaState =
L;
/* open library */
luaL_register(L, "cb",
cblib);
return 1;
}
-- Contents of
cbq.lua -----------------------------------
FAILURE = 1
SUCCESS = 0
q = {first = 1,
last = 0,
list={}
}
function cbCallback(event, param1,
param2)
local last = q.last + 1
q.last =
last
print("callback",event, param1,
param2)
print(type(q.list))
print(last)
q.list[last]
=
{}
print(type(q.list[last]))
q.list[last][1]=event
print(q.list[last][1])
q.list[last][2]=param1
print(q.list[last][2])
q.list[last][3]=param2
print(q.list[last][3])
end
function pop()
local first =
q.first
local event, param1, param2
if first >
q.last then
return FAILURE
end
event
= q.list[first][1]
param1 = q.list[first][2]
param2 =
q.list[first][3]
print("pop",event, param1, param2)
q.list[first] = nil
q.first = first
+ 1
return SUCCESS, event, param1,
param2
end
-- Console output of
test ---------------------------------------
Lua 5.1.4
Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require"cb"
>
require"cbq"
>
> -- Direct Use
>
cbCallback(12,13,14)
callback
12 13
14
table
1
table
12
13
14
>
cbCallback(15,16,17)
callback
15 16
17
table
2
table
15
16
17
>
print(pop())
pop 12
13 14
0
12 13 14
>
print(pop())
pop 15
16 17
0
15 16 17
>
print(pop())
1
> --Indirect Use
>
cb.write(18,19,20)
callback
18 19
20
table
3
Thanks in advance
for any suggestions.