Как выполнять операции с таблицей lua из C? - PullRequest
2 голосов
/ 25 июня 2009

Мне нужно выполнить операции над таблицами Lua из C , где таблицы обрабатываются как списки или очереди. В частности, мне нужно вставить элемент в заголовок и удалить элемент head, а другие элементы переместить в соответствии с новым элементом.

Это было бы просто в прямой луа, я бы использовал table.insert и table.remove. Но в C ?

В Lua C api есть функции, такие как lua_settable, но нет эквивалентов для table.insert и table.remove, которые появляются. Похоже, что внутри интерпретатора есть внутренние C функции, называемые tinsert и tremove, но они не являются частью API.

Действительно ли я должен вызывать функцию lua, которая делает это для меня?

Ответы [ 2 ]

4 голосов
/ 25 июня 2009

Я полагаю, что вы можете повторно использовать функции

static int tinsert (lua_State *L)
static int tremove (lua_State *L)

и макрос

#define aux_getn(L,n)   (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))

которые находятся в ltablib.c. Они зависят только от API Lua.

1 голос
/ 26 июня 2009

Код не проверен, но вот набросок. Вы передаете индекс таблицы, а для функции вставки также индекс значения, которое вы хотите вставить. Для удаления значение помещается в стек Lua.

#define getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))

void insert_at_head (lua_State *L, int tbl_idx, int val_idx) {
  int e;
  /* shift elements right to make room */
  for (e = getn(L, tbl_idx) + 1; e > 1; e--) {
    lua_rawgeti(L, tbl_idx, e-1);
    lua_rawseti(L, tbl_idx, e);
  }
  lua_pushvalue(L, val_idx);
  lua_rawseti(L, tbl_idx, 1);
}

void remove_from_head_and_push (lua_State *L, int tbl_idx) {
  int e;
  int n = getn(L, tbl_idx);
  if (n == 0)
    return luaL_error("removed from head of empty list");
  lua_rawgeti(L, tbl_idx, 1);  /* push first element */
  /* shift elements left */
  for (e = 2; e < n; e++)
    lua_rawgeti(L, tbl_idx, e);
    lua_rawseti(L, tbl_idx, e-1);
  }
  lua_pushnil(L, val_idx);
  lua_rawseti(L, tbl_idx, n);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...