static void _dict_close(Table *t, bool free_root) { if(t == NULL) { return; } int i = 0; for(i=0; i<t->capacity; i++) { TableNode *node = t->node + i; if((Table*)node->value != NULL) { _dict_close((Table*)node->value, true); } } free(t->node); if(free_root) free(t); }
static int dict_open(lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); Table *dict = table_new(); size_t len = lua_rawlen(L,1); size_t i; for(i=1;i<=len;i++) { lua_rawgeti(L, 1, i); if(!_dict_insert(L, dict)) { _dict_close(dict); return luaL_error(L, "illegal parameters in table index %d", i); } lua_pop(L, 1); } g_dict = dict; return 0; }