Calling Lua functions from C

The method for calling Lua functions from C has already been covered in the Loading a Lua file section of this chapter—it's lua_pcall. This time around, we will be using the second and third arguments of the function. As a reminder, the second argument is the number of arguments on the stack for Lua to consume, and the third argument is the number of values we expect Lua to leave on the stack for us.

Let's make an example function in Lua that takes two numbers and returns a linear index into a matrix. Only the Lua code will know the width of the matrix. The Lua code for finding this linear index will look something like this:

num_columns = 7
function GetIndex(row, col)
return row * num_columns + col
end

The preceding Lua function expects two variables to be on the stack: row and col. It will leave one value on the stack. Next, let's create a C wrapper function that has a similar name and signature. This wrapper function is expected to run in a valid Lua context that has loaded the Lua file with the function already defined in the preceding code:

int LinearIndex(lua_State*L, int row, int col) {
// Push the GetIndex function on the stack
lua_getglobal(L, "GetIndex");
// Stack: function (GetIndex)

// Push the row variable on the stack
lua_pushnumber(L, row);
// Stack: function (GetIndex), int (row)

// Push the col variable on the stack
lua_pushnumber(L, col);
// Stack: function (GetIndex), int (row), int (col)

// Pop two arguments off the stack (row & col)
// Call the function on the top of the stack (GetIndex)
// Leave one value on the stack
lua_pcall(L, 2, 1, 0);
// Stack: int (return value of GetIndex)

// Remove the result of GetIndex from the stack
int result = lua_tointeger(L, -1);
lua_pop(L, 1);
// Stack: empty

return result;
}
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.143.203.96