#include #include using namespace std; int mywrite(lua_State * L) { int argc = lua_gettop(L); for ( int n = 1; n <= argc; ++n ) { cout << lua_tostring(L, n); } return 0; } int val_handler(lua_State * L) { int argc = lua_gettop(L); cout << "val_handler(): argc = " << argc << endl; lua_getfield(L, -1, "val"); int the_val = lua_tointeger(L, -1); lua_pop(L, 1); cout << "val_handler(): the_val = " << the_val << endl; return 0; } int my_function(lua_State * L) { int argc = lua_gettop(L); cerr << "-- my_function() called with " << argc << " arguments:" << endl; for ( int n = 1; n <= argc; ++n ) { cerr << "-- argument " << n << ": " << lua_tostring(L, n) << endl; } /* construct return value */ lua_newtable(L); lua_pushinteger(L, 42); lua_setfield(L, -2, "val"); lua_pushcfunction(L, val_handler); lua_setfield(L, -2, "func"); return 1; // number of return values } void report_errors(lua_State *L, int status) { if ( status!=0 ) { cerr << "-- " << lua_tostring(L, -1) << endl; lua_pop(L, 1); // remove error message } } int main(int argc, char ** argv) { for ( int n = 1; n < argc; ++n ) { const char * file = argv[n]; lua_State * L = lua_open(); // luaL_openlibs(L); luaL_Reg io_functions[] = { { "write", mywrite }, { NULL, NULL } }; luaL_register(L, "io", io_functions); // make my_function() available to Lua programs lua_register(L, "my_function", my_function); cerr << "-- Loading file: " << file << endl; int s = luaL_loadfile(L, file); if ( s == 0 ) { // execute Lua program s = lua_pcall(L, 0, LUA_MULTRET, 0); } report_errors(L, s); lua_close(L); cerr << endl; } return 0; }