Embedded Lua-Script into C
This weekend, I played around a bit with Lua and C. My aim was to understand the Lua basics, embed the script engine into C and be able to even call a C function from Lua.
With Google and a lot of documentation spread around the web this was a fairly easy task. The result are 2 short files. First file is the C-code main.c which initializes Lua, registers the C-function which will be later called by Lua and then executes the Lua-script. The Lua-script itself just does some prints, calls the C-function and prints the return-value.
I think that the files are nearly self-explaining, so I did not blow up the short files with big comments - if you need help with the Lua-functions, please have a look at the Lua 5.1 Reference Manual.
main.c:
#include <stdlib.h>
#include <stdio.h>
#include <lua5.1/lua.h>
#include <lua5.1/lualib.h>
#include <lua5.1/lauxlib.h>
static int c_hello (lua_State *L) {
int i = 0;
lua_Integer count = lua_tointeger(L, 1); // get first arg from stack
putchar('\n');
for (i = 0; i < count; i++) {
printf(" C: %i. Hello from C\n", i+1);
}
putchar('\n');
lua_pushinteger(L, 1234); // push 1234 to return-stack
return 1; // number of return-args
}
int main(void)
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_pushcfunction(L, c_hello);
lua_setglobal(L, "c_hello");
printf(" C: Starting hello.lua from C\n\n");
if (luaL_dofile(L, "hello.lua")) {
printf("\n C: Lua error: %s\n", lua_tostring(L, -1));
} else {
printf("\n C: Lua code ran OK.\n");
}
lua_close(L);
return 0;
}
hello.lua:
local result = 0
print("Lua: Hello from Lua")
print("Lua: Now I will call a c-function from Lua: c_hello(3)")
result = c_hello(3)
print("Lua: Result from c_hello: " .. result)
print("Lua: Bye from Lua")
My build-environment is Ubuntu 11.04 - if you also use it, you’ll need at least the package liblua5.1-0-dev. To build the code, enter the following line in your shell:
gcc -Wall -Wextra -o main main.c -llua5.1 -ldl -lm
Now you should be able to execute the main binary and get the following output:
C: Starting hello.lua from C
Lua: Hello from Lua
Lua: Now I will call a c-function from Lua: c_hello(3)
C: 1. Hello from C
C: 2. Hello from C
C: 3. Hello from C
Lua: Result from c_hello: 1234
Lua: Bye from Lua
C: Lua code ran OK.
Good luck by playing around with Lua and C.