Lua

Lua 스크립트의 함수를 C에서 간편하게 실행하기

behonestar 2015. 3. 30. 17:06



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