Skip to content

Instantly share code, notes, and snippets.

@SONIC3D
Created April 10, 2014 14:26
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save SONIC3D/10388137 to your computer and use it in GitHub Desktop.
Save SONIC3D/10388137 to your computer and use it in GitHub Desktop.
Return a multidimensional table from C function to lua
/*
Return an array in this structure
http://stackoverflow.com/questions/20173954/how-to-return-a-multidimensional-table-from-c-function-to-lua
In Lua array values usually starts at 1.
{
[1] = { ["field1"] = "1", ["field2"] = "2" , ["field3"] = "3" },
[2] = { ["field1"] = "10" , ["field2"] = "20", ["field3"] = "30" }
}
*/
/* Pushes multidimentional table on top of Lua VM stack. */
int l_push_multidim_table(lua_State *l)
{
/* Creates parent table of size 2 array elements: */
lua_createtable(L, 2, 0);
/* Puts key of the first child table on-top of Lua VM stack: */
lua_pushnumber(L, 1);
/*Creates first child table of size 3 non-array elements: */
lua_createtable(L, 0, 3);
/* Fills the first child table: */
lua_pushnumber(L, 1);
lua_setfield(L, -2, "field1");
lua_pushnumber(L, 2);
/* setfield() pops the value from Lua VM stack. */
lua_setfield(L, -2, "field2");
lua_pushnumber(L, 3);
lua_setfield(L, -2, "field3");
/* Remember, child table is on-top of the stack.
* lua_settable() pops key, value pair from Lua VM stack. */
lua_settable(L, -3);
/* Pushes they key value for the second child table: */
lua_pushnumber(L, 2);
/*Creates second child table of size 3 non-array elements: */
lua_createtable(L, 0, 3);
/* Fills the second child table: */
lua_pushnumber(L, 10);
lua_setfield(L, -2, "field1");
lua_pushnumber(L, 20);
lua_setfield(L, -2, "field2");
lua_pushnumber(L, 30);
lua_setfield(L, -2, "field3");
/* Remember, child table is still on-top of the stack.
* lua_settable pops the key, value pair from Lua VM stack
* And puts child table into the parent. */
lua_settable(L, -3);
/* Returns number of output tables:
* (1 multidimentional) */
return 1;
}
@xiaoniaoyou
Copy link

Thanks! It's helpful!

@999pingGG
Copy link

I find this very useful to understand better the Lua stack and its manipulation functions, thank you.

@aarmn
Copy link

aarmn commented Jul 8, 2022

It's also helpful to see stack content without changing or copying them for debugging purposes in case you were stuck somewhere (credit to SOF members)

void dumpstack(lua_State* L) {
    int top = lua_gettop(L);
    for (int i = 1; i <= top; i++) {
        printf("%d\t%s\t", i, luaL_typename(L, i));
        switch (lua_type(L, i)) {
        case LUA_TNUMBER:
            printf("%g\n", lua_tonumber(L, i));
            break;
        case LUA_TSTRING:
            printf("%s\n", lua_tostring(L, i));
            break;
        case LUA_TBOOLEAN:
            printf("%s\n", (lua_toboolean(L, i) ? "true" : "false"));
            break;
        case LUA_TNIL:
            printf("%s\n", "nil");
            break;
        default:
            printf("%p\n", lua_topointer(L, i));
            break;
        }
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment