mirror of https://github.com/swig/swig
95 lines
2.8 KiB
C
95 lines
2.8 KiB
C
/* embed.c a simple test for an embedded interpreter
|
|
|
|
The idea is that we wrapper a few simple function (example.c)
|
|
and write our own app to call it.
|
|
|
|
What it will do is load the wrapped lib, load runme.lua and then call some functions.
|
|
To make life easier, all the printf's have either [C] or [Lua] at the start
|
|
so you can see where they are coming from.
|
|
|
|
We will be using the luaL_dostring()/lua_dostring() function to call into lua
|
|
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include <lua.h>
|
|
#include <lauxlib.h>
|
|
#include <lualib.h>
|
|
|
|
#if LUA_VERSION_NUM > 501
|
|
#define lua_open luaL_newstate
|
|
#endif
|
|
|
|
/* the SWIG wrapped library */
|
|
extern int luaopen_example(lua_State*L);
|
|
|
|
/* a really simple way of calling lua from C
|
|
just give it a lua state & a string to execute
|
|
Unfortunately lua keeps changing its API's.
|
|
In lua 5.0.X it's lua_dostring()
|
|
In lua 5.1.X it's luaL_dostring()
|
|
so we have a few extra compiles
|
|
*/
|
|
int dostring(lua_State *L, char* str) {
|
|
int ok;
|
|
#if (defined(LUA_VERSION_NUM) && (LUA_VERSION_NUM>=501))
|
|
|
|
ok=luaL_dostring(L,str); /* looks like this is lua 5.1.X or later, good */
|
|
#else
|
|
|
|
ok=lua_dostring(L,str); /* might be lua 5.0.x, using lua_dostring */
|
|
#endif
|
|
|
|
if (ok!=0)
|
|
printf("[C] ERROR in dostring: %s\n",lua_tostring(L,-1));
|
|
return ok;
|
|
}
|
|
|
|
|
|
int main(int argc,char* argv[]) {
|
|
lua_State *L;
|
|
int ok;
|
|
printf("[C] Welcome to the simple embedded lua example\n");
|
|
printf("[C] We are in C\n");
|
|
printf("[C] opening a lua state & loading the libraries\n");
|
|
L=lua_open();
|
|
luaopen_base(L);
|
|
luaopen_string(L);
|
|
luaopen_math(L);
|
|
printf("[C] now loading the SWIG wrapped library\n");
|
|
luaopen_example(L);
|
|
printf("[C] all looks ok\n");
|
|
printf("\n");
|
|
if (argc != 2 || argv[1] == NULL || strlen(argv[1]) == 0) {
|
|
printf("[C] ERROR: no lua file given on command line\n");
|
|
exit(3);
|
|
}
|
|
printf("[C] let's load the file '%s'\n", argv[1]);
|
|
printf("[C] any lua code in this file will be executed\n");
|
|
if (luaL_loadfile(L, argv[1]) || lua_pcall(L, 0, 0, 0)) {
|
|
printf("[C] ERROR: cannot run lua file: %s",lua_tostring(L, -1));
|
|
exit(3);
|
|
}
|
|
printf("[C] We are now back in C, all looks ok\n");
|
|
printf("\n");
|
|
printf("[C] let's call the function 'do_tests()'\n");
|
|
ok=dostring(L,"do_tests()");
|
|
printf("[C] We are back in C, the dostring() function returned %d\n",ok);
|
|
printf("\n");
|
|
printf("[C] Let's call lua again, but create an error\n");
|
|
ok=dostring(L,"no_such_function()");
|
|
printf("[C] We are back in C, the dostring() function returned %d\n",ok);
|
|
printf("[C] it should also have returned 1 and printed an error message\n");
|
|
printf("\n");
|
|
printf("[C] Let's call lua again, calling the greeting function\n");
|
|
ok=dostring(L,"call_greeting()");
|
|
printf("[C] This was C=>Lua=>C (getting a bit complex)\n");
|
|
printf("\n");
|
|
printf("[C] all finished, closing the lua state\n");
|
|
lua_close(L);
|
|
return 0;
|
|
}
|