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.