Created
April 10, 2014 14:26
-
-
Save SONIC3D/10388137 to your computer and use it in GitHub Desktop.
Return a multidimensional table from C function to lua
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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; | |
} |
I find this very useful to understand better the Lua stack and its manipulation functions, thank you.
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
Thanks! It's helpful!