static int mar_encode_table(lua_State *L, mar_Buffer *buf, size_t *idx, int nowrap) { lua_pushnil(L); while (lua_next(L, -2) != 0) { mar_encode_value(L, buf, -2, idx, nowrap); mar_encode_value(L, buf, -1, idx, nowrap); lua_pop(L, 1); } return 1; }
int mar_encode(lua_State* L) { const unsigned char m = MAR_MAGIC; size_t idx, len; mar_Buffer buf; if (lua_isnone(L, 1)) { lua_pushnil(L); } if (lua_isnone(L, 2)) { lua_pushnil(L); } if (lua_isnil(L, 2)) { lua_newtable(L); lua_replace(L,2); } else if (!lua_istable(L, 2)) { luaL_error(L, "bad argument #2 to encode (expected table)"); } int nowrap=0; if(lua_isboolean(L,3)) { nowrap=lua_toboolean(L,3); lua_remove(L,3); } len = lua_objlen(L, 2); lua_newtable(L); for (idx = 1; idx <= len; idx++) { lua_rawgeti(L, 2, idx); lua_pushinteger(L, idx); lua_rawset(L, SEEN_IDX); } lua_pushvalue(L, 1); buf_init(L, &buf); buf_write(L, (void*)&m, 1, &buf); mar_encode_value(L, &buf, -1, &idx, nowrap); if(nowrap) { lua_pushboolean(L,nowrap); lua_replace(L,3); } lua_pop(L, 1); lua_pushlstring(L, buf.data, buf.head); buf_done(L, &buf); lua_remove(L, SEEN_IDX); return 1; }
int mar_encode(lua_State* L) { const unsigned char m = MAR_MAGIC; size_t idx, len; mar_Buffer buf; if (lua_isnone(L, 1)) { lua_pushnil(L); } if (lua_isnoneornil(L, 2)) { lua_newtable(L); } else if (!lua_istable(L, 2)) { luaL_error(L, "bad argument #2 to encode (expected table)"); } lua_settop(L, 2); len = lua_rawlen(L, 2); lua_newtable(L); for (idx = 1; idx <= len; idx++) { lua_rawgeti(L, 2, idx); if (lua_isnil(L, -1)) { lua_pop(L, 1); continue; } lua_pushinteger(L, idx); lua_rawset(L, SEEN_IDX); } lua_pushvalue(L, 1); buf_init(L, &buf); buf_write(L, (const char*)&m, 1, &buf); mar_encode_value(L, &buf, -1, &idx); lua_pop(L, 1); lua_pushlstring(L, buf.data, buf.head); buf_done(L, &buf); lua_remove(L, SEEN_IDX); return 1; }