C에서 Lua 스크립트의 함수를 호출하는 일반적인 방법은 아래와 같다.
int main(void)
{
int ret = 0;
lua_State *L = init_lua();
if (!L) return 0;
/* function name */
lua_getglobal(L, "add");
/* call function
- argument : 2
- return : 1
*/
lua_pcall(L, 2, 1, 0);
/* get return value */
ret = (int)lua_tointeger(L, -1);
lua_pop(L, 1);
printf("sum : %d\n", ret);
lua_close(L);
return 0;
}
C에서 Lua 스크립트의 함수를 편리하게 실행할 수 있도록 함수로 만들었다. (가변인자 활용)
typedef struct lua_func{
char *func_name;
int arg_num;
int ret_num;
}LUA_FUNC_T;
static const LUA_FUNC_T lua_func_table[] = {
{ "add", 2, 1 },
{ "open_session", 0, 1 },
};
int lua_func(lua_State *L, const char *func_name, ...)
{
int i = 0, ret = 0;
int table_len = sizeof(lua_func_table) / sizeof(LUA_FUNC_T);
LUA_FUNC_T *func = NULL;
for (i = 0; i < table_len; i++)
{
if (!strcmp(lua_func_table[i].func_name, func_name))
func = (LUA_FUNC_T *)&lua_func_table[i];
}
if (!func)
{
printf("there is no function [%s]", func_name);
return -1;
}
/* function name */
lua_getglobal(L, func->func_name);
/* arguments */
if (func->arg_num > 0)
{
va_list ap;
va_start(ap, func_name);
for (i = 0; i < func->arg_num; i++)
{
int func_arg = va_arg(ap, int);
lua_pushnumber(L, func_arg);
}
}
/* call function */
lua_pcall(L, func->arg_num, func->ret_num, 0);
/* get return value */
if (func->ret_num > 0)
{
for (i = 0; i < func->ret_num; i++)
{
ret = (int)lua_tointeger(L, -1);
lua_pop(L, 1);
}
}
return ret;
}
int main(void)
{
int ret = 0;
lua_State *L = init_lua();
if (!L) return 0;
ret = lua_func(L, "add", 100, 200);
printf("sum : %d\n", ret);
ret = lua_func(L, "minus", 300, 200);
printf("minus : %d\n", ret);
lua_close(L);
return 0;
}
'Lua' 카테고리의 다른 글
Lua 스크립트 Visual Studio 개발 환경 구성 (0) | 2015.03.30 |
---|